Форум: "Начинающим";
Текущий архив: 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]> Но мне хотелось бы узнать у более знающих людей, можно ли
> сделать это как-то по проще и красивее что-ли…?
Начни со внятных имен для переменных.(используйCamelCase
в названиях)
Отдели твой расчет от работы с полями и лэйблами, то есть в кнопке получай значения из полей ввода(a:=StrToInt(Edit1.Text);
и т.д…), и выдели отдельную процедуру/функцию, которая ничего не будет знать не о какких полях, а значения передавай в кач параметров.
Пример маленький:
было:
← →
Kolan © (2008-01-16 09:21) [2]было:
procedure TForm1.Button1Click(Sender:TObject);
begin
a:=StrToInt(Edit1.Text);
…
for i:=1 to a do
…
Сделай так:procedure DoSmth(ACount: Integer);
begin
for i:=1 to ACount
…
end;procedure TForm1.Button1Click(Sender:TObject);
begin
a:=StrToInt(Edit1.Text);
…
DoSmth(a)
…
Ну и так далее…
← →
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]>
> какие еще вопросы?
Дык это он так и хотел что бы было, и сделал…
← →
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)
Весьма похвально. Сделай то, что тебе советывали, выкладывай сюда…
← →
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]Ок проверю…
← →
pavel_guzhanov © (2008-01-16 11:28) [22]
> Delphi 6 качал
Скачай еще и по Delphi5 этих же авторов. Очень рекомендую. Книга есть по той же ссылке.
← →
Kolan © (2008-01-16 11:42) [23]Да, благодарю, перезалил…
← →
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
Чтобы такого вопоса не возникало надо назвать их внятно.
Исправляй…
← →
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 оставь — это нормально, а что такое 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"ка — удобно пользоваться…
← →
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 итд…
Или
> посоветовал имена переменных начинать с маленькой буквы
value, i, j, simpleText
Это непее распространено чем, CamelCase(или как там его)…
← →
Игорь Шевченко © (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]«прилВенгерская сущНотация, предлПри числВсем сущУважении предлК собсущВенгрии союзИ местЕе сущЧленстве предлВ прилЕвропейском сущСоюзе союзИ прилДругих прилКрутых сущОрганизациях, глагЯвляется прилПервым сущВрагом сущЧитабельности.»
Класс, серьезно…
← →
ketmar © (2008-01-17 13:53) [44]эк вы упорно не знаете, что «системная венгерская» — это искажение оригинальной идеи…
впрочем, я не проповедник.
← →
Kolan © (2008-01-17 13:55) [45]> эк вы упорно не знаете,
Пойду читать Джоэла…
← →
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 … to
for J := …
DoSmnth(Arr[I,J])
А:for I := 0 … to
Process(Arr[I])
Тогда таких индексов и не будет вообще…
← →
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 := —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 = "Вчера";
← →
Kolan © (2008-01-18 10:35) [69]А еще после какой-то ветки @!!ex"а я начал стараться параметры называть с буквы
A
.
ТипаAOwner
, с with проблем так меньше. И опятьже в коде их можно различить…
← →
Игорь Шевченко © (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
.
> А теперь варианты:
Логику работы кода обсуждать не надо — это офф. топ.
А дерево вылгядит так:Сегодня:
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 она или функция для операции
> сравнения ?
Для операции сравнения вообще побарабану. Для того, кто будет читать код важно…
Бо по названиюYesterday
непонятно что «вернет» эта «функция», и это название надо изменить, чтобы оно отражало суть, а изменить предется на что-то вродеYesterdayResourceString
, вот я и используюrsYesterday
. Во-первых так короче чем писатьYesterdayResourceString
, а во-вторых таких префиксов кроме перечисл. типов у меня больше нигде не используется.
А правило это возниколо из-за необходимости. Сначала я тоже просто называл эти строки. А потом смотришь код и на понимание тратишь лишние движения, так как проверяешь (Ctrl+Click) что это такое есть…
← →
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;
+ соглашение: «Ресурсные строки нименуются с rs»
Не то что более понятен, он лишен неоднозначностей вроде «потому что из имен переменных ясно, что сравниваются даты».
Без соглашения понятность гораздо меньше, но и в этом слечае, у читающего может возникнуть подозрение, что что то тут не так…
Так что
> Ты считаешь, что код:
Да, считаю.
← →
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 описан…
← →
Игорь Шевченко © (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, наврядли так случится…
Рефракторить будешь?
А что страшного, в принципе 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]> компилятор его и так знает
Да понятно это, не об нем речь.
> а программисту — лишний мусор в коде
Вот это кто определяет я непойму, я вот программист, мне это не мешает, а помогает. Джоэл, вот, как программист советует.
На QC видел на счет ExtractResourceString жалобу, что они пользуютrs
, а там по умолчанию Str. (Убейте не могу найти её)…
Кто сказал, что это мусор?
> А в чем проблема ? А ты вообще с какой целью resourcestring
> используешь — чтобы исполняемый код распухал ?
Проблеммы нет, а цель:
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».";
Я их взял, вставил в вёрд, и проверил орфографию, например…
А когда они как рис по всему коду, то что мне делать?
> С этого момента подробнее, как ты собираешься переводить
> строки на другой язык без ITE ?
Я его и имел ввиду. (Правда не пользуюсь, так как ненадо, крутил пару раз его, пользоваться не умею можно сказать…).
← →
Игорь Шевченко © (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