![]() |
| ||
|
|
Новости |
Поиск |
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;
oxffff (2008-01-18 13:45:00) [21]
> DiamondShark © (18.01.08 13:24) [84]
>
> > Вы до сих пор добавляете T перед классами, F перед дата
>
> > мемберами Get/Set перед геттерами/сеттерами и P перед
> типами
> > указателей ?
>
> Уже нет.
> В C# идентификаторы case-sensitive, геттеры/сеттеры безымянные,
> а указателей вообще нет.
А как же твое утверждение из другой ветки?
DiamondShark © (18.01.08 12:16) [7]
> Вопросв том, чем же это шарп лучше Delphi
Сам язык -- фигня, ничего революционного.
Да и кстати в IL есть unmanaged pointer. И в С# тоже есть.
Ты что не знал?
oxffff (2008-01-18 13:45:00) [22]
> DiamondShark © (18.01.08 13:24) [84]
>
> > Вы до сих пор добавляете T перед классами, F перед дата
>
> > мемберами Get/Set перед геттерами/сеттерами и P перед
> типами
> > указателей ?
>
> Уже нет.
> В C# идентификаторы case-sensitive, геттеры/сеттеры безымянные,
> а указателей вообще нет.
А как же твое утверждение из другой ветки?
DiamondShark © (18.01.08 12:16) [7]
> Вопросв том, чем же это шарп лучше Delphi
Сам язык -- фигня, ничего революционного.
Да и кстати в IL есть unmanaged pointer. И в С# тоже есть.
Ты что не знал?
Игорь Шевченко (2008-01-18 13:34:00) [23]Kolan © (18.01.08 13:29) [85]
> из resourcestring на const o_0, наврядли так случится…
А в чем проблема ? А ты вообще с какой целью resourcestring используешь - чтобы исполняемый код распухал ?
Kolan © (18.01.08 13:19) [82]
> Неубедительно как-то, я не осознал своего промаха(если он
> есть вообще).
Твой промах в данном случае в том, что ты дополнительно указываешь тип значения, который для понимания работы функции не нужен, компилятор его и так знает, а программисту - лишний мусор в коде.
Kolan (2008-01-18 13:29:00) [24]> Если у rsYesterday изменится тип (const например).
из resourcestring на const o_0, наврядли так случится
Рефракторить будешь?
А что страшного, в принципе 2 кнопки нажать?
DiamondShark (2008-01-18 13:24:00) [25]
> Вы до сих пор добавляете T перед классами, F перед дата
> мемберами Get/Set перед геттерами/сеттерами и P перед типами
> указателей ?
Уже нет.
В C# идентификаторы case-sensitive, геттеры/сеттеры безымянные, а указателей вообще нет.
ANTPro (2008-01-18 13:23:00) [26]> [78] Kolan © (18.01.08 13:05)
Если у rsYesterday изменится тип (const например). Рефракторить будешь?
Kolan (2008-01-18 13:19:00) [27]> Зря.
Неубедительно как-то, я не осознал своего промаха(если он есть вообще).
Игорь Шевченко (2008-01-18 13:15:00) [28]Kolan © (18.01.08 13:05) [78]
> Да, считаю.
Зря.
guav © (18.01.08 13:05) [79]
> Вы до сих пор добавляете T перед классами, F перед дата
> мемберами Get/Set перед геттерами/сеттерами
Добавляем. А что делать - стандарт.
Kolan (2008-01-18 13:10:00) [29]> Вы до сих пор добавляете T перед классами, F перед дата
> мемберами Get/Set перед геттерами/сеттерами и P перед типами
> указателей ?
Надеюсь ты шутишь :)? Бо префикс T например вообще в UML описан
guav (2008-01-18 13:05:00) [30]Да, префиксы сакс.
Вы до сих пор добавляете T перед классами, F перед дата мемберами Get/Set перед геттерами/сеттерами и P перед типами указателей ?
Kolan (2008-01-18 13:05:00) [31]Код:
if (Node1.Text = rsYesterday) and (Node2.Text rsToday) then
Compare := —1
else
Compare := 1;
+ соглашение: «Ресурсные строки нименуются с rs»
Не то что более понятен, он лишен неоднозначностей вроде «потому что из имен переменных ясно, что сравниваются даты».
Без соглашения понятность гораздо меньше, но и в этом слечае, у читающего может возникнуть подозрение, что что то тут не так
Так что
> Ты считаешь, что код:
Да, считаю.
Игорь Шевченко (2008-01-18 12:05:00) [32]Ты считаешь, что код:
> Вот возьмем код:
> 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 11:57:00) [33]Честно не понимаю :(.
Вот возьмем код:
if (Node1.Text = Yesterday) and (Node2.Text <> Today) then
Compare := —1
else
Compare := 1;
Как его изменить, чтобы было понятно что тут происходит?
Игорь Шевченко (2008-01-18 11:50:00) [34]Kolan © (18.01.08 11:14) [73]
> Для того, кто будет читать код важно…
> Бо по названию Yesterday непонятно что «вернет» эта «функция»,
>
> и это название надо изменить, чтобы оно отражало суть
Вчерашний день. И неважно, какого типа. Суть - в чистом виде.
Вот смотри - мне не надо было смотреть типы данных, чтобы определить логику программы и понять, что делает функция. Функцию я вижу первый раз в жизни.
Что из этого следует ? Что имен достаточно без префиксов и суффиксов, уточняющих тип.
НУ НЕ НУЖНЫ ОНИ!
Kolan (2008-01-18 11:15:00) [35]
>
> А функция Compare для чего вызывается ?
Для сортироваки, но это офф. топ.
Kolan (2008-01-18 11:14:00) [36]> Да какая разница, resourcestring она или функция для операции
> сравнения ?
Для операции сравнения вообще побарабану. Для того, кто будет читать код важно
Бо по названиюYesterdayнепонятно что «вернет» эта «функция», и это название надо изменить, чтобы оно отражало суть, а изменить предется на что-то вродеYesterdayResourceString, вот я и используюrsYesterday. Во-первых так короче чем писатьYesterdayResourceString, а во-вторых таких префиксов кроме перечисл. типов у меня больше нигде не используется.
А правило это возниколо из-за необходимости. Сначала я тоже просто называл эти строки. А потом смотришь код и на понимание тратишь лишние движения, так как проверяешь (Ctrl+Click) что это такое есть
Игорь Шевченко (2008-01-18 11:04:00) [37]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 10:58:00) [38]> Тут может возникнуть желание дать программисту в репу, потому
> что из имен переменных ясно, что сравниваются даты
Ну вот, ЧТД, поэтому я и использую префикс rs. Если не использовать его, то можно назвать переменнуюYesterdayString, но тогда не оч. ясно откуда она берется. Лучьше назвать еёYesterdayResourceString, тогда сразу понятно что она вверху модуля.
Вот я и называю еёrsYesterday.
> А теперь варианты:
Логику работы кода обсуждать не надо это офф. топ.
А дерево вылгядит так:
Сегодня:
1
Вчера:
1
2
16.01.2008
1
2
3
4
Игорь Шевченко (2008-01-18 10:52:00) [39]
>
> Тут может возникнуть множество идей по поводу того, что
> тут происходит.
> 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:35:00) [40]А еще после какой-то ветки @!!ex'а я начал стараться параметры называть с буквы
A.
ТипаAOwner, с with проблем так меньше. И опятьже в коде их можно различить