Skip Navigation LinksГлавная | Прочее | delphimaster | Вредные советы

Вредные Советы

Как не надоКак на самом делеВредные стихи
00

Никогда не занимайся украшательством:

- максимально сократи имена классов, методов, переменных;

- убери лишние пробелы, переводы строки и всяческие комментарии;

- объедини все юниты в один.

Словом, сделай все, чтобы максимально ускорить компиляцию и получить качественный exe.

Вот образцы хороших имен: lS, I5, l1 O0; не хватит букв - добавь цифр.

Кроме компилятора исходники читают люди, и чем код для них понятней, тем меньше времени уходит на поиск ошибок.

Влиянием же подобной краткости на время компиляции можно пренебречь.

Пиши код в регистре крупном,
Называй поля как хочешь
Процедуры меряй метром
И пробелы все прибей!
Ведь компилер очень умный
Непременно разберется
Что ему сказал программер
А другому ни к чему!

01

Не используй локальные переменные для промежуточных результатов, смелей пользуй with и вложенные вызовы функций.

Сложные конструкции очень неудобны для отладки, может так случиться, что и смотреть в отладчике будет не на что.

Используя with statement надо четко представлять его правила интерпретации имен и помнить, что отладчик не всегда сможет показать поля и свойства внутри этого блока.

Смело вкладывай друг в друга
with и case и else/if
не выравнивай ты блоки
end пиши в случайном месте
Код быть должен как картинка
Нарисованый в ascii!

02

Всегда полагай, что деструктор обнулит все твои ссылки на объект.

Держатель ссылки должен сам заботиться о ее валидности. Для компонентов полезен механизм Notification.

При создании обьекта
Помни - пашет счетчик ссылок
Гадкий access violation
В OnException-е гаси!

03

Разбивай приложение на exe & dll и смело передавай между ними классы.

Надо помнить, что библиотеки являют собой рудиментарную форму технологии клиент-сервер, а с момента их появления прогресс ушел далеко вперед.

В любом случае, включить модуль в uses проще, чем сделать LoadLibrary.

Ну, и никаких классов в DLL, в случае острой нужды используйте BPL или COM вместо dll.

Больше файлов в приложеньи -
Круче, стало быть, программер
Выпуская обновленье
Из трех файлов сделай пять!

04

Создавай побольше потоков, заморочиваться же с Synchronize не стоит.

Использование дополнительных потоков следует тщательно планировать, ориентируясь, в том числе, и на количество процессоров целевой системы.

Обращение к VCL объектам должно идти через Synchronize. Нельзя впадать и в другую крайность.

    procedure TMyThread.Execute;
    begin
      while not Terminated do 
        Synchronize(DoWork)
    end;
          

Нарисуешь два потока -
и увидит глупый юзер
как ворочается цикл,
зависает интерфейс.
Но зато послать по аське
ты знакомой кодемонке
сможешь класс со словом thread
пусть завидует младой!

05

Почаще пользуй функции win32 API и никогда не вызывай Win32Check.

Использование этих функций имеет множество особенностей, требующих внимательного чтения соответствующих статей MSDN. Например, большинство функций требуют для своего результата заранее распределенного буфера.

Обязательно анализируйте возвращаемый функцией результат в порядке, описанном в MSDN.

Если не хватает кода
Что те Борланд предоставил
Смело лезь к виндам в унутрь!
Там есть все что захотишь!
Подыщи api по смыслу,
С изучением не парься
Знают все - винда мудрит!
От слов handle, check и buffer
Будет мозга несваренье
Очень вредно на ночь чтенье
Глав из книг MSDN!

06

Используй дельфийские глобальные переменные формы FormX, и навсегда забудь Screen, Application, DecimalSeparator и прочие

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

Чаще используйте шаблоны, подобные следующему вызову модальной формы (удалите ее из списка Auto-create forms):

    with TFormX.Create(nil) do
    try  
      DoSomethingBeforeShow;
      case ShowModal of
        mrOk: DoSomething1;
        mrCancel: DoSomething2;
        ..
      end;    
    finally
      Free;
    end;
          

Другие же глобальные переменные: Screen, Application, Printer и другие, гораздо более полезны и стоят внимательного изучения. Например, для поиска форм всегда используйте Screen.Forms.

Очень умный компилятор
Нам не зря для каждой формы
Имя личное дает.
Их используй не стесняясь!
Создавая по три раза
Формы, имя не меняй!

07

Убогий TListBox (TDrawGrid, ..) замени парой десятков кнопок, Edit'ов.

Один контрол лучше десяти, внимательно относитесь к выбору контрола, наиболее приспособленного для требуемого действия.

08

Создавая объект X класса TX вызывай конструктор так: X.Create.

Очень распространенная среди начинающих ошибка.

Кроме того, вызов конструктора как метода может и не выполнить повторную инициализацию объекта, как то обещано хелпом. Смотри, например, TThread.Create

09

Не забывай вызов конструктора защитить секцией try-finally.

Обработку исключений конструктора оставляйте обработчику более высокого уровня.

    TClass.Create
    try
      ...
          

а не так

    try
      TClass.Create
      ...
          
0A

Не думай, что исключение в конструкторе вызовет деструктор автоматом.

Всегда помните об этом поведении конструктора, особенно, при написании деструктора, то есть перед какими-либо действиями с полями-объектами убедитесь, что это поле не nil.

0B

Функция, возвращающая объект круче его конструктора.

Такие функции сильно сбивают с толку. Проще всего придерживаться правила Т. Бульбы: ответственность за уничтожение лежит на создателе (если ему не удалось спихнуть ее, например, на Owner или Parent).

Похожее можно сказать и про функции(методы)-убийцы. Для большинства дельферов подобное поведение функции будет неожиданным.

0C

Неплохо выглядит и функция, возвращающая PChar на распределенную ею строку.

Это тоже источник путаницы: необходимо ли освобождать память и кто за это отвечает.

0D

Перебирать список лучше так:

             for i := 1 to List.Count
          

а символы String

             for i := 0 to 10
          

Распространенная ошибка.

По случаю напомним о Low, High

0E

Записи из списка всегда удаляй в цикле for начиная с 0.

Распространенная ошибка, рекомендуется цикл for downto или while.

0F

List index out of bounds - это фича, а не баг.

Значит, все таки, мы облажались.

10

Запомни, что типы PChar & String друг к другу не приводятся.

Конечно, приводятся, но, почему-то, начинающие на этом месте спотыкаются.

Заметим, что иногда полезно приведение Pointer(String), отличающееся от PChar(String) в случае пустой строки.

Неплохо помнить и про SetString.

11

Record с полями String весьма удобен для файлового ввода/вывода.

Неудобен, конечно. Требуются либо строки фиксированной длины, либо явное указание длины строки.

12

Не рисуй в PaintBox - это удобней делать на панели, столе, обоях и стенах.

У начинающих, почему то, часто возникает желание использовать контролы не по назначению.

13

Стремись представить разность дат в годах и месяцах и днях.

Разность двух дат легко представима в днях или неделях, но указание месяцев и лет делает подобное представление неоднозначным.

 

Сейчас на сайте: 112, запросов на просмотр страницы: 1988