Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по написанному мной коду :) [D7, XP]


Страницы:   1 2 3 4 5 6

repus ©   (2008-01-16 09:09:00) 

Дело в том, что изучаю Delphi по самоучителю и всего несколько дней как начал, и меня некому поправить, если что. В общем, сделал небольшую прогу. В ней 2 поля ввода, в первом по умолчанию стоит 1, во второе вводиться произвольное число. И при нажатии на кнопку прога выдает случайное число от 1 до Числа, введеного во второе поле ввода. Но если в первое поле вместо 1 ввести 2 или другое число, то случайное число вычисляется 2 раза или больше, в зависимости от введеного в первое поле числа, а потом результат складывается. Допустим, если в первом поле - 1, а во втором 6, то результатом будет случайное число от 1 до 6. А если 2 и 6, то результатом будет сумма 2-х разных случайных чисел от 1 до 6, и т.д.
Но есть еще дополнения, если число в поле Edit1 равно 4, то одно самое маленькое значение выкидывается, и в результат выводится сумма только трех случайных чисел.
Код который я написал работает так, как надо :) Но мне хотелось бы узнать у более знающих людей, можно ли сделать это как-то по проще и красивее что-ли...? И нет ли там чего лишнего?

Код:
procedure TForm1.Button1Click(Sender:TObject);
 const
   size=4;
 var
   a:integer;
   b:integer;
   i:integer;
   m:integer;
   z:integer;
   u:array[1..size] of integer;
   min:integer; //минимальный элемент массива
   r:integer;
 begin
   a:=StrToInt(Edit1.Text);
   b:=StrToInt(Edit2.Text);
   z:=0;
   Label2.Caption:='';

   for i:=1 to a do
     begin
       m:=Random(b)+1;
       if i=1 then
           Label2.Caption:=IntToStr(m)
         else
           Label2.Caption:=Label2.Caption+'+'+IntToStr(m);
       z:=z+m;
       if a=4 then
           u[i]:=m;
   end;
   Label2.Caption:=Label2.Caption+'='+IntToStr(z)+#13;
   if a=4 then
     begin
       min:=1;
       for i:=2 to a do
         if u[i]<u[min] then
             min:=i;
       r:=u[min];
       z:=z-r;
       Label2.Caption:=Label2.Caption+'Минимальное значение - '+IntToStr(r)
         +#13+'3 из 4d'+IntToStr(b)+' = '+IntToStr(z);
   end;
end;


Kolan   (2008-01-18 10:32:00) [41]

> Мне на самом деле интересно

Хм, допустим я смотрю не на такой очевидный код как в [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 = 'Вчера';


Игорь Шевченко   (2008-01-18 10:01:00) [42]

Kolan ©   (18.01.08 09:44) [66]


> я когда начал пользоваться resourcestrings, часто не мог
> понять, переменная передо мной или ресурсная строка.


А зачем тебе это понимать ?
Мне на самом деле интересно, что тебе даст понимание того, что вот это является именно ресурсной строкой, а не чем-то еще - переменной, методом объекта, константой и т.п.

ketmar ©   (17.01.08 17:37) [64]

Если ты почитаешь пост [61] то поймешь, что в нем безразлично, системная она или несистемная. Просто неудобно.


Kolan   (2008-01-18 09:44:00) [43]

Частично могу поддержать Кетмара, я когда начал пользоваться resourcestrings, часто не мог понять, переменная передо мной или ресурсная строка.

Поэтому придумал похожее на джоэла правило, чтобы сразу понимать что передомной.

стал ставить rs.
GuaranteedVolumesGroupBox.Caption :=
   Format( rsGuaranteedVolumesCaption, [DefineMedicalHelpTypeUnits(AMedicalHelpType)]);


repus   (2008-01-18 06:48:00) [44]

Ух ты. Вчера болел, не мог в инет выбраться, а тут такой спор...


> l_v   (17.01.08 14:00) [47]
> function Dice(num_dice,dice_side:integer): string;
> //////////////////////////////
>
> Label1.caption:=Dice(a,b);
>
> так вроде правильней...


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


ketmar   (2008-01-17 17:37:00) [45]

>[63] Игорь Шевченко ©(17.01.08 17:34)
#:%$%##!"%:#!!!
это СИСТЕМНАЯ ВЕНГЕРСКАЯ, #@^%%#@%$#!!!
сколько раз повторять, что она есть идиотским недоразумением?


Игорь Шевченко   (2008-01-17 17:34:00) [46]

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:27:00) [47]

>[61] clickmaker ©(17.01.08 16:48)
а что оная нотация делает в структуре? O_o


clickmaker   (2008-01-17 16:48:00) [48]

особенно приятно наблюдать венгерскую нотацию в структуре из 20 полей в совокупности с IntelliSense


ketmar   (2008-01-17 16:46:00) [49]

>[59] Игорь Шевченко ©(17.01.08 16:39)
>А с классами все эти переменные с именами, в которые входят имена
>сущностей, уезжают в их, сущностей, методы, где префиксы и суффиксы
>выглядят не совсем уместно.

я бы сказал «не всегда уместно». тут я не прояснил свою позицию, виноват. исправляюсь: я всего лишь имел в виду, что «венгерская нотация маст дай без вопросов!» — это несколько неверно. равно как и «венгерская нотация маст руль и би везде без вопросов!»

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


Игорь Шевченко   (2008-01-17 16:39:00) [50]

ketmar ©   (17.01.08 15:50) [56]

В том-то и дело. Классика самодокументирующегося кода имела смысл в то время, когда не было классов :)
А с классами все эти переменные с именами, в которые входят имена сущностей, уезжают в их, сущностей, методы, где префиксы и суффиксы выглядят не совсем уместно. Я об этом :)


ketmar   (2008-01-17 15:56:00) [51]

>[57] Kolan©(17.01.08 15:54)
молодец. ничего не понял, но сказал. ты статью-то по ссылке одолел? не по диагонали? точно не по диагонали? мой пост тоже не по диагонали прочёл? мои слова про двесущности по дороге нигде не потерял?


Kolan   (2008-01-17 15:54:00) [52]

> а вот когда я вижу 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:50:00) [53]

>[55] Игорь Шевченко ©(17.01.08 15:23)
>И первое и второе одинаково плохо :)
а вот почему первое плохо? тут «а» и «б» — имена сущностей. замени на «entA» и «entB», какая разница?

Игорь, это же классика самодокументирующегося кода. зачем делать комментарии там, где достаточно простого префикса?

и вообще: «comments are for beginners» (ц) Niclaus Beizert aka Pascal.
%-)


Игорь Шевченко   (2008-01-17 15:23:00) [54]


>  а вот когда я вижу aIndex и bIndex, к примеру, мне уже
> всё ясно, и листать/компилировать код не надо.
> сравни это с index0 и index1. что проще прочитать и понять?
>


И первое и второе одинаково плохо :)


ketmar   (2008-01-17 15:04:00) [55]

>[53] Игорь Шевченко ©(17.01.08 14:43)
а я тебе ещё раз посоветую перечитать статью.

я, наверное, старее тебя мозгами: мне совершенно неохота листать/компилировать проект, чтобы выяснить, что в данной строке переменная index относится к индексируемой сцщности A, а не к индексируемой сущности B. выдумывать же каждый раз новое слово для индекса — точно помру от натуги всё запомнить. и читаемости это не способствует. а вот когда я вижу aIndex и bIndex, к примеру, мне уже всё ясно, и листать/компилировать код не надо.
сравни это с index0 и index1. что проще прочитать и понять?

проверки можно и lint'ом делать, но вот читать код lint'ом сложновато. мне плевать, как там работает компилятор и как ему удобно/что он может (в данном аспекте). меня гораздо больше волнует читабельность кода.

имена типа dwSize — это идиотизм, я согласен. но оно же частный случай кривого понимания идеи, не более.


Игорь Шевченко   (2008-01-17 14:43:00) [56]

ketmar ©   (17.01.08 14:20) [52]

В [50] ссылка на ту же самую статью :)

И я тебе могу еще раз сказать - это хорошо для С без классов. В других языках эта проблема решается на уровне компилятора.


ketmar   (2008-01-17 14:20:00) [57]

>[49] Игорь Шевченко ©(17.01.08 14:03)
тяжко с тобой. при чём тут типы? ты таки посмотри вот сюда:
http://local.joelonsoftware.com/mediawiki/index.php/Как_заставить_неправильный_код_выглядеть_неправильно


Dib@zol   (2008-01-17 14:16:00) [58]

Удалено модератором
Примечание: Правила читаем и уважаем


Игорь Шевченко   (2008-01-17 14:10:00) [59]

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


Kolan   (2008-01-17 14:03:00) [60]

> можешь даже в переводах посмотреть, эта статья переведена.

А, а в книжке нет?


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо