Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по написанному мной коду :)   Найти похожие ветки 

 
repus ©   (2008-01-16 09:09) [0]

Дело в том, что изучаю 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-16 09:19) [1]

> Но мне хотелось бы узнать у более знающих людей, можно ли
> сделать это как-то по проще и красивее что-ли&#133?

Начни со внятных имен для переменных.(используй CamelCase в названиях)

Отдели твой расчет от работы с полями и лэйблами, то есть в кнопке получай значения из полей ввода( a:=StrToInt(Edit1.Text); и т.д&#133), и выдели отдельную процедуру/функцию, которая ничего не будет знать не о какких полях, а значения передавай в кач параметров.

Пример маленький:

было:


 
Kolan ©   (2008-01-16 09:21) [2]

было:

procedure TForm1.Button1Click(Sender:TObject);
begin
  a:=StrToInt(Edit1.Text);
  &#133

  for i:=1 to a do
&#133


Сделай так:

procedure DoSmth(ACount: Integer);
begin
 for i:=1 to ACount
&#133
end;


procedure TForm1.Button1Click(Sender:TObject);
begin
  a:=StrToInt(Edit1.Text);
  &#133

   DoSmth(a)
&#133


Ну и так далее&#133


 
Sonia ©   (2008-01-16 09:51) [3]


>  a:integer;
>    b:integer;
>    i:integer;
>    m:integer;
>    z:integer;
>    u:array[1..size] of integer;
>    min:integer; //минимальный элемент массива
>    r:integer;

А я бы еще определение объединила. Типа того:

var
 a,b,i,m,z,min,r:integer;


 
Kolan ©   (2008-01-16 09:56) [4]

> А я бы еще определение объединила. Типа того:
>
> var
> a,b,i,m,z,min,r:integer;

:) LOL


 
MsGuns ©   (2008-01-16 10:06) [5]

Пример качественно оформленного кода можно посмотреть у Тексейры с Пачеко или в самой VCL


 
repus ©   (2008-01-16 10:10) [6]

спасибо большое, попробую так сделать.

А что такое Тексейра с Пачеко?


 
Kolan ©   (2008-01-16 10:11) [7]

> А что такое Тексейра с Пачеко?

Это авторы книжки Руководство разработчика, которую обязательно надо прочесть дл яработы с Delphi.

Брать тут:
http://www.ksoftware.ru/library.html


 
Palladin ©   (2008-01-16 10:11) [8]

Люди. Книжки пишут иногда.


 
repus ©   (2008-01-16 10:17) [9]

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


 
oldman ©   (2008-01-16 10:17) [10]


> Но если в первое поле вместо 1 ввести 2 или другое число,
>  то случайное число вычисляется 2 раза или больше


a:=StrToInt(Edit1.Text);
...
for i:=1 to a do
  begin
     m:=Random(b)+1;


какие еще вопросы?


 
Kolan ©   (2008-01-16 10:20) [11]

>
> какие еще вопросы?

Дык это он так и хотел что бы было, и сделал&#133


 
oldman ©   (2008-01-16 10:23) [12]

А зачем вместо random выдавать сумму random???
Не понимаю...


 
repus ©   (2008-01-16 10:26) [13]


> >
> > какие еще вопросы?
>
> Дык это он так и хотел что бы было, и сделал…


ага. Я просто спрашивал насчет упрощения кода :)


 
oldman ©   (2008-01-16 10:27) [14]

А зачем для поиска минимального использовать массив?
Запоминаем первый random в переменную.
Если следующий random меньше переменной, то присваиваем его этой переменной,
если нет, не присваиваем
:)))


 
oldman ©   (2008-01-16 10:29) [15]


> repus ©   (16.01.08 10:26) [13]


Вместо данных 2,4 можно использовать 1,8
То есть, первый Edit не нужен.
И с 4 какая-то фигня. На фиг это надо?

ЗЫ: Курсач пишешь или лабу?


 
repus ©   (2008-01-16 10:38) [16]


> oldman ©


Не, не курсач. Я просто сам решил поучить Delphi.
А это програмка. Если ты знаком с ролевыми играми, там используются кубики с различным количеством граней. Edit2 - это количество граней этого самого кубика, а Евше1 - это количество этих кубиков. Таких прог в инете много, но так как я только начал bexbnmcz? мне интересно было сделать самому :) А с 4 дело в том, что при создании в игре перса, кидаются 4 кости(вообще 6-гранных, но я просто не стал писать это), самая меньшая убирается, а остальные три суммируются.


 
Kolan ©   (2008-01-16 10:39) [17]

> [16] repus ©   (16.01.08 10:38)

Весьма похвально. Сделай то, что тебе советывали, выкладывай сюда&#133


 
repus ©   (2008-01-16 10:42) [18]

ок.

з.ы.
Че-то с ссылкой на книгу проблемы :(
Два раза скачивал, оба раза при открытии говорит, что файл поврежден((


 
Kolan ©   (2008-01-16 10:50) [19]

> Два раза скачивал, оба раза при открытии говорит, что файл
> поврежден((

Странно. Какую качал? Может проблемы с нетом и не дкачал, какой размер скаченного?
Возьми тут:
http://www.podgoretsky.com/ddp.html


 
repus ©   (2008-01-16 11:10) [20]

Delphi 6 качал. Там она написан 7.11 мб, у меня так и весит. А вот по новой ссылке она весит почти 9 метров. Скачаю оттуда.


 
Kolan ©   (2008-01-16 11:12) [21]

Ок проверю&#133


 
pavel_guzhanov ©   (2008-01-16 11:28) [22]


> Delphi 6 качал

Скачай еще и по Delphi5 этих же авторов. Очень рекомендую. Книга есть по той же ссылке.


 
Kolan ©   (2008-01-16 11:42) [23]

Да, благодарю, перезалил&#133


 
repus ©   (2008-01-16 14:25) [24]


> pavel_guzhanov ©   (16.01.08 11:28) [22]
>
> > Delphi 6 качал
>
> Скачай еще и по Delphi5 этих же авторов. Очень рекомендую.
>  Книга есть по той же ссылке.


ок. Как-нибудь скачаю, спасибо. Сейчас просто траффика мало осталось((

Вот что у меня получилось из предыдущей проги))

procedure Dice(a,b:integer;var s:string);
 var
   i,m,min,z,k:integer;
 begin
   z:=0;
   for i:=1 to a do
     begin
       m:=Random(b)+1;
       if i=1 then
           s:=IntToStr(m)
         else
           s:=s+"+"+IntToStr(m);
       z:=z+m;
   end;

   s:=s+"="+IntToStr(z)+#13;
   if a=4 then
     begin
       min:=m;
         for k:=2 to a do
             if min>m then
                 min:=m;
       z:=z-min;
       s:=s+"Минимальное значение - "+IntToStr(min)
        +#13+"3 из 4d"+IntToStr(b)+" = "+IntToStr(z);
   end;
end;

procedure TForm1.Button1Click(Sender:TObject);
 var
   a,b:integer;
   s:string;
 begin
   a:=StrToInt(Edit1.Text);
   b:=StrToInt(Edit2.Text);
   Dice(a,b,s);
   Label2.Caption:="";

   Label2.Caption:=s;
end;


Поправьте, если что где не так сделал. ))


 
repus ©   (2008-01-16 14:28) [25]

упс(( обнаружил ошибку((


 
Kolan ©   (2008-01-16 14:33) [26]

> Поправьте, если что где не так сделал. ))

Уже чуть лучьше. Теперь твою процедуру Dice можно использовать и в других программа, так как она не зависит от контролов(Edit"ов, Label"ов).

Но лучьше <> достаточно.

вот представь я даю тебе процедуру:
ProcessWord(d,nr: Integer; L: string);
И прошу использовать её.

Первое что ты спросишь, а что такое d, nr и L.

Так и любой другой человек глядя на твою
Dice(a,b:integer;var s:string);
спросит что такое a,b и s

Чтобы такого вопоса не возникало надо назвать их внятно.

Исправляй&#133


 
repus ©   (2008-01-16 15:57) [27]

Исправил))
Еще исправил ошибку в поиске минимального значения. Я for не там записал


> for i:=1 to a do
>      begin
>        m:=Random(b)+1;
>        if i=1 then
>            s:=IntToStr(m)
>          else
>            s:=s+"+"+IntToStr(m);
>        z:=z+m;
>    end;
>
>    s:=s+"="+IntToStr(z)+#13;
>    if a=4 then
>      begin
>        min:=m;
>          for k:=2 to a do
>              if min>m then
>                  min:=m;


Теперь вот:

procedure Dice(num_dice,dice_side:integer;var res:string);
 var
   i,m,min,z,k:integer;
 begin
   z:=0;
   for i:=1 to num_dice do
     begin
       m:=Random(dice_side)+1;
       for k:=2 to num_dice do
           if min>m then
               min:=m;
       if i=1 then
           res:=IntToStr(m)
         else
           res:=res+"+"+IntToStr(m);
       z:=z+m;
   end;

   res:=res+"="+IntToStr(z)+#13;
   if num_dice=4 then
     begin
       z:=z-min;
       res:=res+"Минимальное значение - "+IntToStr(min)
        +#13+"3 из 4d"+IntToStr(dice_side)+" = "+IntToStr(z);

   end;
end;

procedure TForm1.Button1Click(Sender:TObject);
 var
   num_dice,dice_side:integer;
   res:string;
 begin
   num_dice:=StrToInt(Edit1.Text);
   dice_side:=StrToInt(Edit2.Text);
   Dice(num_dice,dice_side,res);
   Label2.Caption:="";

   Label2.Caption:=res;
end;


 
Kolan ©   (2008-01-16 16:03) [28]

Не, во-первых названия недостаточно понятны, во-вторых сти ль написания не приятый в Delphi

Примерно так:
procedure Dice(DiceNumber, DiceSide: Integer; var Res: String);

что имелось ввиду под Res я не понял.

Ну а тут:
var
  i,m,min,z,k:integer;


Порядок навести? Стиль написание исправь. + I и K  оставь &#151; это нормально, а что такое Z и M ?


 
repus ©   (2008-01-16 16:07) [29]

ок. Завтра исправлю. Сегодня уже домой пора.
Стиль написания учту.
Просто не привык еще))


 
Kolan ©   (2008-01-16 16:09) [30]

Учти еще выравнивание:
Не


  for i:=1 to num_dice do
    begin
      m:=Random(dice_side)+1;
      for k:=2 to num_dice do
          if min>m then
              min:=m;
      if i=1 then
          res:=IntToStr(m)
        else
          res:=res+"+"+IntToStr(m);
      z:=z+m;
  end;


А:

 
  for i:=1 to num_dice do
  begin
    m:=Random(dice_side)+1;
    for k:=2 to num_dice do
      if min>m then
        min:=m;
    if i=1 then
      res:=IntToStr(m)
    else
      res:=res+"+"+IntToStr(m);
    z:=z+m;
  end;


 
ketmar ©   (2008-01-16 19:03) [31]

>[28] Kolan©(16.01.08 16:03)
я бы ещё посоветовал имена переменных начинать с маленькой буквы, а процедур/функций — с большой. но это уже вкусовщина.


 
ketmar ©   (2008-01-16 19:06) [32]

2Kolan: что за дискриминация? почему книги на нормальном языке в уродской chm?! /me обиделсо.


 
Kolan ©   (2008-01-16 19:09) [33]

> посоветовал имена переменных начинать с маленькой буквы

ненадо :)


> на нормальном языке в уродской chm

Ты про Refactoring? Да ниче кстати сделана chm"ка &#151; удобно пользоваться&#133


 
ketmar ©   (2008-01-16 19:17) [34]

>[33] Kolan©(16.01.08 19:09)
>>посоветовал имена переменных начинать с маленькой буквы
>ненадо :)

с чего бы? визуально читать удобней намного, чем когда всё с большой. я не даю советов, которые личной кровью не проверял. %-)

>Ты про Refactoring?
и не только. паттерны тоже.

>Да ниче кстати сделана chm"ка — удобно пользоваться…
неудобно. chm никогда неудобно пользоваться. плюс — это проприетарный формат, для которого надо проприетарный IE. так что всё равно в итоге приходится разбирать его на части, чтобы читать Оперой. ну нафига такой геморрой, если pdf удобней? а чистый html вообще удобней всех.


 
Kolan ©   (2008-01-16 19:22) [35]

> с чего бы?

Венгерская нотация позволяется только в именах перечислимых типов. ©
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=802

:)


 
ketmar ©   (2008-01-16 19:51) [36]

>[35] Kolan©(16.01.08 19:22)
>>с чего бы?
>Венгерская нотация позволяется только в именах перечислимых типов. ©

а) если ты читал Джоэля, то знаешь ведь разницу между «венгерской нотацией» и «системной венгерской нотацией»? если не знаешь и читаешь быдлосоветы тех, кто не знает — ты ССЗБ;
б) ГДЕ я писал про венгерскую нотацию вообще? O_o


 
ketmar ©   (2008-01-16 19:52) [37]

>[35] Kolan©(16.01.08 19:22)
кстати, никогда не считал эти рекомендации удобными во всём.


 
Игорь Шевченко ©   (2008-01-17 10:08) [38]

Kolan ©   (16.01.08 19:22) [35]

Не надо стараться быть правовернее Аллаха.

Никакая нотация, никакое оформление имен переменных, никакие паттерны и прочие умствования яйцеголовых не поможет плохо написанному неструктурированному коду.


 
Kolan ©   (2008-01-17 11:36) [39]

> если ты читал Джоэля, то знаешь ведь разницу между

Читал но не знаю :(


> Никакая нотация, никакое оформление имен переменных, никакие
> паттерны и прочие умствования яйцеголовых не поможет плохо
> написанному неструктурированному коду.

Я не спорю, просто не оч., имхо правильно учить именовать переменные а-ля iCount, dValue итд&#133
Или

> посоветовал имена переменных начинать с маленькой буквы

value, i, j, simpleText

Это непее распространено чем, CamelCase(или как там его)&#133


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

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

Класс, серьезно&#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


 
Игорь Шевченко ©   (2008-01-18 13:15) [81]

Kolan ©   (18.01.08 13:05) [78]


> Да, считаю.


Зря.

guav ©   (18.01.08 13:05) [79]


> Вы до сих пор добавляете T перед классами, F перед дата
> мемберами Get/Set перед геттерами/сеттерами


Добавляем. А что делать - стандарт.


 
Kolan ©   (2008-01-18 13:19) [82]

> Зря.

Неубедительно как-то, я не осознал своего промаха(если он есть вообще).


 
ANTPro ©   (2008-01-18 13:23) [83]

> [78] Kolan ©   (18.01.08 13:05)

Если у rsYesterday изменится тип (const например). Рефракторить будешь?


 
DiamondShark ©   (2008-01-18 13:24) [84]


> Вы до сих пор добавляете T перед классами, F перед дата
> мемберами Get/Set перед геттерами/сеттерами и P перед типами
> указателей ?

Уже нет.
В C# идентификаторы case-sensitive, геттеры/сеттеры безымянные, а указателей вообще нет.


 
Kolan ©   (2008-01-18 13:29) [85]

> Если у rsYesterday изменится тип (const например).

из resourcestring на const o_0, наврядли так случится&#133

Рефракторить будешь?
А что страшного, в принципе 2 кнопки нажать?


 
Игорь Шевченко ©   (2008-01-18 13:34) [86]

Kolan ©   (18.01.08 13:29) [85]


> из resourcestring на const o_0, наврядли так случится…


А в чем проблема ? А ты вообще с какой целью resourcestring используешь - чтобы исполняемый код распухал ?

Kolan ©   (18.01.08 13:19) [82]


> Неубедительно как-то, я не осознал своего промаха(если он
> есть вообще).


Твой промах в данном случае в том, что ты дополнительно указываешь тип значения, который для понимания работы функции не нужен, компилятор его и так знает, а программисту - лишний мусор в коде.


 
oxffff ©   (2008-01-18 13:45) [87]


> 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) [88]


> 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. И в С# тоже есть.
Ты что не знал?


 
Kolan ©   (2008-01-18 14:01) [89]

> компилятор его и так знает

Да понятно это, не об нем речь.

> а программисту &#151; лишний мусор в коде

Вот это кто определяет я непойму, я вот программист, мне это не мешает, а помогает. Джоэл, вот, как программист советует.
На QC видел на счет ExtractResourceString жалобу, что они пользуют rs, а там по умолчанию Str. (Убейте не могу найти её)&#133

Кто сказал, что это мусор?


> А в чем проблема ? А ты вообще с какой целью resourcestring
> используешь &#151; чтобы исполняемый код распухал ?

Проблеммы нет, а цель:
1. Хронение строк в 1 месте, чтобы не искать по всему модулю.
2. Есть такой рефакторинг.
3. Можно перевести на др. язык при надобности.


 
Игорь Шевченко ©   (2008-01-18 14:06) [90]

Kolan ©   (18.01.08 14:01) [89]


> 1. Хронение строк в 1 месте, чтобы не искать по всему модулю.


Это полный. Потому как локальные строки ты делаешь глобальными, замусоривая код.


> 2. Есть такой рефакторинг.


Заставь дурака богу молиться, он себе лоб расшибет


> 3. Можно перевести на др. язык при надобности.


С этого момента подробнее, как ты собираешься переводить строки на другой язык без ITE ?


 
guav ©   (2008-01-18 14:14) [91]

> [81] Игорь Шевченко ©   (18.01.08 13:15)

Я к тому что префиксы Delphi нужны чтобы хотя бы хватило имён идентификаторов.


 
Игорь Шевченко ©   (2008-01-18 14:20) [92]

guav ©   (18.01.08 14:14) [91]

Особенно префиксы для типов переменных. Существует соглашение, с блаженной памяти 1995 года, эксперты среды генерируют код с учетом этого соглашения. Можно убирать буковку T перед классами (и в dfm тоже), но зачем делать лишние телодвижения в этом случае - я честно не понимаю.


 
Kolan ©   (2008-01-18 14:21) [93]


>
> Это полный. Потому как локальные строки ты делаешь глобальными,
> замусоривая код.

Поясняю зачем я их делаю глобальными.

допустим у меня строки:
resourcestring
 rsGuaranteedVolumesCaption = "Сведения о гарантированных объемах (%s):";
 rsPeriodDescription = "c %s по %s";
 rsExample = "Например: «%s».";


Я их взял, вставил в вёрд, и проверил орфографию, например&#133
А когда они как рис по всему коду, то что мне делать?

> С этого момента подробнее, как ты собираешься переводить
> строки на другой язык без ITE ?

Я его и имел ввиду. (Правда не пользуюсь, так как ненадо, крутил пару раз его, пользоваться не умею можно сказать&#133).


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


> Я его и имел ввиду. (Правда не пользуюсь, так как ненадо,
>  крутил пару раз его, пользоваться не умею можно сказать…).
>


зато resourcestring надо, чтобы код распухал.

Не надо стремиться быть правовернее, чем Аллах.


> Я их взял, вставил в вёрд, и проверил орфографию, например…
> А когда они как рис по всему коду, то что мне делать?


Русский учить. Оно рулез.


 
DiamondShark ©   (2008-01-18 16:16) [95]

Удалено модератором
Примечание: В чат.


 
oxffff ©   (2008-01-18 16:50) [96]

Удалено модератором
Примечание: В чат.


 
DiamondShark ©   (2008-01-18 17:17) [97]

Удалено модератором
Примечание: В чат.


 
ketmar ©   (2008-01-18 17:19) [98]

>[67] Игорь Шевченко ©(18.01.08 10:01)
см. [62]


 
bang bang gangsta   (2008-01-18 20:49) [99]

Здравствуйте! Я вижу вы тут обсуждали правильное оформление кода. Скажите, как правильно оформлять case ... of ... ? Случайно не так?:

case nnn of
 1: begin
   { ... }
 end;
 2: begin
   { ... }
 end;
end;

Правильно ли оформлять так?


 
ketmar ©   (2008-01-18 22:08) [100]

>[99] bang bang gangsta (18.01.08 20:49)
правильно так:
const choiseVector: array [1..2] of TMyFunction = (Choise1, Choise2);
...
choiseVector[n]();


 
Dib@zol ©   (2008-01-18 22:25) [101]

> [100] ketmar ©   (18.01.08 22:08)

Ога кул способ. Кетмарь снова в деле, и снова жжот %)


> [99] bang bang gangsta   (18.01.08 20:49)
Всё верно. Только какое отношение это имеет к сабжу?


 
Palladin ©   (2008-01-18 22:30) [102]

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


 
guav ©   (2008-01-19 01:15) [103]

> [100] ketmar ©   (18.01.08 22:08)


> const choiseVector: array [1..2] of TMyFunction = (Choise1,
> Choise2);
> ...
> choiseVector[n]();

Мне нравится. Если n вне диапазона, то имеем Undefined Behaviour в полном объёме, а не детский лепет типа ни одна не вызовется :)


 
bang bang gangsta   (2008-01-19 10:43) [104]


> Всё верно. Только какое отношение это имеет к сабжу?

Да просто человек, создавший топик, показал вам код а вы его исправляли, показывая более качественно оформленный код. Вот и мне захотелось узнать, как енто нужно офорМЛЯТЬ.

> правильно так:
> const choiseVector: array [1..2] of TMyFunction = (Choise1,
>  Choise2);
> ...
> choiseVector[n]();

Способ мне понравился, не знал что и так можно. Я вообще много чего не знаю.


 
repus ©   (2008-01-19 14:04) [105]

Програмка поста [27]. Та, насчет которой я спрашивал. Я тут заметил кое-что, так и не смог понять. Вроде же там Random, но при каждом новом запуске она выдает те же самые значения и в том же порядке, какой был при предыдущем запуске, и при всех остальных запусках до них(проверил 50 первых результатов)  :((
Подскажите, как это исправить, чтоб она постоянно разные значения выдавала.


 
Palladin ©   (2008-01-19 14:05) [106]

добавить вызов randomize... например на FormCreate...


 
repus ©   (2008-01-19 14:26) [107]

а не подскажете, как это сделать? я просто еще не знаю, как это делается :( ток начал изучать


 
repus ©   (2008-01-19 14:56) [108]

ой, уже сам догнал)) спасибо))



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

Форум: "Начинающим";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.78 MB
Время: 0.048 c
2-1200561259
asdf
2008-01-17 12:14
2008.02.10
Запрос в MySQL


2-1200821902
Chysti
2008-01-20 12:38
2008.02.10
Perevod s anglisskogo v drugoi iazik...


8-1173452250
Real
2007-03-09 17:57
2008.02.10
Окно поверх любого видеоизображения


2-1200415604
Michael
2008-01-15 19:46
2008.02.10
Преобразование word a в 2 byte a


2-1200633811
mikola
2008-01-18 08:23
2008.02.10
у DBGrid пропадает Scroll





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский