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;


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 проблем так меньше. И опятьже в коде их можно различить…


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

Наверх

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