![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по написанному мной коду :) [D7, XP]
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]> можешь даже в переводах посмотреть, эта статья переведена.
А, а в книжке нет?