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

Вниз

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

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


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

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


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


>  [119] DiamondShark ©   (21.12.04 16:31)

По использованию? Возьми евоный "Рефакториг" и почитай.
Честно говоря я не помню.


 
Fay ©   (2004-12-21 16:39) [122]

2 Суслик ©   (21.12.04 16:38) [121]
>> Честно говоря я не помню
Научный коммунизм тоже хреново запоминался 8)


 
Sandman25 ©   (2004-12-21 16:49) [123]

[110] Johnmen ©   (21.12.04 16:06)

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

Стоит ли так реагировать на то, что я забыл добавить "в большинстве случаев, включая конкретно мой"?


 
Johnmen ©   (2004-12-21 16:51) [124]

>Sandman25 ©   (21.12.04 16:49) [123]

Извини. Но я старался не читать между строк...


 
Anatoly Podgoretsky ©   (2004-12-21 16:52) [125]

Суслик ©   (21.12.04 15:43) [105]
var
 wb: WordBool;
 b: Boolean;
begin
 wb := true;
 b := boolean(wb); <<<<
 if b then
    ShowMessage("hi");
end;

Нет так wb := WordBoolFunc // вернула 256

Вот теперь и сравнивай 256 с 1 и все прочии варианты также


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


>  [125] Anatoly Podgoretsky ©   (21.12.04 16:52)

var
wb: WordBool;
b: Boolean;
begin
pword(@wb)^ := 3424;
b := boolean(wb); <<<<
if b then
   ShowMessage("hi");
end;


Как думаешь hi покажется?
Покажется.
Как это можно объяснить?


 
Sandman25 ©   (2004-12-21 16:54) [127]

[108] Суслик ©   (21.12.04 16:02)

Когда дядя Фаулер покажет мне свой код, в котором у него будет:

GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().Set(1);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().ReSet(1);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().UnSet(1);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().Add(2);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().Set(3);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().UnSet(4);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().Del(5);

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


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


>  [127] Sandman25 ©   (21.12.04 16:54)

ты можешь сделать одну функцию, которая будет содержать в себе весь этот бедлам.


 
Fay ©   (2004-12-21 17:00) [129]

2 Суслик ©   (21.12.04 16:56) [128]
Такую?
GetInternetConnection_Connected_GetServer_GetServerFrame_GetParam_Set_1;


 
Anatoly Podgoretsky ©   (2004-12-21 17:01) [130]

Суслик ©   (21.12.04 16:54) [126]
Я и думать не буду, не применяю сомнительных конструкций в принципе, тем более если вспомнить начало, то там участвовал вариант.

Sandman25 ©   (21.12.04 16:54) [127]
избежать локальных переменных можно так

with GetInternetConnection().Connected().GetServer do begin
  Set(1);
  ReSet(1);
  UnSet(1);
  Add(2);
  Set(3);
  UnSet(4);
  Del(5);
end;


Не говорю, что лучше, а только что нет локальной переменной.


 
vecna ©   (2004-12-21 17:04) [131]

Еле нашел в нашей помойке кусок кода, который мне очень понравился:


   TLiabsCreateByContrsForm.Create(Self, Self, Document,SizeableDialog,
     LParams, nil, msMasterCache, SlaveDataSet.KeyFieldValue,
     "ContractsStages").Free;


Для тех кто в танке упрощенный вариант, конструкция типа TForm.Create.Free


 
Fay ©   (2004-12-21 17:04) [132]

2 Anatoly Podgoretsky ©   (21.12.04 17:01) [130]
>> избежать локальных переменных можно так
Избежать? Нафиг?


 
Суслик ©   (2004-12-21 17:05) [133]


>  [130] Anatoly Podgoretsky ©   (21.12.04 17:01)
> Суслик ©   (21.12.04 16:54) [126]
> Я и думать не буду, не применяю сомнительных конструкций
> в принципе, тем более если вспомнить начало, то там участвовал
> вариант.

Пример с wordbool был приведен только потому, что именно такой код выполнятется (судя по cpu) при

v: variant;
if boolean(v) then


Ничего более.

Почему этот код сомнителен. Разве приведение boolean(v) не соответсвует ожиданию и семантике явного приведения типов? Или ты принципиально против явного приведения типов? Что-то я логики не вижу. Я бы не зацепился, если бы ты не сказал слово "грубая ошибка". Хоть режь - не вижу грубости. Да и не слышу - ты, автор слов, не говоришь.

Собственно я не на принцип иду - мне действително важно знать - прав ты или нет. :)


>  [129] Fay ©   (21.12.04 17:00)

Детский сад. Без обид :))


 
Fay ©   (2004-12-21 17:09) [134]

2 Суслик ©   (21.12.04 16:56) [128]
>> ты можешь сделать одну функцию, которая будет содержать в себе весь этот бедлам

proceduer Bedlam;
begin
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().Set(1);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().ReSet(1);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().UnSet(1);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().Add(2);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().Set(3);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().UnSet(4);
GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam().Del(5);
end;
Вот так?


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


>  [134] Fay ©   (21.12.04 17:09)

Нет не так.
Для начала надо определеться с тем, что есть вся эта конструкция

GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam()

Как она называется на человечьем языке. Определи имя сущности.

Возможно, что это ServerParam().

Ну и напиши
function ServerParam(): TParam;
begin
  Result := GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam()
end;

Тогда использование будет таким

GetServerParam().Set(1);
и т.д.


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

Откуда вы выкопали "проблему" с вариантом?
Любой не_ноль -- это "истина".
Ноль -- "ложь"
Если значение нельзя привести к числовому типу -- исключение.

Истины:
1
-1
3.1415
"123"
"True"

Лжи:
0
0.0
"000"
"False"
Unassigned

Для преобразования к булевскому типу вызывается системная функция VariantChangeTypeEx


 
Fay ©   (2004-12-21 17:17) [137]

А а если результат функции ServerParam нужен в цикле?


 
vecna ©   (2004-12-21 17:20) [138]

2DiamondShark
И еще нада дообавить,
что false = false, а true <> true =)


 
DiamondShark ©   (2004-12-21 17:20) [139]


> Суслик ©   (21.12.04 17:15) [135]
>
> >  [134] Fay ©   (21.12.04 17:09)
>
> Нет не так.
> Для начала надо определеться с тем, что есть вся эта конструкция

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


 
Суслик ©   (2004-12-21 17:23) [140]


>  [137] Fay ©   (21.12.04 17:17)
> А а если результат функции ServerParam нужен в цикле?

А в чем проблема? Используй в цикле. Скорость? Ну канешна, мы тут все сервера пишем...
Да допускаю, что каждый вызов связан с удаленным вызовом. Например, обращением по сети. Это другой случай. Разработка распределенных систем подчиняется своим законам. Но и тут есть хорошее решение, например, паттерн proxy.


 
Суслик ©   (2004-12-21 17:24) [141]


>  [139] DiamondShark ©   (21.12.04 17:20)

Давай ты встревать не будешь с советами что-мне делать...


 
PVOzerski ©   (2004-12-21 17:24) [142]

Я вот тоже поэкспериментировал (D6) :^)
1)
procedure TForm1.Button2Click(Sender: TObject);
var
 wb: variant;
begin
 wb := 256;
 if boolean(wb) then
    ShowMessage("true")
 else
    ShowMessage("false")
end;

Вот это выводит true.

2)
procedure TForm1.Button2Click(Sender: TObject);
var
 wb: variant;
begin
 wb := 256;
 if boolean(byte(wb)) then
    ShowMessage("true")
 else
    ShowMessage("false")
end;
А вот это - false.

Из чего, не глядя в asm, делаю вывод, что преобразование variant->boolean идет не по схеме longint->byte->boolean. Очень хотелось бы увидеть пример кода, когда true принимается за false...


 
PVOzerski ©   (2004-12-21 17:24) [143]

Я вот тоже поэкспериментировал (D6) :^)
1)
procedure TForm1.Button2Click(Sender: TObject);
var
 wb: variant;
begin
 wb := 256;
 if boolean(wb) then
    ShowMessage("true")
 else
    ShowMessage("false")
end;

Вот это выводит true.

2)
procedure TForm1.Button2Click(Sender: TObject);
var
 wb: variant;
begin
 wb := 256;
 if boolean(byte(wb)) then
    ShowMessage("true")
 else
    ShowMessage("false")
end;
А вот это - false.

Из чего, не глядя в asm, делаю вывод, что преобразование variant->boolean идет не по схеме longint->byte->boolean. Очень хотелось бы увидеть пример кода, когда ненулевое значение, присвоенное переменной типа variant, ошибочно принимается за false...


 
Суслик ©   (2004-12-21 17:32) [144]


>  [142] PVOzerski ©   (21.12.04 17:24)

а так

procedure TForm1.Button2Click(Sender: TObject);
var
wb: variant;
begin
wb := 255;
if boolean(byte(wb)) then
   ShowMessage("true")
else
   ShowMessage("false")
end;

:)))))
Если я не ошибаюсь range check error (байт не может быть 256) даже при включенном range checking не будет. Я отношу это к глюку compiler magic при работе с явным преобразованием из variant. Вернее не глюк, а неожидаемая семантика связанная с тем, что пожелание предобразовать к байту игнорируется компилятором - он все равно преобразует к integer.


 
Суслик ©   (2004-12-21 17:36) [145]


> он все равно преобразует к integer.

Вернее не так.
Правилно - преобразует к типу, которых хранится в variant. В случае 255 это byte, в случае 256 - word.


 
PVOzerski ©   (2004-12-21 17:37) [146]

2Суслик ©   (21.12.04 17:32) [144]
Касательно [146] - я совершенно сознательно "выехал" за границу 1 байта, так что меня можно не исправлять :^). Именно благодаря этому преобразования boolean(byte(wb)) и boolean(wb) дали показательно разные результаты.


 
DiamondShark ©   (2004-12-21 17:39) [147]


> Суслик ©   (21.12.04 17:24) [141]
>
> >  [139] DiamondShark ©   (21.12.04 17:20)
>
> Давай ты встревать не будешь с советами что-мне делать...

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

Ты бы примерчик привёл в обоснование своего тезиса -- оно ж проще, чем взбрыкивать: полезнее, и трафику меньше...


 
Суслик ©   (2004-12-21 17:40) [148]


>  [146] PVOzerski ©   (21.12.04 17:37)


> Именно благодаря этому преобразования boolean(byte(wb))
> и boolean(wb) дали показательно разные результаты.

Не вижу ничего удивительного - ты явно берешь младший байт, при том, что он равен 0. И чего - вот тебе и false.
Т.е. чем показателен твой пример? :)))


 
vuk ©   (2004-12-21 17:43) [149]

to Суслик ©   (21.12.04 17:15) [135]:
Вынесение такого кода в функцию никак не решает проблемы количества вызовов, а только её усугубляет.


 
Суслик ©   (2004-12-21 17:44) [150]


>  [147] DiamondShark ©   (21.12.04 17:39)

Я так полагаю мы обсуждаем тему приемущественного использования методов вместо локальных переменных? ТАк?

Если да, то я тебе сказал, где читать до полного просветления...
Без обид. Там хорошие примеры приведены.

Думаешь есть резон их вспоминать. Я же не на экзамене - могу и забыть чего.

К тому же я не являюсь таким уж поклонником такого подхода. Но кругозор тем шире, чем больше знаешь :) Иногда все же применяю - смотрится легче. А главное гибче. Почему? А потому, что у метода могут быть параметры, а у лок. перемненой - нет.


 
Суслик ©   (2004-12-21 17:45) [151]


>  [149] vuk ©   (21.12.04 17:43)

а я решал такую проблему? ;-)
Не могу такого припомнить.


 
PVOzerski ©   (2004-12-21 17:46) [152]

2Суслик ©   (21.12.04 17:40) [148]
А тем, что если бы преобразование variant -> boolean сводилось к "переосмыслению" содержимого информации, лежащей по определенному смещению, как 1-байтовой переменной типа boolean, оба примера выдали бы false, а не только рассмотренный в [148].


 
vuk ©   (2004-12-21 17:47) [153]

to Суслик ©   (21.12.04 17:45) [151]:
А какую проблему там решали? Объем исходника сокращали? Нафига?


 
Суслик ©   (2004-12-21 17:47) [154]


>  [153] vuk ©   (21.12.04 17:47)

Откуда я знаю.
Сам встял в середине - начала как и ты не читал :))


 
Суслик ©   (2004-12-21 17:49) [155]


> [152] PVOzerski ©   (21.12.04 17:46)

К чему пример я понял. Надо еще подумать. А над чем - есть.


 
vuk ©   (2004-12-21 17:51) [156]

to Суслик ©   (21.12.04 17:47) [154]:
>Откуда я знаю.
Сам не понял что писал? Па-а-анятно! :o)


 
Суслик ©   (2004-12-21 17:52) [157]


> [152] PVOzerski ©   (21.12.04 17:46)

Позвольте, а над чем думать то?
Есть boolean, при работе с которым используется мл. байт (al, например).
Ты перевел 256 ($100) к byte. Компилятор не взбрыкнул (хотя, как мне кажется должен). Получилось правда word, где младший байт = 0. Пот тебе и falst.

В случае если boolean(256), то преобразование идет иначе - сразу к boolean.

Возможно, что ты это и имел в виду. Тогда хотелось бы услышать резюме мастера.


 
Суслик ©   (2004-12-21 17:54) [158]


>  [156] vuk ©   (21.12.04 17:51)

Алексей, это шутка была, направленная на высмеивание подхода многих (в том числе и меня): быстро прочитать топик (или вообще этого не делать), не врубиться и сразу в бой.

:)) Шутка....


 
Игорь Шевченко ©   (2004-12-21 17:59) [159]

Суслик ©   (21.12.04 17:44) [150]

Мартин Фаулер. Рефакторинг. Стр. 133
"Замена временной переменной вызовом метода (Replace Temp With Query)".
"Мотивировка:
Проблема с этими переменными в том, что они временные и локальные. Поскольку они видны лишь в контексте метода, в котором используются, временные переменные ведут к увеличению размеров методов, потому что только так можно до них добраться. После замены временной переменной методом запроса, получить содержащиеся в ней данные может любой метод класса.
...
Замена временной переменной вызовом метода часто представляет собой необходимы шаг вперед перед выделением метода"

Мартин Фаулер. Рефакторинг. Стр. 137
Введение поясняющей перемнной (introduce explaning variable)
"Мотивировка:
Выражения могут становиться очень сложными и трудными для чтения. В таких ситуациях полезно с помощью временных переменных превратить выражение в нечто, лучше поддающееся управлению"

Резюме: Всякий овощ приносит пользу будучи употреблен надлежащим образом в надлежащее время, фетиша из Фаулера делать не стоит, а уж из отдельных его утверждений - тем более.
Просветляйся.

С уважением,


 
PVOzerski ©   (2004-12-21 18:01) [160]

2Суслик ©   (21.12.04 17:52) [157]:
из Help к D6:
>A Boolean variable occupies one byte of memory
Sizeof(boolean) также возвращает 1. Таким образом, с точки зрения использования памяти/регистров для хранения boolean ничем не отличается от byte, разница только при компиляции операций с переменной (в т.ч. сравнения, and, or, pred, succ и т.п.). Что же тогда такое "преобразование идет иначе - сразу к boolean"?



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

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

Наверх




Память: 0.84 MB
Время: 0.064 c
1-1104692206
TechnoDreamer
2005-01-02 21:56
2005.01.16
Добавление элемента в TreeView без потери сортировки


3-1102938329
able
2004-12-13 14:45
2005.01.16
Выборка в базе..


9-1095827277
Sancho999
2004-09-22 08:27
2005.01.16
Издатели игр!!!!!!!!!!


3-1103016178
HDM
2004-12-14 12:22
2005.01.16
ПОИСК ПО БАЗЕ


4-1101588891
Piter
2004-11-27 23:54
2005.01.16
Вопрос по хукам