Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
6-1098622309
Ded Moroz
2004-10-24 16:51
2005.01.16
Блокировка


14-1104232305
syte_ser78
2004-12-28 14:11
2005.01.16
вопрос по Magiс Forum 1.2


1-1104140515
Cherepah
2004-12-27 12:41
2005.01.16
Как узнать размер Record?


11-1085131526
*Pavel
2004-05-21 13:25
2005.01.16
Есть ли в KOL e Application.Handle ?


14-1103897964
syte_ser78
2004-12-24 17:19
2005.01.16
кажется уже спрашивал.





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