Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2017.08.13;
Скачать: [xml.tar.bz2];

Вниз

Как вы относитесь к использованию меток в Delphi?   Найти похожие ветки 

 
SergP ©   (2016-05-20 18:25) [0]

Сабж...
Первый раз в жизни вместо написания лишних строк решил применить метку.
Теперь меня интересует насколько это нехорошо?
Как вы относитесь к использованию меток, например в таком коде:

...        
       bitmove:=1;
       while field<>0 do
       begin
         if (bitmove and field) = bitmove then
         begin
           field:=field xor bitmove;
           for z:=0 to workseccount-1 do if secarr[z].field=bitmove then goto lbskip;
           secarr[workseccount].field:=bitmove;
           secarr[WorksecCount].mt:=mt;
           inc(workseccount);
lbskip:   end;
         bitmove:=bitmove shl 1;
       end;
...


?


 
Pavia ©   (2016-05-20 18:46) [1]

Сразу бросается в глаза неправильная разложение на функции. В одной функции 2 условных оператора и 2 цикл и так понимаю ещё под многоточием много неправильного кода.

Внутренний цикл надо вынести в отдельную функцию и обозвать что-то типа Pos или  Search.  

Зачем это нужно? Вот вы скажете для красоты. Кто-то скажет что такой код становиться само документированным и его проще читать.  Но я скажу следующее.  Элементарные функции проще проверить. Причем такую проверку можно поручить и автоматическим тестам.


 
Inovet ©   (2016-05-20 18:46) [2]

Хоть где - нейтрально, лишь бы не говнокод был.


 
NoUser ©   (2016-05-20 19:43) [3]

> вместо написания лишних строк
и много сэкономлено?

> в таком коде: ...
плохо.

func/proc
...
function lbskip:Boolean; begin for z := 0 to workseccount-1 do if (secarr[z].field = bitmove) then Exit(True); Exit(False); end; // ))
...
begin
...
 if (not lbskip) then begin
   secarr[workseccount].field := bitmove;
   secarr[WorksecCount].mt := mt;
   inc(workseccount);
 end;
...
end;


 
Dimka Maslov ©   (2016-05-20 20:31) [4]

Метки воплне допустимы там, где это помогает упростить код.


 
SergP ©   (2016-05-20 20:54) [5]


> NoUser ©   (20.05.16 19:43) [3]


Ну это мне нравится, но:


> Exit(True); Exit(False);


Delphi 7 такого не знает


> Pavia ©   (20.05.16 18:46) [1]
>
> Сразу бросается в глаза неправильная разложение на функции.
>  В одной функции 2 условных оператора и 2 цикл и так понимаю
> ещё под многоточием много неправильного кода.

Вы предлагаете каждый цикл или условный оператор выносить в отдельную функцию? Да тогда в функциях запутаешься... Я конечно выношу иногда код в отдельные функции, если в одной он уж слишком вложенный и навороченный получается, но когда код функцию можно полностью видеть на экране без использования скроллинга и когда без напряжения видно какой end какому begin"у соответствует (в данном случае функция у меня  в 40 строк с 3 вложенными циклами и 6 условными операторами), то такую функцию, я считаю, разбивать на части обычно не стОит.


 
SergP ©   (2016-05-20 20:56) [6]


> NoUser ©   (20.05.16 19:43) [3]
>
> > вместо написания лишних строк
> и много сэкономлено?


1 переменная, с предварительной инициализацией, begin, end и 1 условный оператор.


 
Pavia ©   (2016-05-20 22:14) [7]


> Вы предлагаете каждый цикл или условный оператор выносить
> в отдельную функцию?

В абсолют возводят только юноши. Жизнь она не только черная или белая она имеет оттенки серого.
Но, грубо говоря да каждый в своя функцию.
Если идут 2-3 последовательных цикла, то разбиваю на функции/процедуры.

Пробовал разбивать и вложенные циклы, чёрти-что получается. Поэтому сейчас допускаю, но не более 2-х.


>  (в данном случае функция у меня  в 40 строк с 3 вложенными
> циклами и 6 условными операторами), то такую функцию, я
> считаю, разбивать на части обычно не стОит.

У меня средняя длина функции 15 строк. От function до end включая пустые строки.

Гораздо проще разбить подозрительную функцию на кучу простых и забыть о отладчике. Гораздо быстрее набить 5-10 функций. Чем  отладить одну большую. С моей скоростью (250 ударов/мин) я эти функции наберу за 5-10 минут, против полчаса-час потраченного в пошаговой отладке.    
При таком подходи, надобность в метках отпадает сама-собой.


> Да тогда в функциях запутаешься...

Ни чуть. Правильные названия позволяет не заглядывать во внутрь функций.


 
KilkennyCat ©   (2016-05-20 23:23) [8]


>  Гораздо быстрее набить 5-10 функций.

Каждый вызов функции затратен.


 
DayGaykin ©   (2016-05-21 04:04) [9]


> Pavia ©   (20.05.16 22:14) [7]

Если функция нужна только в одном месте - я не разбиваю. Смысла не вижу.
Если в нескольких, то чрезмерное разбиение + желание потом немного изменить одну из функций может привести к проблемам. А в теории, так как вы говорите - самодокументирование и простота отладки.
Соглашусь с [2]


 
Eraser ©   (2016-05-21 04:07) [10]


> SergP ©   (20.05.16 18:25) 

негативно. так как в наше время метки встречаются крайне редко, мозг хуже воспринимает данную конструкцию, чревато ошибками.


 
K-1000 ©   (2016-05-21 06:26) [11]

Нужно без них.


 
SergP ©   (2016-05-21 09:00) [12]


> Inovet ©   (20.05.16 18:46) [2]
>
> Хоть где - нейтрально, лишь бы не говнокод был.



> Dimka Maslov ©   (20.05.16 20:31) [4]
>
> Метки воплне допустимы там, где это помогает упростить код.



> DayGaykin ©   (21.05.16 04:04) [9]
>
> Соглашусь с [2]



> Eraser ©   (21.05.16 04:07) [10]
>
> негативно. так как в наше время метки встречаются крайне
> редко, мозг хуже воспринимает данную конструкцию, чревато
> ошибками.



> K-1000 ©   (21.05.16 06:26) [11]
>
> Нужно без них.


Т.е. получается что единого мнения по этому поводу нет?
Данный код пишется чисто для себя, навряд-ли он попадет к кому-то другому, разве что в виде .exe
Но просто хочется не вырабатывать у себя вредные привычки (если они действительно считаются вредными), а то потом избавиться от них не всегда просто.


 
KilkennyCat ©   (2016-05-21 09:28) [13]


> так как в наше время метки встречаются крайне редко, мозг
> хуже воспринимает данную конструкцию

забавная причина-следствие


 
Dimka Maslov ©   (2016-05-21 09:49) [14]


> Т.е. получается что единого мнения по этому поводу нет?


Конечно же нет. Постоянное использование меток - действительно плохо. Но когда на один и тот же участок кода надо прийти из нескольких мест - метка куда как проще.


 
Внук ©   (2016-05-21 10:31) [15]

Сейчас придет Шевченко, и скажет, что за такой код положен эцих с гвоздями с занесением перед строем.
И я подпишусь.


 
DayGaykin ©   (2016-05-21 12:04) [16]

Мне нравятся метки в Java. Там это не воспринимается плохо, хотя встречается тоже редко.


 
DVM ©   (2016-05-21 16:19) [17]

Вот удивительно, метки это значит очень плохо, а вот, например, замыкания - это хорошо, это добавляет читаемости коду? Однако чем то плохим не считается.


 
Юрий Зотов ©   (2016-05-21 18:42) [18]

К использованию меток отношусь спокойно. К неиспользованию - тоже спокойно. Главное - не делать из этого религии.

Важны не метки (или их отсутствие), а читабельность кода. Бывают случаи, когда метки ухудшают читабельность, но бывает и когда улучшают (правда, редко).


 
KilkennyCat ©   (2016-05-21 19:26) [19]

Главное - чтобы костюмчик сидел! а программа - работала.


 
Германн ©   (2016-05-22 01:15) [20]

В принципе против меток возражений не имею. В ассемблере без меток вообще никак не обойтись. В Паскале обойтись без них можно и желательно.
Сам когда-то использовал метки в одной из своих программ (поскольку решил что так код будет короче и понятней, но теперь тоже сам не могу в нем разобраться. :)


 
Тимохов Дима ©   (2016-05-24 02:09) [21]

Иногда можно.
Использовал один раз.


 
dmk ©   (2016-05-24 11:00) [22]

А ведь можно внутри while еще один while сделать или repeat. Тогда просто break.
Пользовался метками. Потом все снес. Сейчас метки только в ассемблере.


 
Юрий Зотов ©   (2016-05-24 12:42) [23]

> dmk ©   (24.05.16 11:00) [22]

> А ведь можно внутри while еще один while сделать или repeat.
> Тогда просто break.

Не всегда. Недавно столкнулся примерно с такой ситуацией:

while ... do
begin
 while ... do
 begin
   ...
   if ... then
   // Здесь нужно прервать ВНЕШНИЙ цикл. Break не прокатывает.
  goto lbl; // А вот goto - прокатывает. Просто, читабельно и элегантно.
 end;
end;
lbl: ...


 
dmk ©   (2016-05-24 13:01) [24]

Да я не против меток, тем более в асме они повсюду ).
Где то на просторах нэта читал, что мол goto упразднят. Подумал, подумал и избавился от меток. А goto так и не убрали из языка. Кругом обман.


 
Jeer ©   (2016-05-24 17:49) [25]

В целом - отрицательно.
Но, иногда, использую реинкарнацию процедур и функций из, скажем, Фортрана.
Дабы не корежить все - использую.


 
K-1000 ©   (2016-05-24 21:55) [26]

Если нужно выйти из нескольких циклов, я бы сделал бы выход из подпроцедуры.


 
KilkennyCat ©   (2016-05-24 23:22) [27]

неиспользование GOTO - это из серии Argumentum ad verecundiam - вид ошибочной логической аргументации — предложение считать некоторое утверждение корректным потому, что такое утверждение сделано неким источником, считающимся авторитетным (wiki), то есть, один гуру брякнул исходя из своей субъективной нелюбви, остальные бездумно подхватили. Ни одного достойного, объективного аргумента, доказывающего вред сего, нет.


 
Юрий Зотов ©   (2016-05-25 00:35) [28]

> K-1000 ©   (24.05.16 21:55) [26]

Можно и процедуру. Можно придумать еще десяток способов. Но ни один из них по простоте, читабельности и накладным расходам не сравнится с [23].

Особенно если немного изменить задачу. Допустим, требуется не прервать внеший цикл, а выйти на какой-то оператор ПЕРЕД его началом.


 
Kerk ©   (2016-05-25 01:03) [29]

Читабельность субъективна. Любой код с goto менее читабелен, чем вариант без goto. Просто за счет того, что этот оператор очень редко используется. Приходится спотыкаться о него взглядом и думать чего же там хочет автор.

Код из начала ветки - яркий пример. Приходится его в голове повертеть, чтобы понять что имел ввиду автор. Альтернатива же без goto воспринимается сходу. Просто за счет привычки.


 
Германн ©   (2016-05-25 01:40) [30]


> Kerk ©   (25.05.16 01:03) [29]
>
> Читабельность субъективна. Любой код с goto менее читабелен,
>  чем вариант без goto. Просто за счет того, что этот оператор
> очень редко используется. Приходится спотыкаться о него
> взглядом и думать чего же там хочет автор.
>

Да. Для тех кто его никогда не применял.
Для тех, кто применял и знает с чем его кушать - пример Юрий Зотов ©   (24.05.16 12:42) [23]


 
Kerk ©   (2016-05-25 01:42) [31]


> Германн ©   (25.05.16 01:40) [30]

Предлагаю прочитать мой комментарий еще раз целиком :)


 
Kerk ©   (2016-05-25 01:47) [32]

Код нужно писать таким образом, чтобы в каждый момент можно было держать в голове как можно меньше информации. В примере из [23] человек наткнувшийся на метку будет вынужден выяснять "а кто это у нас сюда прыгает?". Код после цикла сразу же перестает быть просто кодом, который выполняется после цикла. Линейность восприятия теряется. Появляется никому не нужная сложность.


 
Германн ©   (2016-05-25 01:52) [33]


> Kerk ©   (25.05.16 01:42) [31]
>
>
> > Германн ©   (25.05.16 01:40) [30]
>
> Предлагаю прочитать мой комментарий еще раз целиком :)
>

Предлагаю прочитать и мой комментарий ещё раз целиком.
А так же и ответы ЮЗ.
Чем "лесенка" кода уже, тем она лучше.


 
Юрий Зотов ©   (2016-05-25 01:54) [34]

> человек наткнувшийся на метку будет вынужден выяснять "а
> кто это у нас сюда прыгает?".


Возле метки пишем краткий коммент - и проблема исчезла.

Кстати, ставить подобные краткие комменты по ходу выполнения прикладного функционала - тоже не вредно. Сильно облегчает понимание чужого кода, например. Или даже своего, через пару лет.


 
Юрий Зотов ©   (2016-05-25 01:58) [35]

> Возле метки пишем краткий коммент - и проблема исчезла.

Еще лучше - дать метке осмысленное имя. Тогда и коммент может не потребоваться, метка сама все о себе скажет.


 
Kerk ©   (2016-05-25 01:59) [36]


> Юрий Зотов ©   (25.05.16 01:54) [34]
>
> > человек наткнувшийся на метку будет вынужден выяснять "а
> > кто это у нас сюда прыгает?".
>
> Возле метки пишем краткий коммент - и проблема исчезла.

Об этом и речь. Комментарий написать конечно можно. Но сама необходимость написать комментарий как бы намекает нам, что с читаемостью не все в порядке.

> ставить подобные краткие комменты по ходу выполнения прикладного
> функционала - тоже не вредно

Это совсем другое. Goto и метки - это не прикладной функционал.


 
Kerk ©   (2016-05-25 02:01) [37]


> Юрий Зотов ©   (25.05.16 01:58) [35]
>
> > Возле метки пишем краткий коммент - и проблема исчезла.
>
> Еще лучше - дать метке осмысленное имя.

Ну это еще куда ни шло :)

Но все равно я против goto. В основном по причинам описанным в [29]. Очень редко используется, а потому спотыкаешься взглядом и ищешь в чем подвох. Неприятное ощущение.


 
Германн ©   (2016-05-25 02:07) [38]


> Kerk ©   (25.05.16 01:59) [36]
>
>
> > Юрий Зотов ©   (25.05.16 01:54) [34]
> >
> > > человек наткнувшийся на метку будет вынужден выяснять
> "а
> > > кто это у нас сюда прыгает?".
> >
> > Возле метки пишем краткий коммент - и проблема исчезла.
>
>
> Об этом и речь. Комментарий написать конечно можно. Но сама
> необходимость написать комментарий как бы намекает нам,
> что с читаемостью не все в порядке.

Можно подумать что с читаемостью длинной и широкой простыни, которая не использует goto проблем не будет.


 
Юрий Зотов ©   (2016-05-25 02:09) [39]

> Kerk ©   (25.05.16 02:01) [37]

Дело привычки, всего лишь.

Конечно, я против злоупотребления метками в ЯВУ (асм не в счет). Но если метка единственная, на нее идет только один переход, а сама метка стоит рядом с goto - то все в порядке.


 
Германн ©   (2016-05-25 02:10) [40]


> Kerk ©   (25.05.16 02:01) [37]
>
>
> > Юрий Зотов ©   (25.05.16 01:58) [35]
> >
> > > Возле метки пишем краткий коммент - и проблема исчезла.
>
> >
> > Еще лучше - дать метке осмысленное имя.
>
> Ну это еще куда ни шло :)
>
> Но все равно я против goto

А мы тебе его и не навязываем. :)



Страницы: 1 2 3 4 вся ветка

Форум: "Прочее";
Текущий архив: 2017.08.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.004 c
2-1443091187
Andrey K
2015-09-24 13:39
2017.08.13
Как заблокировать клавишу?


2-1427136740
NovichoK2
2015-03-23 21:52
2017.08.13
освобождение строковых параметров класса


2-1422502870
Drowsy
2015-01-29 06:41
2017.08.13
Вычисляемые поля ДатаСета.


15-1463757911
SergP
2016-05-20 18:25
2017.08.13
Как вы относитесь к использованию меток в Delphi?


15-1464384606
Юрий
2016-05-28 00:30
2017.08.13
С днем рождения ! 28 мая 2016 суббота





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский