Форум: "Потрепаться";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизПо каким моментам кода вы понимаете - профи или так... ? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.7 MB
Время: 0.052 c