Последнее время я не программирую, а рaзгpебаю зaвалы которые оставили до меня покoления программистов. Чтобы внести минимальное декоративное изменение требуется исправить несколько модулей и потратить несопоставимую по сложности работу по выискиванию всех мест, в которые надо внести изменения.
Дело в том, что тем методы, которые допустимы в примерах, олимпиадах и лабах по программированию, совершенно неприемлемы при создании крупных и долгоживущих прикладных программ.
Предлагаю в этой теме публиковать примеры, как не надо программировать на Delphi, что бы потом не было мучительно больно от встречи с теми, кто исправлял твой код.
Всего в теме 421 сообщение
Добавить свое сообщение
Отслеживать это обсуждение 
№ 191 15-04-2008 03:08 |  |
Ответ на »сообщение 190« (Geo)
___________________________
Но это, опять же, не повод категорично запрещать WITH. Можно запрещать его использование для стажера Тема-то, по моему разумению в их адрес в основном и направлена. А иначе всегда можно привести примеры оправданного использования и GOTO и CopyPaste.
№ 190 15-04-2008 02:40 |  |
Ответ на »сообщение 189« (Cepгей Poщин)
___________________________
Увы, это так. Просто элементарно нет достаточного количества ресурсов для обучения в процессе работы. Я нашим тим-лидерам поражаюсь: они мало того, что сами что-то делают, но еще и просматривают результаты своих подчиненных и вылавилвают хотя бы процентов 75 ошибок.
Но это, опять же, не повод категорично запрещать WITH. Можно запрещать его использование для стажера, который еще не доказал, что понимает.
№ 189 15-04-2008 02:22 |  |
Ответ на »сообщение 188« (Geo)
___________________________
А еще лучше не пинать, а тут же двать задание на доработку, которое наглядно продемнострирует эту самую неправильность Хорошо бы, но не в каждой фирме на одного стажора можно выделить трёх мастеров. Обычно наоборот три стажора налепят, спустя год: "Тут уже всё работает, только у юзеров иногда ошибки появляются"...
№ 188 15-04-2008 01:58 |  |
Ответ на »сообщение 187« (Cepгей Poщин)
___________________________
>>> то малоопытные программисты будут хотя бы знать за что их бьют старшие товарищи :)
Малоопытных товарищей нужно пинать за неправильное использование любых конструкций, а не за использование каких-либо отдельных кончтрукций вообще. А еще лучше не пинать, а тут же двать задание на доработку, которое наглядно продемнострирует эту самую неправильность. Вот попыхтит такой товарищ над сосбтвенным неграмотным кодом и на всю жизнь запомнит, что писать надо хорошо. А плохо писать не надо.
№ 187 15-04-2008 01:24 |  |
Ответ на »сообщение 186« (Сергей Хачатуров)
___________________________
можно, но не нужно хаять with Нужно, нужно! Если все высказанные ранее аргументы не натолкнут на определенные мысли, то малоопытные программисты будут хотя бы знать за что их бьют старшие товарищи :)
№ 186 14-04-2008 16:09 |  |
можно, но не нужно хаять with.
кстати я в большинстве случаев пользуюсь всплывающим списком свойств/методов класса к которому обращаюсь, вместо набирания вречную. в случае вложенных with или если свойства объекта with кот-ым что-то делаешь совпадают со свойствами класса (формы), всплывающий список содержит повторяющиеся свойства/методы, что наводит на определенные мысли...
№ 185 14-04-2008 12:51 |  |
Ответ на »сообщение 184« (Cepгей Poщин)
___________________________
>>> Как бы его следовало переписать...
Это элементарно!
repeat
OldShift := Shift;
if CompareFront(Text, MenuKeyCaps[mkcShift]) then Shift := Shift or scShift
else if CompareFront(Text, '^') then Shift := Shift or scCtrl
else if CompareFront(Text, MenuKeyCaps[mkcCtrl]) then Shift := Shift or scCtrl
else if CompareFront(Text, MenuKeyCaps[mkcAlt]) then Shift := Shift or scAlt;
until OldShift = Shift;
Со всеми поквитаюсь, кто мне про GOTO примеры сочинял! ;-) Это я еще не привел пример вынесения части кода в подпрограмму, дабы избежать использования WHILE TRUE DO :D
Ответ на »сообщение 183« (panda)
___________________________
>>> К Exit Ваше отношение тоже относится?
Собственно, дело не в том, какой там будет выход. Просто сам цикл WHILE TRUE DO или REPEAT UNTIL FALSE вызывают некоторое отторжение. Потому что это уже не цикл, а тот самый скрытый GOTO. Цикл все же подразумевает условие завершения, которое в таких конструкциях отсутствует.
Хотя и самому приходилось такие циклы использовать. Но по возможности стараюсь перестроить код так, чтобы их избежать.
№ 184 14-04-2008 08:52 |  |
Ответ на »сообщение 181« (Geo)
___________________________
Тем не менее это довольно распространенная конструкция в delph'овых первоисточниках: while True do
begin
if CompareFront(Text, MenuKeyCaps[mkcShift]) then Shift := Shift or scShift
else if CompareFront(Text, '^') then Shift := Shift or scCtrl
else if CompareFront(Text, MenuKeyCaps[mkcCtrl]) then Shift := Shift or scCtrl
else if CompareFront(Text, MenuKeyCaps[mkcAlt]) then Shift := Shift or scAlt
else Break;
end; Как бы его следовало переписать...
№ 183 14-04-2008 08:42 |  |
Ответ на »сообщение 181« (Geo)
___________________________
К Exit Ваше отношение тоже относится?
Близко, но несколько не в тему: недавно писал генератор на Python. Специально убрал управляющий флаг и поставил while True (выходы по return и yield). На мой взгляд очень даже симпатично получилось - сразу видно, что есть цикл формирования последовательности, условие возврата очередного значения и условие выхода из цикла формирования. Причем отказ от флага позволил сделать условия равнозначными:
def GenerateNextValue() :
while True :
UserChoice = SelectValue(...)
if UserChioce.Button == SelectButton :
SelectedValue = UserChoice.Value
yield SelectedValue
else :
return
№ 182 14-04-2008 07:16 |  |
to Green:
>>> Так все-таки "не помню" или "не копался"? :)
Конструкцию WITH я начал осваивать очень давно. И, наверняка, у меня при этом были грабли. Но задавностью лет уже не помню. А в более позднее время ошибок больше не делал.
А не копался я в обоснованиях, почему WITH плохой.
Добавить свое сообщение
Отслеживать это обсуждение 
Дополнительная навигация: |
|