Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

По каким моментам кода вы понимаете - профи или так... ?   Найти похожие ветки 

 
PVOzerski ©   (2004-12-21 13:14) [80]

Давай разбираться дальше. Я вот поднял сейчас help D6. Булевский тип, как явствует из него, в варианте должен содержаться как wordbool. Понятно, что если младший байт рассматривать как независимый boolean, он может оказаться и нулем при ненулевом старшем байте (откуда проследует ошибка). А вот что будет при попытке сравнить с, если в варианте вообще не булевское значение, а, например, NULL или 0? Вот такой пример выдал мне "+" (D6):

v:=null;
if v=false then
ShowMessage("-")
else
ShowMessage("+");


 
Fay ©   (2004-12-21 13:15) [81]

2 Johnmen ©   (21.12.04 13:13) [79]
Почему Вы так защищаете инварианты в цикле? Я не понимаю.


 
WondeRu ©   (2004-12-21 13:16) [82]

Sandman25 ©   (21.12.04 12:22) [56]
приведенный метод попахивает уже не профессионализмом, а извращением специалиста! Не думаю, что Ваш код будет работать быстрее или лучше, а удаляется все проще: AIValue.Delete;

так что считаю, что использовать все "супер-способы" только в конкретных случаях... ситуацию надо же учитаывать! или нет?


 
PVOzerski ©   (2004-12-21 13:18) [83]

2Gero ©   (21.12.04 13:06) [76]
Касательно [62]:
код-то рабочий. Но вот отвлекись от возможности оптимизации и сравни

for i:=1 to length(MyDynArray)do
MyDynArray[i-1]:=100;

и

for i:=0 to length(MyDynArray)-1 do
MyDynArray[i]:=100;

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


 
PVOzerski ©   (2004-12-21 13:22) [84]

В продолжение [80]:
Тот же пример при v=0 выдает "-", при v=$F0000000 - "+".


 
Суслик ©   (2004-12-21 13:27) [85]


> [74] Anatoly Podgoretsky ©   (21.12.04 13:03)


Это сравнение с байтом?

cmp word ptr [eax+$08],$01

Или все-таки со словом?


 
Anatoly Podgoretsky ©   (2004-12-21 13:29) [86]

Вообще то варианты стращная штука
Особенно когда TVarType = varNull, что совсем не равно varBoolean


 
Johnmen ©   (2004-12-21 13:31) [87]

>Fay ©   (21.12.04 13:15) [81]

Всё-таки не удержался от продолжения ? :)))

>Почему Вы так защищаете инварианты в цикле? Я не понимаю.

Я НИЧЕГО НЕ защищаю ! Я пытаюсь понять основания вашего с Sandman25 решения. И против него, как такового, ничего не имею. Но мы же живем в реальном мире и работаем с реальными задачами в реальных условиях...


 
Anatoly Podgoretsky ©   (2004-12-21 13:34) [88]

Суслик ©   (21.12.04 13:27) [85]

bool -> V=2=true

и теперь сравни с этим
cmp word ptr [eax+$08],$01


 
Fay ©   (2004-12-21 13:37) [89]

2 Johnmen ©   (21.12.04 13:31) [87]
>> Всё-таки не удержался от продолжения ? :)))
8) Дело в том, что сам я считаю подобный код просто ужасным - видимо, просто родился таким. Ну и, конечно, от Вас я не ждал ужасного (на мой взгляд) кода. Отсюда и спор.


 
ламер ©   (2004-12-21 13:39) [90]

PVOzerski ©   (04.12.21 13:18) [83]
для обоих случаев будет сгенерирован абсолютно одинаковый код.


 
Суслик ©   (2004-12-21 13:41) [91]


>  [88] Anatoly Podgoretsky ©   (21.12.04 13:34)


> и теперь сравни с этим
> cmp word ptr [eax+$08],$01

Я не силен в асм - я просто спрашиваю - в приведенной команде сравнение идет с одним байтом или с двумя ?

Можно подробнее - интересно разобраться.

ЗЫ.
Посмотрел - нигде не сравниваю с true, с равниванию с <> false.
Похоже тоже когда-то на это напарывался.
ЗЗЫ.
А вот boolean(v) делаю. Потому и взволновался сообщением, о недопустимости этого. Буду рад помощи и разъяснениям.


 
КаПиБаРа ©   (2004-12-21 13:42) [92]

Fay ©   (21.12.04 13:37) [89]
Дело в том, что сам я считаю подобный код просто ужасным - видимо, просто родился таким


Чем этот код ужасен? С какой позиции? Скорость, память, объем строк, расширяемость, понятность или что то еще?

PS: Я считаю вкус консервированных манго просто ужасным :)


 
Johnmen ©   (2004-12-21 13:43) [93]

>Fay ©   (21.12.04 13:37) [89]

Ну пойми же, наконец, я НЕ спорю, я хочу получить разумные/практические обоснования. И уже их обсудить. Если получится...:)

PS Вот только "выкать" не надо, не люблю...;-)


 
Fay ©   (2004-12-21 13:51) [94]

2 Johnmen ©   (21.12.04 13:43) [93]
>> PS Вот только "выкать" не надо, не люблю...;-)
Это по дефолту. Учту 8)


 
Palladin ©   (2004-12-21 14:02) [95]


> По каким моментам кода вы понимаете - профи или так...

Моментов много, но если человек предоставил мне логически завершенную конструкцию в 500-700 строк и я потратил не очень много времени что бы понять о чем идет речь, то могу с уверенностью сказать что автор - хороший программист. Понятие "профи" к этому не имеет ни малейшего отношения. Он может быть профи в GWBasic и никто с этим не поспорит пока он не выдаст на паскале лапшу.


 
PVOzerski ©   (2004-12-21 14:08) [96]

2ламер ©   (21.12.04 13:39) [90]

>PVOzerski ©   (04.12.21 13:18) [83]
>для обоих случаев будет сгенерирован абсолютно одинаковый код.

Возможно. Но это будет уже исключительно заслуга оптимизатора. Я же говорил сразу, что от этого отвлекаемся. Притом отвлекаемся не всегда только из "теоретических" соображений. Потому что случается необходимость портировать код под другие компиляторы и даже интерпретаторы. Кстати, посмотри исходники VCL на предмет того, как писали код в подобных случаях ее разработчики.


 
Sandman25 ©   (2004-12-21 14:21) [97]

[77] Val ©   (21.12.04 13:07)

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

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

PS. Конечно, я не могу спорить с "золотым правилом" программирования :)

[79] Johnmen ©   (21.12.04 13:13)

Хорошо, ставим вопрос по-другому. Что это даст ? Принципиального.

Ускорение работы программы, облегчение понимания и сопровождения (уменьшение шанса на ошибку).
FieldByName("f2").AsInteger := FieldByName("f1").AsInteger + X;
FieldByName("f1").AsInteger := FieldByName("f1").AsInteger * FieldByName("f1").AsInteger + Y;
Имеем дублирование кода - вызов одной и той же функции с одним и тем же аргументом, причем даже в случае использования переменных/именнованных констант вместо литералов.


 
Johnmen ©   (2004-12-21 14:32) [98]

>Sandman25 ©   (21.12.04 14:21) [97]
>Ускорение работы программы,

На сколько ? На 0.0000001% ?
:)

>облегчение понимания

:-) Про это уже сказали выше...

>и сопровождения (уменьшение шанса на ошибку).

Не понятно...

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

Ну дублируется. А дальше то что ?
Где конечные блага ?
:)


 
Суслик ©   (2004-12-21 14:34) [99]


> [88] Anatoly Podgoretsky ©   (21.12.04 13:34)

Все же, Анатолий, если вы не против, то хотелось бы продолжить обсуждение недопустимости использования boolean(v), где v - variant.

Честное слово, этот факт меня сильно взволновал.


 
Sandman25 ©   (2004-12-21 14:40) [100]

[98] Johnmen ©   (21.12.04 14:32)
На сколько ? На 0.0000001% ?

Это принципиально.
1) 0.000001% принципиально отличается от 0
2) При выборе из двух вариантов решения я принципиально выберу тот вариант, который лучше. Даже если он лучше на 0.00001%

:-) Про это уже сказали выше...
Ткни носом, please :)

Не понятно...

Например, если мне надо будет изменить формулу и вместо поля f1 использовать f2, я не должен буду устраивать поиск и заменять f1 на f2 во всех найденных местах.

Ну дублируется. А дальше то что ?

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


 
Johnmen ©   (2004-12-21 15:08) [101]

>Sandman25 ©   (21.12.04 14:40) [100]
>На сколько ? На 0.0000001% ?

>Это принципиально.
>1) 0.000001% принципиально отличается от 0

В данном контексте принципиально отличается ??????????

>2) При выборе из двух вариантов решения я принципиально выберу
>тот вариант, который лучше. Даже если он лучше на 0.00001%

Ну боже ш ты мой... В чём лучше ???
В скорости лучше ? На 0.00001% и в памяти хуже на 0.001% ???

>Ткни носом, please :)

Val ©   (21.12.04 11:58) [29]

>Например, если мне надо будет изменить формулу и вместо поля f1
>использовать f2, я не должен буду устраивать поиск и заменять
>f1 на f2 во всех найденных местах.

Теперь понятно. Но это же даже меньше 0.000000000001%
:)

>Ты серьезно спрашивешь? ...

Конечно.
А с исправлениями чужих проектов мне действительно пока везло. В смысле, с отсутствием таковых исправлений...
И если уж вставала проблема исправлений, то просто переписывалось заново. Либо кусок, либо всё.


 
Anatoly Podgoretsky ©   (2004-12-21 15:18) [102]

Суслик ©   (21.12.04 13:41) [91]
Я не силен в асм - я просто спрашиваю - в приведенной команде сравнение идет с одним байтом или с двумя ?

С двумя, видимо учтен тип, ну и что, все равно сравнение то неверное с Boolean(TRUE) = 1, а true в bool не равен 1

Сравнение boolean(v), здесь явное указание компилятору указывать тип boolean, у которого два значения, в цифровом представлении 0 и 1.
В тоже время bool только значение FALSE разно нулю, а TRUE все остальные. По определению в справке указано так

False = 0
true <> 0


Generic тип BOOL и его fundamental типы (bytebool, wordbool, longbool) были введены для поддержки ВИН АПИ, где отсутствует тип boolean. В большинстве случаев преобразование отрабатывает нормально, но не всегда. Я к сожалению не могу найти статью в справке, где описаны все ограничения и возможные проблемы, но работать с ним надо понимая эти различия.

Еще страшнее тип variant там вообще возможны всякие фокусы, выше я указал на возможноть varBoolean, varNull и также varEmpty
тут еще если повезет можно получить и исключение, а если не повезет то трудно уловимую ошибку, там прежде чем использовать его надо проверять на эти три типа.
variant также был введен для совместимости с OLE


 
Sandman25 ©   (2004-12-21 15:20) [103]

[101] Johnmen ©   (21.12.04 15:08)
В данном контексте принципиально отличается ??????????

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

В скорости лучше ? На 0.00001% и в памяти хуже на 0.001% ???

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

>Ткни носом, please :)

Не путай persistent поля и локальные переменные. В последнем случае нет никаких проблем с динамическими запросами.

А с исправлениями чужих проектов мне действительно пока везло.

Тогда поверь мне на слово, как большому специалисту в данном вопросе :) Есть мало проблем хуже дублирования кода. Уж жучше разбираться в сложном алгоритме без комментариев, чем находить отличия в двух больших кусках кода и вносить в них изменения. В первом случае хотя бы интересно.


 
Anatoly Podgoretsky ©   (2004-12-21 15:28) [104]

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


 
Суслик ©   (2004-12-21 15:43) [105]


>  [102] Anatoly Podgoretsky ©   (21.12.04 15:18)

Я все же хотел бы получить некую сатисфакцию на то, что приведение boolean(v) является грубой ошибкой.

В свое время, когда я стал использовать такую конструкцию я смотрел cpu. Мне показалось, что код из variants по приведение bool к boolean вполне безопасен.

В чем я убедился и сейчас (сравниваются то 2 байта, ты сам сказал).

Поэтому не вижу грубых ошибок.

Если интересно можешь поизучать cpu на строчке <<<<. Примерно такой же код геренрится, когда пишешь boolean(v), где v - variant.

var
  wb: WordBool;
  b: Boolean;
begin
  wb := true;
  b := boolean(wb); <<<<
  if b then
     ShowMessage("hi");
end;


 
Johnmen ©   (2004-12-21 15:49) [106]

>Sandman25 ©   (21.12.04 15:20) [103]

Т.е. про скорость замяли ? И это правильно...:)
Про нехватку размера стека речь вообще не идет. Просто теребуется больше памяти. Кстати, и нагрузка на менеджер больше, хотя это такой пустяк, что 0.000000000000001% :)
Про дин.запросы не очень понял, что имелось в виду...

Итак. Мы пришли к единственной практической пользе в облегчении действий корректора ?
:)


 
Sandman25 ©   (2004-12-21 16:01) [107]

[106] Johnmen ©   (21.12.04 15:49)

Согласен, дело не в скорости, дело в принципе. Вынесение за цикл лучше по всем показателям (в том числе и по скорости :-)).


 
Суслик ©   (2004-12-21 16:02) [108]


> Вынесение за цикл лучше по всем показателям (в том числе
> и по скорости :-)).

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


 
Fay ©   (2004-12-21 16:03) [109]

2 Johnmen ©   (21.12.04 15:49) [106]
>> Мы пришли к единственной практической пользе в облегчении действий корректора
Скажи ещё "верстальщика" 8)


 
Johnmen ©   (2004-12-21 16:06) [110]

>Sandman25 ©   (21.12.04 16:01) [107]

>дело в принципе.

Я тоже так думаю.

>Вынесение за цикл лучше по всем показателям

Приехали...:(

Наиболее подходящее резюме, думается:
"Каждому овощу - свой фрукт" (с)
:)


 
Fay ©   (2004-12-21 16:08) [111]

2 Суслик ©   (21.12.04 16:02) [108]
1) дядя Фаулер - хто это?
2) "пользоваться локальными переменными грешно - функции лучше" - IMHO, чрезвычайно глупое утверждение.


 
}|{yk ©   (2004-12-21 16:10) [112]

Спорят непонятно о чем... На то sql есть, а использование хоть fiedbyname, хоть объектов Tfield в цикле для меня дурной тон.


 
Fay ©   (2004-12-21 16:10) [113]

2 Johnmen ©   (21.12.04 16:06) [110]
>> Наиболее подходящее резюме, думается:
>> "Каждому овощу - свой фрукт" (с)
>> :)
Я с этого и начал [19] 8)


 
DiamondShark ©   (2004-12-21 16:11) [114]


> 1) 0.000001% принципиально отличается от 0

Я давно подозревал, что ты неисправимый формалист.


> Спросит меня шеф, почему я замедлил работу, и что я ему
> отвечу?

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

;-)


 
Johnmen ©   (2004-12-21 16:15) [115]

>Fay ©   (21.12.04 16:10) [113]
>>> Наиболее подходящее резюме, думается:
>>> "Каждому овощу - свой фрукт" (с)
>>> :)
>Я с этого и начал [19] 8)

Не-е-е-е... Ты начал с презрения :)
И про овощи ничего не говорил...


 
DiamondShark ©   (2004-12-21 16:16) [116]


> 2) "пользоваться локальными переменными грешно - функции
> лучше" - IMHO, чрезвычайно глупое утверждение.

Скорее, просто перевранное.


 
Суслик ©   (2004-12-21 16:22) [117]


> Скорее, просто перевранное.


в целом именно так у него и сказано.
"Грешно", конечно не было. Но совет избегать такого был.


 
Johnmen ©   (2004-12-21 16:28) [118]

>Fay ©   (21.12.04 16:10) [113]
>>> Наиболее подходящее резюме, думается:
>>> "Каждому овощу - свой фрукт" (с)

Да, и чтобы не было недопонимания,
"овощ"  - "конкретная ситуация",
"фрукт" - "код".


 
DiamondShark ©   (2004-12-21 16:31) [119]


> в целом именно так у него и сказано.
> "Грешно", конечно не было. Но совет избегать такого был.

Примерчик по исполнению совета можно привести?


 
Кудесник ©   (2004-12-21 16:33) [120]


> Суслик ©   (21.12.04 11:58) [28]
> флейм похуже прочих

Зато приятно посмотреть... люди вернули в "Потрепаться" слово "Delphi"... а то всё религия, свобода, политика и другой спорт %)



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

Текущий архив: 2005.01.16;
Скачать: CL | DM;

Наверх




Память: 0.72 MB
Время: 0.063 c
6-1098884112
ЛамерОК
2004-10-27 17:35
2005.01.16
Выключить комп по LAN без программы-сервера


3-1102683731
pavel_guzhanov
2004-12-10 16:02
2005.01.16
Именованные каналы в MS SQL Server


1-1104221625
Floppy
2004-12-28 11:13
2005.01.16
Master-Detail QuickReport


14-1104220697
WondeRu
2004-12-28 10:58
2005.01.16
Только Вы мне сможете помочь!!!


1-1104395389
pomashok
2004-12-30 11:29
2005.01.16
Текст на экране