Последнее время я не программирую, а рaзгpебаю зaвалы которые оставили до меня покoления программистов. Чтобы внести минимальное декоративное изменение требуется исправить несколько модулей и потратить несопоставимую по сложности работу по выискиванию всех мест, в которые надо внести изменения.
Дело в том, что тем методы, которые допустимы в примерах, олимпиадах и лабах по программированию, совершенно неприемлемы при создании крупных и долгоживущих прикладных программ.
Предлагаю в этой теме публиковать примеры, как не надо программировать на Delphi, что бы потом не было мучительно больно от встречи с теми, кто исправлял твой код.
Всего в теме 421 сообщение
Добавить свое сообщение
Отслеживать это обсуждение 
№ 181 14-04-2008 07:11 |  |
Навеяно обсуждением в »вопрос КС №61249«
Вот что я действительно не люблю (именно на уровне чувств), так это конструкции вида
while true do
begin
if SomeCondition then Break;
end;
или
repeat
if SomeCondition then Break;
until false;
Когда человек реализует такое через GOTO, то он, как бы, явно признается, что не сумел правильно спроектировать цикл. А здесь, вроде бы, все правильно написано: честный цикл вместо "запрещенного" GOTO. А смысл остается тот же самый: человек не сумел правильно спроектировать цикл.
№ 180 20-03-2008 06:08 |  |
Ответ на »сообщение 179« (Cepгей Poщин)
___________________________
А можно DFM хранить в той же БД. Про это, если я ничего не путаю, еще Толик Тенцер писал в конце 1990-х гг.
№ 179 20-03-2008 05:59 |  |
Что-то не в ту степь нас занесло...
Попробую сформулировать еще одну распространенную концептуальную ошибку.
Допустим есть в БД таблица, которую надо заполнять из формы (допустим с гридом, навигатором, статусной панелью). Прежде чем привычным движением вызывать пункт меню "New Form", и лихорадочно "кидать батоны", подумайте: неужели все формы в вашем проекте настолько уникальны, что их необходимо создавать с нуля. Даже если в вашей БД только одна таблица, через год их может стать 10. В результате будем иметь кучу форм всех цветов и размеров, в каждой форме увековечена неповторимая индивидуальность каждого программиста. Допустим решили добавить параметр запуска приложения (типа readonly), попробуйте переправьте весь этот зверинец, так, что бы при наличии этого параметра нельзя было редактировать все данные. Ну допусти даже переправили, а ваш последователь разумееся и знать не будет об этом параметре и опять создаст новую форму без такой возможности.
Бывает и другая крайность:
Создаётся одна форма редактирования справочника на все случаи жизни в которой меняется только имя таблицы, всё вроде бы нормально пока процесс редактирования абсолютно однотипный, но с течением времени для разных таблиц появятся разные исключения, особенности, дополнения (типа если поле A = 1, то поле Б = 2 и недоступно для редактирования), получаем монструальный модуль содержащий огромное количество проверок "Если в таблице XXX есть поле A, то..."
Есть еще гибридный вариант сочетающий в себе всё худшее из первых двух:
Одна форма, на которой лежит 10 гридов (один поверх другого), 10 DataSet`ов и т.д., в зависимости от каких-то условий одно скрывается, другое отображается. 10 поколений программеров тщетно пытались разобраться, в результате приляпали что-то от себя со словами "не дыши, а то всё развалится".
Резюме:
Создайте один общий предок, наделите его общей функциональностью, по мере необходимости расширяйте её, все остальные формы создавайте на основе этой формы "New...".
Его же можно добавить в репозитарий (пункт контектного меню IDE "Add to Repository"), и использовать в новых проектах.
№ 178 20-03-2008 04:02 |  |
Не скажу, как делать это на Делфи, но на Си++ очень даже можно отслеживать изменения версии классов, хидеров и реализаций с помощью #define version или static unsigned int version(). Это может быть полезно, чтобы автоматом исключать ошибки сборки (юнит тестов и прочего) как следствие экономить время, а также контролировать версии зависимостей. Так часто бывать так: автор применил изменения, а проблемы в использующий его классах проявились через некоторое время.
№ 177 19-03-2008 08:43 |  |
можно, но не нужно (даже нельзя) так
sqrt((x1-x2)*(x1-x2),(x1-x2)*(x1-x2))
а правильно так
hypot((x1-x2),(y1-y2))
№ 176 Удалено модератором | |
№ 175 05-03-2008 07:00 |  |
Ответ на »сообщение 174« (ДДВ)
___________________________
if (i.ToString().Length == 1)
Это еще что. Гораздо интереснее проверять переменную на истинность:
if (b.ToString().Length < 5)
№ 174 05-03-2008 06:41 |  |
Википедия:
Индусский код — в самом общем случае, это криво написанный код. Однако на самом деле, под индусским кодом подразумевают код, написанный наиболее неочевидным и неестественным из всех возможных способов. Именно этим он и отличается от быдлокода, который хотя бы капельку очевиден.
По другой трактовке, индусский код — жаргонное нарицательное название для программного кода крайне низкого качества, использующего простые, но порочные принципы «copy-paste», «главное завалить — а там запинаем», «шапкозакидательство». Так же известен как «write only», или (в пику принципу «написано однажды — читается везде») — «написанное однажды — лучше не читать».[
Пример индусского кода (С#)
uint i;
…
if (i.ToString().Length == 1)
{
...
}
Не сразу можно понять, что в этом коде просто-напросто выполняется проверка i >= 0 && i < 10. Алгоритм достаточно прост: выполняется преобразование i в строку, после чего вычисляется ее длина. Если число отрицательное — длина строки минимум 2 символа. /* тип uint не может быть отрицательным */ Если число больше 9 — аналогично, 2 символа. Проверку проходят лишь числа от 0 до 9.
Алгоритм ресурсоемок, неочевиден и не поддается сопровождению даже теоретически.
(читал тут: http://www.sql.ru/forum/actualthread.aspx?bid=9&tid=532694)
№ 173 28-02-2008 10:56 |  |
Ответ на »сообщение 172« (Mirage)
___________________________
Не, ну хелперы вот это хорошо
№ 172 28-02-2008 08:24 |  |
Ответ на »сообщение 171« (bems)
___________________________
Вообще тут нужен обероновский WITH, и я даже вписал это в кодгировский опрос (еще прошлогодний), но пока что в язык ничего полезного не добавили, если не считать тупейших foreach и т.п.
Добавить свое сообщение
Отслеживать это обсуждение 
Дополнительная навигация: |
|