Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Советы. Отрезюмируйте, предложения и замечания, Советы по улучшению программного кода 
:(
    Опции темы
fse
Дата 3.10.2007, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 28.9.2007
Где: г. Рязань

Репутация: 1
Всего: 1



Здравствуйте.
Выкладываю свою работу - статью с некоторыми советам программисту в среде Delphi.
Очень хотелось бы услышать замечания, предложения, отзывы, критику и похвалу (если есть за что).
А на идею написания этой статьи подтолкнули... ну, в общем, посмотрите вложенный файл.
Вкладываю пока что архив с *.DOC файлом, не поленитесь скачать и распоковать.
Жду отзывы.

4.10.2007 - новая версия. Исправил баг с Stream, ещё несколько корректировок

Это сообщение отредактировал(а) fse - 4.10.2007, 12:15

Присоединённый файл ( Кол-во скачиваний: 22 )
Присоединённый файл  Delphi_article.rar 26,33 Kb
PM MAIL   Вверх
ALeXandrK
Дата 3.10.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 6



При беглом взгляде:
  •  в Doc файле выравняй текст по левому и правому краю одновременно; Так читать приятнее smile 
  •  после // нужно делать отступ в один пробел
  •  
    Код

    if FMyProp = 0 then
          FEnumeration := meC else //можно ставить в строке, что и одиночное действие после if

    Очень не рекомендуется. Точнее категорически.
  • Список сочетания клавиш далеко не полный (укажи, хотя бы, что он не полный)
  • if not Elements[N].Active then Continue; // так не рекомендуется писать действия после then 
    должно быть на следующей строке (поверь так потом легче код читать)
Почитай Эта незнакомая IDE! Небольшой список приёмов,
Стандарт стилевого оформления исходного кода DELPHI
и дополни smile 

Статья нормальненькая, но можно сделать её великолепной. Дерзай smile 


Это сообщение отредактировал(а) ALeXandrK - 3.10.2007, 23:59


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
fse
Дата 4.10.2007, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 28.9.2007
Где: г. Рязань

Репутация: 1
Всего: 1



ALeXandrK, спасибо за первый по теме отзыв! smile
Несколько моментов
Цитата

Очень не рекомендуется. Точнее категорически

Этого не понимаю, почему? Внутренний метод класса напрямую меняет личное поле, по-моему корректней некуда. Если можно, то поясниsmile

Цитата

Список сочетания клавиш далеко не полный (укажи, хотя бы, что он не полный)

Согласен! Не полный, в следующей версии это отмечу! Ещё, буду признателен, если дополнишь список горячих клавиш своими!;)

Цитата

if not Elements[N].Active then Continue; // так не рекомендуется писать then должно быть на следующей строке


Не согласенsmile Как писал в статье, за эталон оформления принимаю исходные коды разработчиков. then, на сколько знаю и привык сам - пишется в строке, что и условие. Возможно, ты говорил про Continue, что он пишется по правилам в новой строке. Не спорю, по логике оформления - да, но не по читабельности. Поэтому я залез в Classes.pas и нажал Ctrl+F со строкой Continue и Break:

if FSourcePtr^ = #0 then Exit;
if AClass = TPersistent then Break;
if I > L then Break;
if not (Text[0] in ['0'..'f']) or not (Text[1] in ['0'..'f']) then Break;
if Parser.NextToken = ']' then Break;


это несколько найденных моментов, как видно, всё в одной строке.
Пиши, если не согласен - учту и обозначуsmile
PM MAIL   Вверх
ALeXandrK
Дата 4.10.2007, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 6



Цитата(fse @ 4.10.2007,  00:15)
ALeXandrK, спасибо за первый по теме отзыв! smile
Несколько моментов
Цитата

Очень не рекомендуется. Точнее категорически

Этого не понимаю, почему? Внутренний метод класса напрямую меняет личное поле, по-моему корректней некуда. Если можно, то поясниsmile

Я имел ввиду не корректность с точки зрения компилятора, а 
корректность с точки зрения пользователя. В большом проекте
это может просто свести с ума (поэтому и категорически smile )! 

Про оформление условных операторов:
сам раньше так писал, но потом прочел две статейки, которые указаны в 
моем предыдущем посте, попробовал и понял (почувствовал на собственной
шкуре), что так удобнее и правильнее.

Полный список клавиш я указал (смотри ссылки).

Кстати, укажи в статье еще на такую прекрасную вещь, как
Help (особенно нажатие F1, когда стоишь на определенном
участке кода, например, неизвестной ф-ии).
Help - это мощнейшая вещь, если знать как её пользоваться smile 

Это сообщение отредактировал(а) ALeXandrK - 4.10.2007, 01:04


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
fse
Дата 4.10.2007, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 28.9.2007
Где: г. Рязань

Репутация: 1
Всего: 1



Цитата

Я имел ввиду не корректность с точки зрения компилятора, а 
корректность с точки зрения пользователя

Всё же странно. Даже в большом проекте - это понятное действие... Да и по сути, если класс написан не отвратно - то сторонний программист не должен смотреть его реализацию, не за чем. А таким манером, что я написал, на самом деле написан весь VCL smile
Что ж, заинтересовало, как-нибудь посмотрю в Debuger-е как это выглядит с точки зрения компилятора.

Про HELP - обязательно подумаю, вероятно будет не лишним справке посвятить раздельчик! Как-никак, без неё никуда! Тем более в API.
PM MAIL   Вверх
Melancholic
Дата 4.10.2007, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.5.2007

Репутация: нет
Всего: нет



Не знаю как вам, а мне кажется что очень трудно писать на подобную тему. Здесь очень много философских вопросов и обороты типа "эталон", "всегда делай так, а не так", "никогда не используй", "всегда используй" я бы не рискнул употреблять. Частности:
  • Вопрос о том брать ли в качестве эталона код, написанный разработчиками VCL философский. Разработчик языка не всегда лучший его пользователь, IMHO. К тому же не факт что писатель модуля classes вообще имел какое-то отношение к разработке языка или даже компилятора.
  • В статье говорится "используй всегда with", а вот в третьем издании "Язык программирования C++" небезызвестный Бьерн не рекомендует использовать аналогичную инструкцию в C++.
  • Стоит ли писать 
    Код

    if FSourcePtr^ = #0 then Exit;

    тоже вопрос спорный. Представьте себе процесс отладки и что после then не Exit, а что-то что не вызовет безусловного перехода. И не поймёшь выполнено условие или нет.
Но всё же рекомендации или личные предпочтения касаемо оформления кода обсуждать и предлагать нужно, особенно новичкам (к которым, кстати я и отношусь). Поэтому автору респект, пишите, дорабатывайте, - удачи.
PM MAIL   Вверх
stab
Дата 4.10.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



"Не сложно обратить внимание на появившийся Hint и просто удалить ненужную строковую переменную S1. Поверьте, среда не ошибётся, вы можете удалить S3 из списка переменных!" - ляп

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

"Что я понял, в 99% случаев это просто не надо! Компилятор и без того очень адекватно переводит код в ассемблер, Вы сделаете это даже при весомом стаже, не на много лучше!" - очень спорно, у меня ассемблер даёт выигрыш от 200% до 1000%. тут скорее проблема в том, что без профайлера трудно найти узкие места в коде.

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

"Однако, компилятор всего может и не учесть, вот пример напрасного Warning-сообщения:" - вовсе оно не напрасное, Stream действительно может быть не создан. решается такая проблема с помощью двух try и finally.

"Хотя он, даже если и с ошибкой создания файла, но всё равно создастся в памяти" - ничего подобного, любое не обработанное исключение в конструкторе отменяет создание объекта и освобождает выделенную под него память.

в общем, рано вам ещё писать статьи. обилее восклицательных знаков наводит на размышления.




--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
fse
Дата 4.10.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 28.9.2007
Где: г. Рязань

Репутация: 1
Всего: 1



Melancholic, Про эталон, VCL разрабатывало много людей. Именно не "левых", а работники Borland. И везде идентичное оформление - естественно, это их эталон. Которого, по моему убеждению, можно придерживаться. По крайней мере не писать код так, как это делают некоторые...
Стоит ли писать if FSourcePtr^ = #0 then Exit; вопрос не спорный. Компилятор отлично это переведёт в asm. И при отладке проблем никаких, и наглядность кода возрастает, ведь нет кучи ветвлений.
Про with - напрасно ты так говоришь. Ничего страшного не произойдёт при его использовании, это служебное слово просто позволяет укоротить код, а компилятору-то какая разница?


stab, попрошу быть объективным, если Вам не понравилась статья, то это не значит, что другим она не нужна;)
В любом случае, спасибо за отзыв!
Цитата

Не сложно обратить внимание на появившийся Hint и просто удалить ненужную строковую переменную S1. Поверьте, среда не ошибётся, вы можете удалить S3 из списка переменных

Действительно, опечатался! Не S1, а S3.

Цитата

не актуально, последние версии дельфи умеют инлайнить


А не последнии? smile По крайней мере эта мера лишней не будет.

Цитата

у меня ассемблер даёт выигрыш ...


Ну, в узких местах он конечно нужен. Но тогда придётся, вероятнее всего, переписывать не только узкие места, но и оптимизировать много другого кода. Это уже относится к, возможно, финальной стадии проекта. Я же даю просто рекомендации, а не учу как использовать asm в Delphi. Буду благодарен, если ты выложишь asm код, дающий 1000% выигрыша - обязательно включу в статью;)

И ещё, не согласен про то, что конструктор не создаст объект если будет ехертион. Советую, поэкспериментируй - убедишься. И ещё, исправь в проектах своих то, где ты не удаляешь объект после конструктора с ошибкой;)
Как-никак, за создание объекта в памяти отвечает TObject, а все классы производныеот него! Иначе как бы ты мог в конструкторе своего объекта обращаться к полям??? А если в конструкторе возник ехептион, то что, объект сам вызовет для себя деструктор, а если деструктор переписан? Самовольно объект себя не ведёт.
PM MAIL   Вверх
stab
Дата 4.10.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Цитата(fse @  4.10.2007,  15:06 Найти цитируемый пост)
попрошу быть объективным

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


Цитата(fse @  4.10.2007,  15:06 Найти цитируемый пост)
Но тогда придётся, вероятнее всего, переписывать не только узкие места, но и оптимизировать много другого кода.

не вижу логики, если интерфейс (читай набор параметров процедуры) не меняется, то переписывать ничего не надо.

Цитата(fse @  4.10.2007,  15:06 Найти цитируемый пост)
Я же даю просто рекомендации, а не учу как использовать asm в Delphi.

ага, ложные рекомендации и не хотите принимать критику.

Цитата(fse @  4.10.2007,  15:06 Найти цитируемый пост)
Буду благодарен, если ты выложишь asm код, дающий 1000% выигрыша - обязательно включу в статью;)

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


Цитата(fse @  4.10.2007,  15:06 Найти цитируемый пост)
И ещё, не согласен про то, что конструктор не создаст объект если будет ехертион. Советую, поэкспериментируй - убедишься. И ещё, исправь в проектах своих то, где ты не удаляешь объект после конструктора с ошибкой;) ... 

совет, почитайте хотя бы хелп:

"If an exception is raised during execution of a constructor that was invoked on a class reference, the Destroy destructor is automatically called to destroy the unfinished object."

относительно того примера со Stream, если вы приравнеяте Stream nil перед входом в try и будет исключение, то после выход из try в Stream будет nil, а если не прировняете его nil, то будет там мусор, вызов Free для которого приведёт к исключению с довольно большой вероятностью.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Melancholic
Дата 4.10.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.5.2007

Репутация: нет
Всего: нет



Цитата

Которого, по моему убеждению, можно придерживаться.

Вот это "мудрые слова". Можно придерживаться. Но считать это эталоном в последней стадии не стоит.
К слову о 
Код

if FSourcePtr^ = #0 then Exit;
.
Представим себе такое
Код

...
var
  a: integer;

begin
  if FSourcePtr^ = #0 then a:=0;
  ShowMessage();
end;
...

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

...
var
  a: integer;

begin
  if FSourcePtr^ = #0 then 
    a:=0;
  ShowMessage();
end;

то если условие выполнено, то выполнение пойдёт на a:=0;, а несли нет, то на диалог.
Про with говорил не я, а разработчик стандарта ANSI C++. Аргументировал это тем, что with может привести к конфликтам имён. По сути используя with мы включаем все имена из одного пространства имён в другое, что черевато последствиями.

Это сообщение отредактировал(а) Melancholic - 4.10.2007, 11:25
PM MAIL   Вверх
fse
Дата 4.10.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 28.9.2007
Где: г. Рязань

Репутация: 1
Всего: 1



Melancholic, про a := 0; я не спорюsmile Это выглядит плохоsmile
Но про Exit всё же - частный случай. По логике оформления он попадает под a := 0, но не по читабельности. Ведь при пошаговой отладке после этой строки выполнение сразу переместится на end, тут сложности не возникнет.
Ну, это, действительно, только рекомендации по оформлению, я же не буду программистов заставлять писать "как я сказал" smile
В документ обязательно добавлю акцентирование на "рекомендации", а по просьбе stab-а уберу смущающие знаки восклицания smile

И пару слов про with.
Конфликт имён - да, такое есть. Но ещё есть такая вещь как приоритетность имени, например
Код

with Button1 do
  Width := 100;

Тут 2 Width: ширина кнопки или формы. Но всё же компилятор без вариаций выберет именно кнопку.
Конечно, такого желательно не допускать.
Но вот пример из проекта, в котором без with сложновато:
Код

  with CoordinateSystem.DirectionOX do
    Result.X := X * Vect.X + Y * Vect.Y + Z * Vect.Z;


Если бы я писал
CoordinateSystem.DirectionOX.X
CoordinateSystem.DirectionOX.Y
CoordinateSystem.DirectionOX.Z
Вместо X, Y, Z - было бы сложнее разобраться

Это сообщение отредактировал(а) fse - 4.10.2007, 11:43
PM MAIL   Вверх
fse
Дата 4.10.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 28.9.2007
Где: г. Рязань

Репутация: 1
Всего: 1



stab, действительно, про ехептион в конструкторе ты прав, потестил.
А кто сказал что я не принимаю критику? Я вообще-то и выложил статью на рассмотрение. Но необъективную критику я не признаю!
Цитата

понравится она тем, кто не в курсе что это лож

Где ложь-то? Про конструктор исправляю.
И ещё, просьба, обратите внимание на тему "отрезюмируйте+замечания+предложения".
Жду от Вас обоснование слов, для меня это важно. Пока что я вижу, что вы оклеймили ложью всю статью... Любопытно....
PM MAIL   Вверх
stab
Дата 4.10.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



fse, у вас в статье было два факта не являющиеся истинными: про "напрасное" передупреждение и про "создание" объектов при исключениях в конструкторах. дальше я просто не стал читать, т.к. два таких заявления ставят под вопрос ценность всей статьи. хорошая статья - есть истина в последней инстанции. небольшие неточности ещё можно простить автору, но подобные казусы - следствие некомпетентности. при этом вы собираетесь кого-то учить и даёте советы. в реальной практике, когда автор приносит такие статьи в редакцию, это означает что он больше на журнал этой редакции не работает, т.к. по-сути после фэкт чекинга происходит переписывание статьи заново и редакция в этом случае учит "компетентного" автора уму-разуму.

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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
fse
Дата 4.10.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 28.9.2007
Где: г. Рязань

Репутация: 1
Всего: 1



stab, ну это Ваше мнение. Как я понял, вы никогда не ошибаетесь! Ставится вопрос в этом когда вы утверждаете про 1000%. Тогда чем вообще компилятор занимается? Туфту ассемблерную гонит? Или, скорее всего, без ассемблера Вы сделали очень медленный код. Вот для этого у меня и есть раздел "оптимизация", почитайте.
И ещё, вы сами сказали, что не прочитали статью полностью. Теперь, когда столь вопиющая ошибка исправлена, прочитайте. Я жду от вас не обличение во лжи, а дельные советы или указания на другие ошибки.
Спасибо.

Не будем отклоняться от темы, я выложил статью не спорить с кем-то.
Жду от Вас сообщений.
PM MAIL   Вверх
stab
Дата 4.10.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Цитата(fse @  4.10.2007,  17:09 Найти цитируемый пост)
Ставится вопрос в этом когда вы утверждаете про 1000%.


вам известно что-нибудь про SSE? простейший пример: сложение 16-ти байт, выполняется с помощью одной инструкции - paddb, которая выполняется за 2-3 такта процессора, таким образом получается выигрыш 1600%. если к этому прибавить пристрастие славного компилятора дельфи к работе со всем на стеке, от которого можно избавиться только с помощью ассемблера, то эти 1600% могут запросто превратится в 2000%.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.