Текущий архив: 2008.02.10;
Скачать: CL | DM;
ВнизВопрос по написанному мной коду :) Найти похожие ветки
← →
Игорь Шевченко © (2008-01-17 12:03) [40]Kolan © (17.01.08 11:36) [39]
Да пофиг, как начинать имена переменных. Главное, чтобы каждая переменная была на своем очевидном месте.
> не оч., имхо правильно учить именовать переменные а-ля iCount,
> dValue итд…
именовать переменные Count или Value, равно как и count и value не менее "не оч. правильно" - я все к этому веду. А как именовать - это уже сугубо от места именования, то есть, от задачи, зависит.
← →
Игорь Шевченко © (2008-01-17 12:29) [41]Кстати, о венгерской нотации:
"прилВенгерская сущНотация, предлПри числВсем сущУважении предлК собсущВенгрии союзИ местЕе сущЧленстве предлВ прилЕвропейском сущСоюзе союзИ прилДругих прилКрутых сущОрганизациях, глагЯвляется прилПервым сущВрагом сущЧитабельности."
(с) http://bugtraq.ru/library/programming/badcode.html
← →
Skyle © (2008-01-17 12:30) [42]Автор, а я вообще думаю, что Dice должно быть не процедурой, а функцией...
← →
Kolan © (2008-01-17 13:53) [43]«прилВенгерская сущНотация, предлПри числВсем сущУважении предлК собсущВенгрии союзИ местЕе сущЧленстве предлВ прилЕвропейском сущСоюзе союзИ прилДругих прилКрутых сущОрганизациях, глагЯвляется прилПервым сущВрагом сущЧитабельности.»
Класс, серьезно…
← →
ketmar © (2008-01-17 13:53) [44]эк вы упорно не знаете, что «системная венгерская» — это искажение оригинальной идеи…
впрочем, я не проповедник.
← →
Kolan © (2008-01-17 13:55) [45]> эк вы упорно не знаете,
Пойду читать Джоэла…
← →
ketmar © (2008-01-17 13:59) [46]>[45] Kolan©(17.01.08 13:55)
>Пойду читать Джоэла…
всегда полезно. можешь даже в переводах посмотреть, эта статья переведена.
← →
l_v (2008-01-17 14:00) [47]function Dice(num_dice,dice_side:integer): string;
//////////////////////////////
Label1.caption:=Dice(a,b);
так вроде правильней...
← →
Kolan © (2008-01-17 14:03) [48]> можешь даже в переводах посмотреть, эта статья переведена.
А, а в книжке нет?
← →
Игорь Шевченко © (2008-01-17 14:03) [49]ketmar © (17.01.08 13:53) [44]
> эк вы упорно не знаете, что «системная венгерская» — это
> искажение оригинальной идеи…
оригинальная идея была для С без классов. Там это было вполне разумно. С классами можно реализовать гораздо понятнее, и проверку типов выполнять на уровне компиляции, а не на уровне просмотра исходного кода.
Более того, даже на Паскале проверку можно реализовать на уровне компиляции, путем объявления типов для тех переменных, имена которых в оригинале префиксировались.
Ку ?
← →
Игорь Шевченко © (2008-01-17 14:10) [50]Kolan © (17.01.08 14:03) [48]
http://local.joelonsoftware.com/mediawiki/index.php/%D0%9A%D0%B0%D0%BA_%D0%B7%D0%B0%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C_%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4_%D0%B2%D1%8B%D0%B3%D0%BB%D1%8F%D0%B4%D0%B5%D1%82%D1%8C_%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE
← →
Dib@zol © (2008-01-17 14:16) [51]Удалено модератором
Примечание: Правила читаем и уважаем
← →
ketmar © (2008-01-17 14:20) [52]>[49] Игорь Шевченко ©(17.01.08 14:03)
тяжко с тобой. при чём тут типы? ты таки посмотри вот сюда:
http://local.joelonsoftware.com/mediawiki/index.php/Как_заставить_неправильный_код_выглядеть_неправильно
← →
Игорь Шевченко © (2008-01-17 14:43) [53]ketmar © (17.01.08 14:20) [52]
В [50] ссылка на ту же самую статью :)
И я тебе могу еще раз сказать - это хорошо для С без классов. В других языках эта проблема решается на уровне компилятора.
← →
ketmar © (2008-01-17 15:04) [54]>[53] Игорь Шевченко ©(17.01.08 14:43)
а я тебе ещё раз посоветую перечитать статью.
я, наверное, старее тебя мозгами: мне совершенно неохота листать/компилировать проект, чтобы выяснить, что в данной строке переменная index относится к индексируемой сцщности A, а не к индексируемой сущности B. выдумывать же каждый раз новое слово для индекса — точно помру от натуги всё запомнить. и читаемости это не способствует. а вот когда я вижу aIndex и bIndex, к примеру, мне уже всё ясно, и листать/компилировать код не надо.
сравни это с index0 и index1. что проще прочитать и понять?
проверки можно и lint"ом делать, но вот читать код lint"ом сложновато. мне плевать, как там работает компилятор и как ему удобно/что он может (в данном аспекте). меня гораздо больше волнует читабельность кода.
имена типа dwSize — это идиотизм, я согласен. но оно же частный случай кривого понимания идеи, не более.
← →
Игорь Шевченко © (2008-01-17 15:23) [55]
> а вот когда я вижу aIndex и bIndex, к примеру, мне уже
> всё ясно, и листать/компилировать код не надо.
> сравни это с index0 и index1. что проще прочитать и понять?
>
И первое и второе одинаково плохо :)
← →
ketmar © (2008-01-17 15:50) [56]>[55] Игорь Шевченко ©(17.01.08 15:23)
>И первое и второе одинаково плохо :)
а вот почему первое плохо? тут «а» и «б» — имена сущностей. замени на «entA» и «entB», какая разница?
Игорь, это же классика самодокументирующегося кода. зачем делать комментарии там, где достаточно простого префикса?
и вообще: «comments are for beginners» (ц) Niclaus Beizert aka Pascal.
%-)
← →
Kolan © (2008-01-17 15:54) [57]> а вот когда я вижу aIndex и bIndex, к примеру, мне уже всё
> ясно, и листать/компилировать код не надо.
> сравни это с index0 и index1. что проще прочитать и понять?
Если такие вещи у тебя из-за вложеных циклов, то обычно их можно и надо прорефакторить с пом. Extract Method, так, чтобы таких чиклов небыло.
То есть
Arr = array of array Integer.
неfor I := 0 … to
for J := …
DoSmnth(Arr[I,J])
А:for I := 0 … to
Process(Arr[I])
Тогда таких индексов и не будет вообще…
← →
ketmar © (2008-01-17 15:56) [58]>[57] Kolan©(17.01.08 15:54)
молодец. ничего не понял, но сказал. ты статью-то по ссылке одолел? не по диагонали? точно не по диагонали? мой пост тоже не по диагонали прочёл? мои слова про две сущности по дороге нигде не потерял?
← →
Игорь Шевченко © (2008-01-17 16:39) [59]ketmar © (17.01.08 15:50) [56]
В том-то и дело. Классика самодокументирующегося кода имела смысл в то время, когда не было классов :)
А с классами все эти переменные с именами, в которые входят имена сущностей, уезжают в их, сущностей, методы, где префиксы и суффиксы выглядят не совсем уместно. Я об этом :)
← →
ketmar © (2008-01-17 16:46) [60]>[59] Игорь Шевченко ©(17.01.08 16:39)
>А с классами все эти переменные с именами, в которые входят имена
>сущностей, уезжают в их, сущностей, методы, где префиксы и суффиксы
>выглядят не совсем уместно.
я бы сказал «не всегда уместно». тут я не прояснил свою позицию, виноват. исправляюсь: я всего лишь имел в виду, что «венгерская нотация маст дай без вопросов!» — это несколько неверно. равно как и «венгерская нотация маст руль и би везде без вопросов!»
таки удобный инструмент, который вполне можно применять. а то получим жабу (простите за мат), где на каждый чих по классу. имо, это тоже не есть верно.
← →
clickmaker © (2008-01-17 16:48) [61]особенно приятно наблюдать венгерскую нотацию в структуре из 20 полей в совокупности с IntelliSense
← →
ketmar © (2008-01-17 17:27) [62]>[61] clickmaker ©(17.01.08 16:48)
а что оная нотация делает в структуре? O_o
← →
Игорь Шевченко © (2008-01-17 17:34) [63]ketmar © (17.01.08 17:27) [62]
> а что оная нотация делает в структуре? O_o
а эта..живет_STARTUPINFOA = record
cb: DWORD;
lpReserved: PAnsiChar;
lpDesktop: PAnsiChar;
lpTitle: PAnsiChar;
dwX: DWORD;
dwY: DWORD;
dwXSize: DWORD;
dwYSize: DWORD;
dwXCountChars: DWORD;
dwYCountChars: DWORD;
dwFillAttribute: DWORD;
dwFlags: DWORD;
wShowWindow: Word;
cbReserved2: Word;
lpReserved2: PByte;
hStdInput: THandle;
hStdOutput: THandle;
hStdError: THandle;
end;
← →
ketmar © (2008-01-17 17:37) [64]>[63] Игорь Шевченко ©(17.01.08 17:34)
#:%$%##!"%:#!!!
это СИСТЕМНАЯ ВЕНГЕРСКАЯ, #@^%%#@%$#!!!
сколько раз повторять, что она есть идиотским недоразумением?
← →
repus © (2008-01-18 06:48) [65]Ух ты. Вчера болел, не мог в инет выбраться, а тут такой спор...
> l_v (17.01.08 14:00) [47]
> function Dice(num_dice,dice_side:integer): string;
> //////////////////////////////
>
> Label1.caption:=Dice(a,b);
>
> так вроде правильней...
Я ж говорю, только начинаю изучать)) С функциями еще не очень разобрался(( Как разберусь, попробую с функцией сделать.
← →
Kolan © (2008-01-18 09:44) [66]Частично могу поддержать Кетмара, я когда начал пользоваться
resourcestrings
, часто не мог понять, переменная передо мной или ресурсная строка.
Поэтому придумал похожее на джоэла правило, чтобы сразу понимать что передомной.
стал ставитьrs
.
GuaranteedVolumesGroupBox.Caption :=
Format(rsGuaranteedVolumesCaption, [DefineMedicalHelpTypeUnits(AMedicalHelpType)]);
← →
Игорь Шевченко © (2008-01-18 10:01) [67]Kolan © (18.01.08 09:44) [66]
> я когда начал пользоваться resourcestrings, часто не мог
> понять, переменная передо мной или ресурсная строка.
А зачем тебе это понимать ?
Мне на самом деле интересно, что тебе даст понимание того, что вот это является именно ресурсной строкой, а не чем-то еще - переменной, методом объекта, константой и т.п.
ketmar © (17.01.08 17:37) [64]
Если ты почитаешь пост [61] то поймешь, что в нем безразлично, системная она или несистемная. Просто неудобно.
← →
Kolan © (2008-01-18 10:32) [68]> Мне на самом деле интересно
Хм, допустим я смотрю не на такой очевидный код как в [66], и причем заголовок ф-ции невидно.
Например:if (Node1.Text = Yesterday) and (Node2.Text <> Today) then
Compare := —1
else
Compare := 1;
Тут может возникнуть множество идей по поводу того, что тут происходит.
Имхо самая первая будет:
1. ВYesterday
иToday
хроняться даты в текстовом виде и происходит их сравнение.
Причем не понятно передаются ли этиYesterday
иToday
параметрами или нет.
Ежели использовать префикс(оригинальный код):if (Node1.Text = rsYesterday) and (Node2.Text <> rsToday) then
Compare := —1
else
Compare := 1;
То сразу понятно, что это рес. строки. А в рес строках никто не будет хранить "18.01.2008", так как это динамические значения обычно.
Следовательно в них какой-то текст.
И действительно:rsToday = "Сегодня";
rsYesterday = "Вчера";
← →
Kolan © (2008-01-18 10:35) [69]А еще после какой-то ветки @!!ex"а я начал стараться параметры называть с буквы
A
.
ТипаAOwner
, с with проблем так меньше. И опятьже в коде их можно различить…
← →
Игорь Шевченко © (2008-01-18 10:52) [70]
>
> Тут может возникнуть множество идей по поводу того, что
> тут происходит.
> if (Node1.Text = Yesterday) and (Node2.Text <> Today) then
> Compare := —1
> else
> Compare := 1;
Тут не может возникнуть множества идей.
Тут может возникнуть желание дать программисту в репу, потому что из имен переменных ясно, что сравниваются даты (неважно в каком формате)
Если сравниваются не даты, то дать в репу дважды.
А теперь варианты:
Node1 Node2 Результат
Yesterday Yesterday -1
Today Yesterday -1
??? Yesterday -1
Yesterday Today 1
Today Today -1
??? Today -1
Yesterday ??? -1
Today ??? -1
??? ??? -1
Если результат функции такой, как должен быть, то в репу надо давать проектировщику.
← →
Kolan © (2008-01-18 10:58) [71]> Тут может возникнуть желание дать программисту в репу, потому
> что из имен переменных ясно, что сравниваются даты
Ну вот, ЧТД, поэтому я и использую префикс rs. Если не использовать его, то можно назвать переменнуюYesterdayString
, но тогда не оч. ясно откуда она берется. Лучьше назвать еёYesterdayResourceString
, тогда сразу понятно что она вверху модуля.
Вот я и называю еёrsYesterday
.
> А теперь варианты:
Логику работы кода обсуждать не надо — это офф. топ.
А дерево вылгядит так:Сегодня:
1
Вчера:
1
2
16.01.2008
1
2
3
4
← →
Игорь Шевченко © (2008-01-18 11:04) [72]Kolan © (18.01.08 10:58) [71]
> Ну вот, ЧТД, поэтому я и использую префикс rs. Если не использовать
> его, то можно назвать переменную YesterdayString, но тогда
> не оч. ясно откуда она берется. Лучьше назвать её YesterdayResourceString,
> тогда сразу понятно что она вверху модуля.
Да какая разница, resourcestring она или функция для операции сравнения ?
> А дерево вылгядит так:
> Сегодня:
> 1
> Вчера:
> 1
> 2
> 16.01.2008
> 1
> 2
> 3
> 4
А функция Compare для чего вызывается ?
← →
Kolan © (2008-01-18 11:14) [73]> Да какая разница, resourcestring она или функция для операции
> сравнения ?
Для операции сравнения вообще побарабану. Для того, кто будет читать код важно…
Бо по названиюYesterday
непонятно что «вернет» эта «функция», и это название надо изменить, чтобы оно отражало суть, а изменить предется на что-то вродеYesterdayResourceString
, вот я и используюrsYesterday
. Во-первых так короче чем писатьYesterdayResourceString
, а во-вторых таких префиксов кроме перечисл. типов у меня больше нигде не используется.
А правило это возниколо из-за необходимости. Сначала я тоже просто называл эти строки. А потом смотришь код и на понимание тратишь лишние движения, так как проверяешь (Ctrl+Click) что это такое есть…
← →
Kolan © (2008-01-18 11:15) [74]
>
> А функция Compare для чего вызывается ?
Для сортироваки, но это офф. топ.
← →
Игорь Шевченко © (2008-01-18 11:50) [75]Kolan © (18.01.08 11:14) [73]
> Для того, кто будет читать код важно…
> Бо по названию Yesterday непонятно что «вернет» эта «функция»,
>
> и это название надо изменить, чтобы оно отражало суть
Вчерашний день. И неважно, какого типа. Суть - в чистом виде.
Вот смотри - мне не надо было смотреть типы данных, чтобы определить логику программы и понять, что делает функция. Функцию я вижу первый раз в жизни.
Что из этого следует ? Что имен достаточно без префиксов и суффиксов, уточняющих тип.
НУ НЕ НУЖНЫ ОНИ!
← →
Kolan © (2008-01-18 11:57) [76]Честно не понимаю :(.
Вот возьмем код:if (Node1.Text = Yesterday) and (Node2.Text <> Today) then
Compare := —1
else
Compare := 1;
Как его изменить, чтобы было понятно что тут происходит?
← →
Игорь Шевченко © (2008-01-18 12:05) [77]Ты считаешь, что код:
> Вот возьмем код:
> if (Node1.Text = Yesterday) and (Node2.Text <> Today) then
> Compare := —1
> else
> Compare := 1;
менее понятен, чем код:if (Node1.Text = rsYesterday) and (Node2.Text <> rsToday) then
Compare := —1
else
Compare := 1;
?
Я разницы не вижу.
← →
Kolan © (2008-01-18 13:05) [78]Код:
if (Node1.Text = rsYesterday) and (Node2.Text <> rsToday) then
Compare := —1
else
Compare := 1;
+ соглашение: «Ресурсные строки нименуются с rs»
Не то что более понятен, он лишен неоднозначностей вроде «потому что из имен переменных ясно, что сравниваются даты».
Без соглашения понятность гораздо меньше, но и в этом слечае, у читающего может возникнуть подозрение, что что то тут не так…
Так что
> Ты считаешь, что код:
Да, считаю.
← →
guav © (2008-01-18 13:05) [79]Да, префиксы сакс.
Вы до сих пор добавляете T перед классами, F перед дата мемберами Get/Set перед геттерами/сеттерами и P перед типами указателей ?
← →
Kolan © (2008-01-18 13:10) [80]> Вы до сих пор добавляете T перед классами, F перед дата
> мемберами Get/Set перед геттерами/сеттерами и P перед типами
> указателей ?
Надеюсь ты шутишь :)? Бо префикс T например вообще в UML описан…
Страницы: 1 2 3 вся ветка
Текущий архив: 2008.02.10;
Скачать: CL | DM;
Память: 0.63 MB
Время: 0.047 c