Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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]

«прилВенгерская сущНотация, предлПри числВсем сущУважении предлК собсущВенгрии союзИ местЕе сущЧленстве предлВ прилЕвропейском сущСоюзе союзИ прилДругих прилКрутых сущОрганизациях, глагЯвляется прилПервым сущВрагом сущЧитабельности.»

Класс, серьезно&#133


 
ketmar ©   (2008-01-17 13:53) [44]

эк вы упорно не знаете, что «системная венгерская» — это искажение оригинальной идеи…

впрочем, я не проповедник.


 
Kolan ©   (2008-01-17 13:55) [45]

> эк вы упорно не знаете,

Пойду читать Джоэла&#133


 
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 &#133 to
   for J := &#133
     DoSmnth(Arr[I,J])


А:
 for I := 0 &#133 to
   Process(Arr[I])


Тогда таких индексов и не будет вообще&#133


 
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 := &#151;1
else
 Compare := 1;


Тут может возникнуть множество идей по поводу того, что тут происходит.
Имхо самая первая будет:
1. В Yesterday и Today хроняться даты в текстовом виде и происходит их сравнение.
Причем не понятно передаются ли эти Yesterday и Today параметрами или нет.

Ежели использовать префикс(оригинальный код):
if (Node1.Text = rsYesterday) and (Node2.Text <> rsToday) then
 Compare := &#151;1
else
 Compare := 1;


То сразу понятно, что это рес. строки. А в рес строках никто не будет хранить "18.01.2008", так как это динамические значения обычно.
Следовательно в них какой-то текст.

И действительно:
 rsToday = "Сегодня";
 rsYesterday = "Вчера";


 
Kolan ©   (2008-01-18 10:35) [69]

А еще после какой-то ветки @!!ex"а я начал стараться параметры называть с буквы A.
Типа AOwner, с with проблем так меньше. И опятьже в коде их можно различить&#133


 
Игорь Шевченко ©   (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.


> А теперь варианты:

Логику работы кода обсуждать не надо &#151; это офф. топ.
А дерево вылгядит так:
Сегодня:
 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 она или функция для операции
> сравнения ?

Для операции сравнения вообще побарабану. Для того, кто будет читать код важно&#133

Бо по названию Yesterday непонятно что &laquo;вернет&raquo; эта &laquo;функция&raquo;, и это название надо изменить, чтобы оно отражало суть, а изменить предется на что-то вроде YesterdayResourceString, вот я и использую rsYesterday. Во-первых так короче чем писать YesterdayResourceString, а во-вторых таких префиксов кроме перечисл. типов у меня больше нигде не используется.

А правило это возниколо из-за необходимости. Сначала я тоже просто называл эти строки. А потом смотришь код и на понимание тратишь лишние движения, так как проверяешь (Ctrl+Click) что это такое есть&#133


 
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;


+ соглашение: &laquo;Ресурсные строки нименуются с rs&raquo;

Не то что более понятен, он лишен неоднозначностей вроде &laquo;потому что из имен переменных ясно, что сравниваются даты&raquo;.

Без соглашения понятность гораздо меньше, но и в этом слечае, у читающего может возникнуть подозрение, что что то тут не так&#133

Так что

> Ты считаешь, что код:

Да, считаю.


 
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 описан&#133



Страницы: 1 2 3 вся ветка

Текущий архив: 2008.02.10;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.047 c
2-1200836236
KROT
2008-01-20 16:37
2008.02.10
Запро по базе данных и переход на нужную запись (Помогите)


15-1199109936
ArtemESC
2007-12-31 17:05
2008.02.10
Чем можно прочистить водный камень в кране?


15-1199303878
Lip
2008-01-02 22:57
2008.02.10
Оцените код


2-1200519655
Malik
2008-01-17 00:40
2008.02.10
Остановка потока


2-1200403940
Elec3C
2008-01-15 16:32
2008.02.10
Хук на запуск или завершение прог.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский