Форум: "Потрепаться";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизПо каким моментам кода вы понимаете - профи или так... ? Найти похожие ветки
← →
Кудесник © (2004-12-21 10:30) [0]сабж...
← →
Игорь Шевченко © (2004-12-21 10:31) [1]Опыт...
← →
y-soft © (2004-12-21 10:32) [2]По каким моментам текста вы отличаете классический роман от школьного сочинения? :)
← →
Суслик © (2004-12-21 10:32) [3]конкретный код есть всего лишь необходимое условие профи...
← →
Gero © (2004-12-21 10:35) [4]Новичок никогда не назовет функцию IncludeTrailingPathDelimiter.
← →
Игорь Шевченко © (2004-12-21 10:39) [5]Gero © (21.12.04 10:35) [4]
И тем более RtlActivateActivationContextUnsafeFast или
ExWaitForRundownProtectionReleaseCacheAware :)
С уважением,
← →
Суслик © (2004-12-21 10:41) [6]
> И тем более RtlActivateActivationContextUnsafeFast или
> ExWaitForRundownProtectionReleaseCacheAware :)
Я вот, этих функций не знаю :)
Но если бы мне про них рассказал Игорь Шевченко, то я обязательно бы вставил их в свой код и тут же стал профи. :)
← →
antonn © (2004-12-21 10:42) [7]А если чел Лабелы обзывает так: L_CAPTION_VISION и тп?
Кстати, а как можно сменить стандартные названия компонент? Чтобы вместо Button1 было B_1.
← →
y-soft © (2004-12-21 10:49) [8]Разница в самом подходе к написанию приложения...
Профи всегда идет от задачи. Код для него не самоцель, а средство реализации. Он всегда знает что и для чего делает. Отсюда - лаконичность и логичность кода - ничего лишнего, но одновременно предусматриваются такие вещи, о которых новичок даже не задумывается...
У хорошего профи в коде виден свой неповторимый почерк, ход мысли...
← →
Sandman25 © (2004-12-21 10:49) [9][7] antonn © (21.12.04 10:42)
Кстати, а как можно сменить стандартные названия компонент? Чтобы вместо Button1 было B_
GExperts for Delphi. У меня кнопки сразу принимают название btN, остается только N заменить на осмысленный текст, префикс уже есть :)
← →
vecna © (2004-12-21 11:07) [10]профи - относительное понятие, в том коллективе, где тебя считают/не считаю профи это определяется качеством задаваемых вопросов и пермонентностью консультаций...
← →
y-soft © (2004-12-21 11:11) [11]Неопытный программист и пишет слепо.
Код его представляет из себя коктейль из шаблонных кусков, чужих рецептов и результатов собственных эмпирических изысканий ("плясок с бубном") :)
← →
Sandman25 © (2004-12-21 11:26) [12]У опытного программиста меньше операторов case и нет конструкций типа:
case (Sender as TBitBtn).Tag of
0: DoSomeThing(3);
1: DoSomeThing(5);
2: DoAnotherThing();
end;
Do(...);
← →
Fay © (2004-12-21 11:29) [13]2 Sandman25 © (21.12.04 11:26) [12]
Очень странное наблюдение. Мопоподробнее?
← →
Johnmen © (2004-12-21 11:30) [14]"Меньше кода, больше дела" (с) из баннера
← →
Sandman25 © (2004-12-21 11:32) [15][13] Fay © (21.12.04 11:29)
Неопытные программисты не понимают, что вместо case часто эффективнее использовать полиморфизм, а вместо одного обработчика нескольких разных кнопок следует использовать несколько разных обработчиков.
← →
Fay © (2004-12-21 11:35) [16]2 Sandman25 © (21.12.04 11:32) [15]
Мне не очевидно, что
1) DoAnotherThing - метод
2) case имеет отношение с полиморфизму и кнопкам
← →
Sandman25 © (2004-12-21 11:41) [17][16] Fay © (21.12.04 11:35)
1)Пример был не про полиморфизм, а про искусственное самоограничение на количество обработчиков. В чужом коде видел даже такой ужас:procedure ...Click(Sender: TObject);
begin
if Sender = Button1 then
begin
...
end
else
if Sender = Button2 then
begin
...
end
end;
2) Неопытные часто используют поле в качестве варианта case.
← →
TUser © (2004-12-21 11:46) [18]
> В чужом коде видел даже такой ужас
А что тут ужасного?
По сабжу - в хорошем коде фенкции занимают не более одной печатной страницы. Все что больше - разбивается на несколько процедур/функций. Исключение м.б. сделано только для большого кол-ва однотипных строк, чего (кстати) следует избегать. Хороший код не пишется методом копи-паст (в прямом и переносном смысле).
← →
Fay © (2004-12-21 11:47) [19]2 Sandman25 © (21.12.04 11:41) [17]
Да ладно, код не очень страшный, хотя и несколько странный 8)
Я вот с превеликим презрением отношусь к коду видаwhile чё-то do
begin
...
... Нечто.FieldByName("ИмяПоля").КакаяТоФигня ... ;
...
end;
Но знаю, что некоторые уважаемые мною мастера (со значками) так пишут, причём упорно. Видимо моё отношение и такому коду неявляется критерием мастерства 8)
← →
Val © (2004-12-21 11:48) [20]>[18] TUser © (21.12.04 11:46)
По поводу копи-паст - а вот та жуть, про которую написал Игорь Шевченко, обязательна к набору руками? :)
← →
Sandman25 © (2004-12-21 11:48) [21][18] TUser © (21.12.04 11:46)
А что тут ужасного?
Следовало сделать 2 разных обработчика.
← →
Val © (2004-12-21 11:50) [22]>[19] Fay © (21.12.04 11:47)
не поясните, что вас там так смущает ?
← →
Fay © (2004-12-21 11:50) [23]2 Sandman25 © (21.12.04 11:48) [21]
IMHO, такая необходимость не совсем очевидна.
← →
Sandman25 © (2004-12-21 11:51) [24][19] Fay © (21.12.04 11:47)
Вы про объявление переменных типа T...Field и присвоение им значений до цикла?
Или про использование persistent полей?
← →
Fay © (2004-12-21 11:52) [25]2 Val © (21.12.04 11:50) [22]
Зачем вычислять поле в цикле?
← →
TUser © (2004-12-21 11:52) [26]
> Fay ©
> Sandman25 ©
У каждого свои причуды. Я вот тут уже несколько раз нагоняй получал за function rAny: TAnyType (типа - читаю так проперти). Что поделать, что это r мне привычнее, чем Get.
← →
Sandman25 © (2004-12-21 11:56) [27][23] Fay © (21.12.04 11:50)
Не знаю, что и ответить. Разве что довести идею до абсурда и отказаться от всех обработчиков, всё управление программой поместив в ApplicationEvents.OnMessage.
А как же структурность?
← →
Суслик © (2004-12-21 11:58) [28]флейм похуже прочих
← →
Val © (2004-12-21 11:58) [29]>[25] Fay © (21.12.04 11:52)
Ну, например, я вижу - что это за поле, смотря на код. Мне не нужны статические поля - запрос создался и умер.
Можно ваш вариант и аргументы?
← →
antonn © (2004-12-21 11:59) [30]А чего плохово в Копипасте? Вот я "тренируюсь на левом проекте", если получается я готовый код вставляю в рабочий проект. И далее этот "левый" проект пригодится, зачем все время изобратать велосипед? Ну пару раз изобрели и хватит. ИМХО
← →
Johnmen © (2004-12-21 12:01) [31]>Fay © (21.12.04 11:52) [25]
>Зачем вычислять поле в цикле?
Это про FieldByName ?
Тогда Val © (21.12.04 11:58) [29]
+ если порядок полей изменился в силу каких-то причин, то переделка кода...
← →
07BB:080Dh (2004-12-21 12:01) [32]Sandman25 © (21.12.04 11:41) [17]
чем вас не устроил код?
← →
Sandman25 © (2004-12-21 12:01) [33][29] Val © (21.12.04 11:58)
var
MyField, AnotherField: TField;
begin
with DataSet do
begin
MyField := FieldByName("my_field");
AnotherField := FieldByName("another_field");
while not Eof do
begin
...
MyField.AsInteger := AnotherField.AsInteger + ...
...
end;
end;
end;
← →
WondeRu © (2004-12-21 12:02) [34]Sandman25 © (21.12.04 11:26) [12]
case (Sender as TBitBtn).Tag of
0: DoSomeThing(3);
1: DoSomeThing(5);
2: DoAnotherThing();
end;
Do(...);
только что сделал очень похожую конструкцию: есть 20 менюшек, которые создают 20 разных объектов, унаследованных от общего интерфейса IXXXXXInterface. Зачем мне делать 20 обработчиков, если могу создать в каждом кейсе объект IXXXXXInterface, а дальше менять параметры тока у IXXXXXInterface????
← →
Fay © (2004-12-21 12:02) [35]2 Val © (21.12.04 11:58) [29]
Так сильно хуже?var
fldИмяПоля : TField;
begin
...
fldИмяПоля := Нечто.FieldByName("ИмяПоля");
while чё-то do
begin
...
... fldИмяПоля.КакаяТоФигня ... ;
...
end;
...
end;
← →
msguns © (2004-12-21 12:03) [36]>Игорь Шевченко © (21.12.04 10:39) [5]
>И тем более RtlActivateActivationContextUnsafeFast или
ExWaitForRundownProtectionReleaseCacheAware :)
Когда-то в детстве увлекался шахматами. В секции был один орел - большой любитель мата Лаваля. И всегда его пытался поставить. Короче, считался среди нас, четырех-пятиклашек, крутым перцем. Потому что на всех турнирах выигрывал быстро и всегда.
Пока однажды оппонент не сделал первого хода E7-E5.. В общем, перец продул ту партию.. И следующую. Авторитет еще какое-то время держался, но чувак так и не перестроился... В итоге через пару месяцев из секции ушел ;))
← →
Суслик © (2004-12-21 12:04) [37]
> [36] msguns © (21.12.04 12:03)
:-))))
← →
Sandman25 © (2004-12-21 12:07) [38][32] 07BB:080Dh (21.12.04 12:01)
Тем, что он неверен с точки зрения логики и выполняется медленнее.
[34] WondeRu © (21.12.04 12:02)
Весь обработчик может заключаться в
ObjectsProperty[TComponent(Sender).Tag].Create,
где property ObjectsProperty[Index: Integer] read GetObjectsProperty
или еще лучше
ObjectsProperty[GetObjectIndexByComponent(Sender)].Create,
или еще лучше
ObjectByComponentFunction(Sender).Create,
← →
Sandman25 © (2004-12-21 12:10) [39][34] WondeRu © (21.12.04 12:02)
Иначе говоря, не стоит делать интерфейс пользователя и интерфейс объекта зависисмыми друг от друга.
← →
Johnmen © (2004-12-21 12:10) [40]>Fay © (21.12.04 12:02) [35]
А в чем фишка ? В чем глубина/хорошесть/etc ?
← →
Fay © (2004-12-21 12:12) [41]2 Johnmen © (21.12.04 12:10) [40]
Я знал, что Вы откликнитесь 8). Мы уже обсуждали это, хватит.
← →
Sandman25 © (2004-12-21 12:12) [42][40] Johnmen © (21.12.04 12:10)
Ускорение, и неслабое. Особенно если в НД 1000 записей из 1000 полей.
← →
y-soft © (2004-12-21 12:12) [43]Ну, млинн, пошло обсуждение по наезженной дорожке :)
Вопрос-то ведь не в том, как стучать молотком и какие гвозди забивать (профи об этом задумывается меньше всего), а в том, что и зачем этим молотком строить...
← →
WondeRu © (2004-12-21 12:13) [44]Sandman25 © (21.12.04 12:07) [38]
не все так просто в кородевстве датском:case TMenuItem(Sender).Tag of
HWT_OOO: AIValue := XXXX.000_List.Add;
HWT_UUU: AIValue := XXXX.UUU_List.Add;
.....
XXXX - COM-объект, притом не мой!
← →
Sandman25 © (2004-12-21 12:13) [45][43] y-soft © (21.12.04 12:12)
Так и я о том же. Вместо того, чтобы нормально классы спроектировать и шаблон "стратегия" задействовать, начинается использование одного и того же case в десятках местах с разными вариациями.
← →
Суслик © (2004-12-21 12:14) [46]
> [43] y-soft © (21.12.04 12:12)
> Вопрос-то ведь не в том, как стучать молотком и какие гвозди
> забивать (профи об этом задумывается меньше всего), а в
> том, что и зачем этим молотком строить...
золотые слова, чессо слово.
← →
Суслик © (2004-12-21 12:16) [47]Экая панацея эти шаблоны проектирования :)))
Ринулся народ их использовать и к месту и нет :))
← →
Игорь Шевченко © (2004-12-21 12:16) [48]msguns © (21.12.04 12:03) [36]
Да и вообще винды кривые, раз в них такие функции используются :)
С уважением,
← →
Val © (2004-12-21 12:16) [49]>Fay&Sandman25
Коллеги, скорость и память частенько в разных углах, согласитесь - экономя на одном, теряеем в другом :)
Ну описали вы одно поле, а десяток?
← →
КаПиБаРа © (2004-12-21 12:17) [50]y-soft © (21.12.04 12:12) [43]
Точно. Как дети ей богу :)
← →
Fay © (2004-12-21 12:17) [51]2 Johnmen © (21.12.04 12:01) [31]
>> + если порядок полей изменился в силу каких-то причин, то переделка кода...
Вы это серьёзно? В открытом датасете?! "Порядок"?!!
← →
Johnmen © (2004-12-21 12:17) [52]>Fay © (21.12.04 12:12) [41]
>Я знал, что Вы откликнитесь 8). Мы уже обсуждали это, хватит.
Ну, как хочешь...
>Sandman25 © (21.12.04 12:12) [42]
>Ускорение, и неслабое. Особенно если в НД 1000 записей из 1000 полей.
Давай будем реалистами и не будем говорить про 1000 полей.
А про 1000 записей интересны твои оценки неслабости :)
← →
y-soft © (2004-12-21 12:17) [53]>Sandman25 © (21.12.04 12:13) [45]
Я о том, что не может быть универсальной реализации чего-то на все случаи жизни... Иначе бы весь профессионализм сводился бы к знанию нескольких сотен таких решений и умению в нужное время их использовать :)
← →
PVOzerski © (2004-12-21 12:18) [54]Сомнения насчет опытности/профессионализма возникают, когда я вижу:
1) if something=true then;
2) практически повторяющиеся куски (которые так и просятся быть оформленными в процедуру) в разных местах;
3) обращения к конкретному экземпляру класса из метода этого класса (в общем случае).
← →
Val © (2004-12-21 12:19) [55]>[42] Sandman25 © (21.12.04 12:12)
Это уже конкретика, в зависимости от нее выбирается метод решения. Fay писал о презрении, ничего не конкретизируя - пустословие.
← →
Sandman25 © (2004-12-21 12:22) [56][44] WondeRu © (21.12.04 12:13)
Я бы сделал функцию (не метод, если не хочется делать объектную оболочку вокруг XXXX) GetInterfaceById(const Id: Integer): OleVariant;
и использовал AIValue := GetInterfaceById(TComponent(Sender).Tag).Add;
тогда в функции удаления не будем дублировать case, а напишем
GetInterfaceById(TComponent(Sender).Tag).Del;
и в любом случае лучше писать TComponent(Sender).Tag, чтобы не пришлось менять код при замене TMenuItem на TButton, TBitBtn или TSpeedButton
← →
Суслик © (2004-12-21 12:23) [57]
> Сомнения насчет опытности/профессионализма возникают, когда
> я вижу:
> 1) if something=true then;
Наблюдал ошибку компилятора, связанную с тем, что variant, содержищий, bool неверно приводился и кодif v then
работал как бы в v находится false. Находился true.
Поэтому, если работаю с variant, то часто пишу либоif v=true then
либоif boolean(v) then
В этом случае ошибок компиляции не наблюдал.
Так что - все зависит от контекста.
← →
Sandman25 © (2004-12-21 12:27) [58][52] Johnmen © (21.12.04 12:17)
В DataSet 20 полей, FieldByName вызывается 1 раз вместо 1000.
Происходит в среднем 10.000 лишних сравнений имен полей. Я это считаю недостатком, а автора кода - неопытным программистом (или опытным в запарке из-за deadline :-))
← →
y-soft © (2004-12-21 12:28) [59]>PVOzerski © (21.12.04 12:18) [54]
Я бы добавил еще грамотное использование try..except и try..finally и предпроверку условий - "неопытные" обычно этим пренебрегают...
← →
PVOzerski © (2004-12-21 12:28) [60]2Суслик: не возразишь :^). Интересно, а когда такое возникало и можно ли было считать эту ситуацию именно багом компилятора?
← →
Sandman25 © (2004-12-21 12:30) [61][59] y-soft © (21.12.04 12:28)
Точно.
"Скажи мне, используешь ли ты Assert и я скажу, кто ты" :)
← →
PVOzerski © (2004-12-21 12:33) [62]Вот еще вопрос: оптимизируется ли такое на этапе компиляции?
for i:=1 to length(MyDynArray)do
MyDynArray[i-1]:=100;
Во всяком случае, я такого избегаю. А в чужом коде видывал.
← →
Суслик © (2004-12-21 12:34) [63]
> [60] PVOzerski © (21.12.04 12:28)
Ты знаешь, понять сложно.
Я вообще заметил, что в больших и отностиельно сложных проектах с развернутой объектной моделью у дельфи бывают глюки.
В том случае судя по cpu был именно глюк.
Скажу честно, что посторить вряд ли смогу. Но опыт такой ошибки был. С тех пор всегда variant привожу к boolean явно.
← →
07BB:080Dh (2004-12-21 12:36) [64]Sandman25 © (21.12.04 12:07) [38]
то есть у меня обработчик
procedure TForm1.OnClick(Sender: TObject);
begin
{-------------------------------
обработка всего меню
--------------------------------}
end;
добавил пару пунктов, повесил на тот же обработчик,
при изменениим в коде по обрабтке пункта меню
не надо по всему коду искать. Насчет скорости не знаю но удобно однозначно.
← →
PVOzerski © (2004-12-21 12:37) [65]>Я бы добавил еще грамотное использование try..except и try.. finally
Тут еще и наличие большого опыта программирования в TurboPascal сказаться может :^)
← →
Sandman25 © (2004-12-21 12:42) [66][64] 07BB:080Dh (21.12.04 12:36)
Я уже писал. Используйте ApplicationEvents.OnMessage.
← →
Johnmen © (2004-12-21 12:45) [67]>Sandman25 © (21.12.04 12:27) [58]
>Происходит в среднем 10.000 лишних сравнений имен полей.
И на что это влияет так, что "абсолютно недопустимо" ?
>Я это считаю недостатком, ...
Недостатком чего ?
← →
Sandman25 © (2004-12-21 12:48) [68][49] Val © (21.12.04 12:16)
Мне приходилось копировать поля из одного датасета в другой по имени. Использовался FindField, потому что полей могло и не быть, и динамический массив of TField, потому что число полей было неизвестно - 2 параметра TDataSet и все :)
← →
Sandman25 © (2004-12-21 12:50) [69]И на что это влияет так, что "абсолютно недопустимо" ?
Это не моя цитата.
Недостатком чего ?
Решения поставленной задачи.
← →
Anatoly Podgoretsky © (2004-12-21 12:52) [70]Суслик © (21.12.04 12:23) [57]
И возможно поимеешь две ошибки
if v=true then
True это константа и единственным определенным значение, а bool это множество значений, при том что поимеешь даже не предположение а истина, многие споткнулись на этом.
if boolean(v) then
В этом случае ошибок компиляции не наблюдал.
Да ошибок компиляции не будет, зато будут ошибки исполнения, поскольку обращаешься только к младщему байту.
← →
PVOzerski © (2004-12-21 12:54) [71]2Anatoly Podgoretsky © (21.12.04 12:52) [70]
Хорошо, а так?
if longbool(integer(v))then
← →
msguns © (2004-12-21 12:57) [72]А как вы относитесь к пунктуации и комментариям ?
Когда нет отступов либо они накиданы квадратно-гнездовым ? Так, что фиг поймещь, где начало блока, а где конец ? Или полное отсутствие комментариев ? Или, что еще хуже, такие комментарии:
TTable.Open; // Открытие таблицы
Или профи не юзают комменты, как крутые пачаны - презервативы ?
← →
y-soft © (2004-12-21 13:01) [73]>msguns © (21.12.04 12:57) [72]
Или профи не юзают комменты, как крутые пачаны - презервативы ?
Юзают-юзают, только иногда странные и в неожиданных местах :)
← →
Anatoly Podgoretsky © (2004-12-21 13:03) [74]Пойдет, но можно проверку на false
if v<>false
или {long}bool(v)<>false
или Ord(V) = 0
А том виде как предложено это является грубой ошибкой.
← →
Gero © (2004-12-21 13:05) [75]
> PVOzerski © (21.12.04 12:33)
А что не так в этом коде?
← →
Gero © (2004-12-21 13:06) [76]
> Gero © (21.12.04 13:05)
Я насчет [62]
← →
Val © (2004-12-21 13:07) [77]>[68] Sandman25 © (21.12.04 12:48)
Наверняка это было хорошим решением..но что это опровергает/доказывает? Врядли вам удалось использовать меньше памяти и при этом выиграть в скорости, не так ли? :)
Поймите, я не говорю что ваш метод плох, я говорю, что высказывание о методе, который я сейчас защищаю, было слишком радикальным, на мой взгляд.
← →
Gero © (2004-12-21 13:10) [78]Когда никуда не спешу и хочется написать максимально понятный код, пишу так:
if BoolVar then
begin
SomeCode1;
for i := 0 to X do
begin
SomeCode2;
SomeCode3;
end; { for }
end { if }
else
SomeCode4;
← →
Johnmen © (2004-12-21 13:13) [79]>Sandman25 © (21.12.04 12:50) [69]
>>И на что это влияет так, что "абсолютно недопустимо" ?
>Это не моя цитата.
Потому и в кавычках.
Хорошо, ставим вопрос по-другому. Что это даст ? Принципиального.
>>Недостатком чего ?
>Решения поставленной задачи.
Так в чем же всё-таки недостаток ?
← →
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"... а то всё религия, свобода, политика и другой спорт %)
← →
Суслик © (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"?
← →
Sha © (2004-12-21 18:03) [161]> Суслик ©
Идеологически :) правильнее сравнивать что-либо не с истиной, а с ложью.
Успехов.
← →
Суслик © (2004-12-21 18:06) [162]
> [159] Игорь Шевченко © (21.12.04 17:59)
> фетиша из Фаулера
Огромным усилием я заставил себя этого не делать:))).
А опастность была - увлекательно он пишет.
Про овощ согласен. Потому я и не фан такого подхода.
> [160] PVOzerski © (21.12.04 18:01)
Поизучай cpu. В частности VariantManager.
Поясняю:
1. Случай когда variant (256) -> byte -> boolean.
дельфи такую фишку проглатывает. Просто забивает на конструкцию byte в выразении byte(v). Почему? Не знаю. Но важно, что получается word, равный $100. Т.е. младший байт равен 0 => boolean($100) = boolean($00) = false.
2. Случай когда variant(256) -> boolean.
В этом случае значение 256 не проходит через руки целочисленного типа - сразу в манагере вариантов преобразуется к boolean.
См. cpu...
← →
Суслик © (2004-12-21 18:08) [163]
> [161] Sha © (21.12.04 18:03)
> Идеологически :) правильнее сравнивать что-либо не с истиной,
> а с ложью.
Ох уж это слово - идеологически :)))
С этим я давно уже не спорю. Более того посмотрев в себя не нашел = true, только <> false.
Вопрос теперь в другом. АП сказал, что boolean(v), где v variant есть грубая ошибка. Если можно, то хотелось бы узнать почему. Я пока от него не услышал ничего. Может ты знаешь?
← →
DiamondShark © (2004-12-21 18:13) [164]
> Суслик © (21.12.04 17:44) [150]
>
> > [147] DiamondShark © (21.12.04 17:39)
>
> Я так полагаю мы обсуждаем тему приемущественного использования
> методов вместо локальных переменных? ТАк?
Не-а, ни разу не так. Мы обсуждаем тезис:
"пользоваться локальными переменными грешно - функции лучше."
со ссылкой на Фаулера.
> Если да, то я тебе сказал, где читать до полного просветления...
Дело в том, что я Фаулера читал. Ничего подобного у него нет.
> Думаешь есть резон их вспоминать. Я же не на экзамене -
> могу и забыть чего.
Если ты чего-то читал и понял смысл прочитанного, то тебе не составит никакого труда пересказать или проиллюстрировать этот смысл. Или ты хочешь сказать, что ты забыл смысл твоего исходного утверждения? Иными словами: написанное тобой для тебя же есть бессмыслица.
Как говорится, приплыли...
← →
Sha © (2004-12-21 18:17) [165]> Суслик © (21.12.04 18:08) [163]
Сначала ты попробуй объяснить мне, что есть boolean(Null) :)
← →
DiamondShark © (2004-12-21 18:23) [166]
> что есть boolean(Null)
EVariantError
← →
msguns © (2004-12-21 18:25) [167]>Суслик ©
не надоело отмахиваться ?
← →
PVOzerski © (2004-12-21 18:31) [168]>В этом случае значение 256 не проходит через руки целочисленного
типа - сразу в манагере вариантов преобразуется к boolean.
Вот это-то самое интересное :^). При том, что поддержкой паскалевского типа boolean (1-байтовый, true=1) занимаются исключительно компилятор и RTL.
← →
Anatoly Podgoretsky © (2004-12-21 18:38) [169]Sha © (21.12.04 18:17) [165]
Вот именно, про это сказано выше, про vartype
PVOzerski © (21.12.04 17:37) [146]
отсюда следует, что boolean(wb) это не приведение типа, а функция, а boolean(byte) приведение.
Но оппонент старательно избегает обсуждения случая для vartype <> varBoolean
Более того приведенный CPU код где проводится сравнение с 1 явно показывает ошибочность такого сравнения, конечно возможно приведен не весь код, скажем где то выше есть преобразование значения bool в единицу/ноль, тогда все в порядке, но так как кода больше не приведено, то и говорить пока не о чем.
← →
Anatoly Podgoretsky © (2004-12-21 18:42) [170]И главное зачем делать такие рисскованные шаги, которые явно зависят от версии компилятора, а надо, что бы код одинаково надежно работал как на Д2 так и на Д12, а формат bool и boolean хорошо документирован.
Помню несколько месяцев назад было обсуждение, связаное с bool и неверной работой кода, а оно было связано именно с приведением и со сравнение с true, подробности конечно не помню, но это близко к сегодняшнему обсуждению, сегодняшнее усугляется примением variant
← →
PVOzerski © (2004-12-21 18:45) [171]2Anatoly Podgoretsky © (21.12.04 18:42) [170]:
Присоединяюсь. Тем более, что выбор, что использовать, есть. Я вообще варианты только в случаях OLE/COM использую, потому что там без них просто нельзя.
← →
Sha © (2004-12-21 23:17) [172]> PVOzerski © (21.12.04 18:45) [171]
Присоединяюсь.
На мой взгляд в данном случае вместо Variant было бы уместнее использовать longbool или integer.
← →
Johnmen © (2004-12-21 23:21) [173]>Anatoly Podgoretsky © (21.12.04 18:42) [170]
>а надо, что бы код одинаково надежно работал как на Д2 так и на Д12,
Коды столько не живут :)
← →
Юрий Зотов © (2004-12-21 23:36) [174]> По каким моментам кода вы понимаете - профи или так... ?
Практически все уже сказал y-soft.
Каждая строчка абсолютно ясна. Каждая строчка абсолютно необходима. Каждая строчка минимальна по ресурсам. В каждой строчке - мысль. С закладкой на будущее. И мысль эта понятна всем, читающим код. А в особо тонких местах для этого вставлен краткий, но точный комментарий.
В некоторых задачах и в некоторых строчках - не просто мысль, а мысль еще и нетривиальная. Но при этом ни разу не изобретен уже известный велосипед. Зато несколько раз изобретены новые велосипеды. Но только тогда, когда они действительно нужны.
← →
Aldor © (2004-12-22 00:00) [175]Я недавно занялся составлением своего sample-кода (в приложение к резюме), и главный вопрос оказался такой: какого размера должен быть sample? Слабо представляю себе, что человек, отвечающий за прием кадров будет смотреть 10 листов кода. Однако при этом в коде на страничку мало что можно показать. Конечно, отсюда вывод: искать "середину". И приходим к следующему вопросу: "Что нужно показывать в своем sample-коде?"
← →
Юрий Зотов © (2004-12-22 01:03) [176]> Aldor © (22.12.04 00:00) [175]
> "Что нужно показывать в своем sample-коде?"
ИМХО, правду. То есть:
1. Это должен быть действительно собственный код, а не содранный с просторов Интернета.
2. Он должен показывать действительный уровень. Не больше, но не меньше.
3. 10 листов для не этого нужно. Достаточно нескольких процедур, каждая строк на 20, не более. Иначе никто не станет читать.
4. Неплохо привести пару-тройку разных кусков. Скажем, один кусок показывает знание API, другой - знание VCL, третий - умение строить нетривиальные алгоритмы.
5. Еще неплохо, если показанные куски стыкуются со спецификой конкретной конторы, куда пишется резюме.
← →
Anatoly Podgoretsky © (2004-12-22 01:43) [177]Johnmen © (21.12.04 23:21) [173]
Живут, у меня есть несколько проектов, которые пережили Д2-Д6, хоть это и неправильно технологически.
← →
Alex Konshin © (2004-12-22 01:46) [178]По каким моментам кода вы понимаете - профи или так...?
По количеству восклицательных знаков в выводимых сообщениях.
← →
Piter © (2004-12-22 01:53) [179]Sandman25 © (21.12.04 11:26) [12]
опытного программиста меньше операторов case
а по-моему мнению это как раз новички не используют case, ибо не знают про него, а используют множественный if, Типа:if Msg.Message = WM_USER then... ;
if Msg.Message = WM_PAINT then... ;
if Msg.Message = WM_PASTE then ... ;
вот по такому коду можно сказать, что его явно писал не профи.
Sandman25 © (21.12.04 11:32) [15]
а вместо одного обработчика нескольких разных кнопок следует использовать несколько разных обработчиков.
Sandman25, имхо, ты не прав :) Да новички вообще не знают, что на разные кнопки можно повесить один обработчик! Ты что... Ведь они задают обработчики исключительно через вкладку Events в инспекторе объектов, а там по двойному клику для каждого события создается свой обработчик, куда и пишется код.
y-soft © (21.12.04 12:28) [59]
Я бы добавил еще грамотное использование try..except и try..finally и предпроверку условий - "неопытные" обычно этим пренебрегают...
это 100%
Если профи открывает ссылку:Handle := OpenXXX
то он ее и закрывает:Handle := OpenXXX... ;
try
...
finally
CloseXXX(Handle);
end;
PVOzerski © (21.12.04 12:18) [54]
3) обращения к конкретному экземпляру класса из метода этого класса (в общем случае).
при этом признаком хорошего тона, вероятно, стоит признать явное употребление Self.
PVOzerski © (21.12.04 12:33) [62]
Вот еще вопрос: оптимизируется ли такое на этапе компиляции?
for i:=1 to length(MyDynArray)do
MyDynArray[i-1]:=100;
а чему тут оптимизироваться?
Кстати, имхо так правильнее:for i:=0 to High(MyDynArray)do
MyDynArray[i]:=100;
PVOzerski © (21.12.04 13:18) [83]
на предмет того, сколько раз будет вычитаться единица в процессе выполнения кода
ты про это... А ты посмотри как организованы циклы. При определенных обстоятельствахfor i:=x to y do
выполняется наоборот, то есть счетчик цикла крутится от высшего значения до нуля
← →
Sandman25 © (2004-12-22 09:07) [180][134] Fay © (21.12.04 17:09)
Проблема с бедламом элементарно решается.
Допустим, GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam() возвращает объект типа TMyObject, тогда описываем
procedure DoMyObjectOperations(const MyObject: TMyObject);
begin
MyObject.Set(1);
....
end;
и вызываем
DoMyObject(GetInternetConnection().Connected().GetServer().GetServerFrame().GetParam());
Так что подход Фаулера в принципе правильный :)
← →
Sandman25 © (2004-12-22 09:17) [181][179] Piter © (22.12.04 01:53)
Да новички вообще не знают, что на разные кнопки можно повесить один обработчик!
Когда новички начинают повышать свой уровень, они добираются до момента, когда всюду стремятся использовать Tag в качестве выбора, из-за этого им кажется, что они круто программируют. Затем они доходят до сравнений указателей, происходит небольшой рефакторинг и в результате получаем if Sender = Button1.
← →
Igorek © (2004-12-22 10:55) [182]Кудесник © (21.12.04 10:30)
По каким моментам кода вы понимаете - профи или так... ?
{*******************************************************}
{ }
{ Borland Delphi Runtime Library }
{ System Utilities Unit }
{ }
{ Copyright (C) 1995,99 InpriseCorporation }
{ }
{*******************************************************}
$-)
---
А если серьезно, то должно быть "коротко и ясно".
← →
Gero © (2004-12-22 10:58) [183]
> $-)
Это за директива компилятору?
← →
Gero © (2004-12-22 10:58) [184]
> Это за
Это что за
← →
Igorek © (2004-12-22 11:01) [185]Gero © (22.12.04 10:58) [183]
Ну высокооплачиваемый профи писал.
← →
Суслик © (2004-12-22 11:05) [186]
> [164] DiamondShark © (21.12.04 18:13)
> Не-а, ни разу не так. Мы обсуждаем тезис:
> "пользоваться локальными переменными грешно - функции лучше."
> со ссылкой на Фаулера.
Блин. Флудер. Без обид.
> > Если да, то я тебе сказал, где читать до полного просветления...
> Дело в том, что я Фаулера читал. Ничего подобного у него
> нет.
Гонишь. Если бы читал, то знал бы о чем речь. Без обид.
← →
Суслик © (2004-12-22 11:17) [187]
> [165] Sha © (21.12.04 18:17)
> > Суслик © (21.12.04 18:08) [163]
>
> Сначала ты попробуй объяснить мне, что есть boolean(Null)
> :)
Александр.
Попытаюсь тебе объяснить тему разговора.
Факт 1. Я наблюдал неустойчивое поведение компилятора в следующем случаеv: variant;
...
v := true; // false - для примера не важно
if v then // условие срабатывает неверно
Примеров приводить не буду, т.к. к сути обсуждаемого вопроса это отношения не имеет. Скажу только, что наблюдал я это в дельфи5. Судя по cpu клинило именно компилятор - он приводил не к тому целевому типу - в данном случае boolean. Если не ошибаюсь значение всегда была false.
Факт 2. С целью избежать неверного поведения в тех случаях, когда variant заведомо содержит boolean, я стал писать boolean(v).v: variant;
...
v := true;
if boolean(v) then
Как сказал АП - это есть грубая ошибка, т.к. анализируется только 1 байт, а не 2, которые отводятся на хранение wordbool (именно в этом типе в variant хранится булевы значения).
Меня данный факт, сообщенный безусловно уважаемым человеком, очень заинтересовал. И понятно почему - потому, что я использую такую конструкцию. Исследования cpu показали, что АП не прав - при переведении variant -> boolean анализируются 2 байта, а не 1. К тому же boolean(v) (повторю v содержит значение заведомо совместимое с boolean) нисколько не противоречит семантике явного приведения типов.
На какой вопрос бы я хотел получить ответ:
1) почему boolean(v) является грубой ошибкой в случае если v содержит значение совместимое с boolean?
2) Или АП не прав, т.к. не до конца разобрался в обсуждаемом предмете?
Меня этот вопрос (первый:) действительно волнует т.к. я не могу найти объяснения. А верить уважаемым людям воспитание приучило.
Буду безмерно благодарен если кто-то поможет... :)
С уважением, Тимохов Д.
← →
Суслик © (2004-12-22 11:22) [188]
> [168] PVOzerski © (21.12.04 18:31)
> Вот это-то самое интересное :^). При том, что поддержкой
> паскалевского типа boolean (1-байтовый, true=1) занимаются
> исключительно компилятор и RTL.
А что здесь интересного? Есть variant manager, который компилятор явно подключает при компиляции - своего рода compiler magic. В приведенном тобой примере с byte() компилятор кладет на твое желание привесит к byte, а приводит к word.
> [171] PVOzerski © (21.12.04 18:45)
> Присоединяюсь. Тем более, что выбор, что использовать, есть.
> Я вообще варианты только в случаях OLE/COM использую, потому
> что там без них просто нельзя.
>
> [172] Sha © (21.12.04 23:17)
> Присоединяюсь.
> На мой взгляд в данном случае вместо Variant было бы уместнее
> использовать longbool или integer.
Господа - значение совместимое с boolean приходит из БД в виде variant.
Выбора у меня нет :)
← →
Sha © (2004-12-22 11:48) [189]> Суслик © (22.12.04 11:22) [188]
> Господа - значение совместимое с boolean приходит из БД в виде variant.
> Выбора у меня нет :)
Ну, тогда, на мой взгляд, имеет смысл все это в try запихнуть.
Привычка не доверять внешним данным, хоть они и уверждают, что совместимы :)
← →
Суслик © (2004-12-22 11:50) [190]
> [189] Sha © (22.12.04 11:48)
Александр.
Спасибо за ответ.
Но поинмаешь дело то не в этом. Это понятно, что нужно защищаться и все такое.
Но посмотри мой пост тебе с объяснением вопроса.
Утверждением мастера было: нельзя приводить, т.к. при этом анализируется только младший байт. Но это же не так. Вот. Или так?
И вообще - не люблю делать грубых ошибок.
ЗЫ
Говорили мне учи асемблер :)
← →
Anatoly Podgoretsky © (2004-12-22 11:53) [191]АП был прав, я и другие привели доводы, да и ты опять довод привел, на который я тоже указывал, это разные версии компилятора.
Хочешь работь с варианты безопасно, так предварительно проверяй VarType
А явное приведение (преобразование) в данном случае грубая ошибка, ну не получил сейчас по ушам, так есть надежда получить в будущем. Поскольку это ВАРИАНТ, а у тебя явное приведение.
Про различные безопасные пути тебе рассказали, выбор есть.
Любишь ты поспорить :-)
← →
AlexG © (2004-12-22 12:02) [192]//Суслик
А зачем булеан использовать. Касти это дело к целочисленному значению: 0 - false, не 0 - true.
← →
Суслик © (2004-12-22 12:03) [193]
> [191] Anatoly Podgoretsky © (22.12.04 11:53)
> Любишь ты поспорить :-)
Ты не любишь :)))
Да и повод есть.
--------------
По делу.
Гарантия есть, что там varBoolean. Давай даже так. Допустим я даже это проверил.
Т.е. исходная позиция: vartype(v) = varboolean!
(на самом деле у меня обычно именно так)
Ты же вроде говорил, что boolean(v) будет работать некорректно не потому, что я не проверил boolean, а потому, что будет сравнение только младшего байта, а т.к. varBoolean представляется WordBool (т.е. 2 байта), то я совершаю грубую ошибку.
Я же спорил по этому, а не потому, что я не понимаю, что я опасно привожу.
Т.е. вопрос: в приведенном примере (где v имеет тип varBoolean) приведение boolean(v) есть грубая ошибка?
ЗЫ. Ответь и разойдемся по другим топикам :)))))))
← →
DiamondShark © (2004-12-22 12:06) [194]
> И вообще - не люблю делать грубых ошибок.
Ути-пути...
← →
Anatoly Podgoretsky © (2004-12-22 12:37) [195]Ну про байты и CPU код мы говорили, если это все и нет выше приведения wordbool к boolean то код в CPU ошибочный, поскольку идет сравнение с 1, было бы с 0 то все бы было в порядке. Именно эта ошибка часто и фигурирует в вопросах про проверку bool
Я и другие несколько раз подчеркнули этот факт, что true для bool это не 1
AlexG © (22.12.04 12:02) [192]
А как насчет vartype <> varBoolean это же нормальная ситуация для варианта, за что вообще считать varnull поскольку это по сути неопределенное значение, ни true ни false, а другие типы для варианта. Я сам в начале пути сталкивался с этим, пришлось вводить проверку на vartype, хорошо хоть при присваивании происходило исключение, долго причину искать не пришлось.
← →
Cobalt © (2004-12-22 12:54) [196]2 Anatoly Podgoretsky © (22.12.04 11:53) [191]
Тоесть, вы хотите сказать, что не во всех компиляторах работа с Variant в случаях, когда её значение использовалось как boolean/LongBool, использовалоCall @VarToBool?
← →
Суслик © (2004-12-22 12:57) [197]
> [195] Anatoly Podgoretsky © (22.12.04 12:37)
Код на дельфиvar
v: variant;
begin
// Присвоение делаю таким образом, чтобы заведомо в младшем
// байте был 0 и общее значение wordbool было отлично от 1, -1 и пр.
tvardata(v).vtype := varBoolean;
pword(@tvardata(v).vboolean)^ := $f00;
// b станер равно true, при любом значении v.vboolean, отличном от нуля.
b := boolean(v); <<<
end;
Теперь рассмотрим код cpu из variants - фукцния _VarToBool для типа varBoolean:mov eax,[ebp-$04]
cmp word ptr [eax+$08],$01 << это слово равное v.vboolean. Если > 0
sbb eax,eax
inc eax
mov [ebp-$05],al
jmp +$00000268
Моих скудных знаний асм хватило на то, чтобы опнять, что все дело в флажке CF, который принимает значение на строчке << и используется фукнцией sbb.
Т.е. любое значение v.vboolean отличное от нуля переводится в true.
Т.о. любое значение wordbool отличное от нуля переводится в true.
В чем же грубость ошибки?
← →
AlexG © (2004-12-22 13:08) [198]//Anatoly Podgoretsky ©
Честно говоря, я не совсем понял, что ты сказал вот здесь:за что вообще считать varnull поскольку это по сути неопределенное значение, ни true ни false, а другие типы для варианта.
Т.е. ты имеешь ввиду случай когда приходящее значение не является булевым? Если так, то лучше сразу определить для себя, что от туда должно приходить и поставить проверку, а так же, на всякий случай try ... except ...
← →
Anatoly Podgoretsky © (2004-12-22 13:08) [199]А ты рассмотри случай когда получишь из функции не varBoolean, как ты сказал она у тебя внешняя, а ты явно говоришь, а мне плевать какой тип, считай что varBoolean
И получишь разные результаты на разных версиях Дельфи, в Ж6 очень сильно изменили работу с вариантами, отчасти из постоянных ошибок при работе с ними.
Поэтому мое мнение явное приведение к типу, без проверки это типа в варианте есть ошибка, грубая или нет это вопрос подхода или терминологии, но это ошибка.
Это на мой взгяд, если у тебя другой, то это твое дело, нельзя же запретить использовать любые приведения, если душа желает. Когда ни будь возможно сможешь изменить точку зрения. Я не смогу, поскольку реально сталкивался с этими проблема и не однакратно.
← →
Sha © (2004-12-22 13:23) [200]break :)
← →
Суслик © (2004-12-22 14:21) [201]
> [200] Sha © (22.12.04 13:23)
:))
> [199] Anatoly Podgoretsky © (22.12.04 13:08)
> Поэтому мое мнение явное приведение к типу, без проверки
> это типа в варианте есть ошибка
Анатолий. Ну послушай внимательно.
Я не привожу без проверки!
Я привожу заведо равное varBoolean значение типа variant. Считай, что это проверено (так и есть, на самом деле). И до места boolean(v) дело просто не доейдет, если vartype(v) <> varBoolean.
Если я и забыл упомянуть об этих обстоятельствах, то:
1) Это моя вина, согласен
2) Я неоднократно поправился.
Мои посты не имеют задачей переспорить и затоптать кого-то. Нет!
Я хочу понять есть ли ошибка (грубая) в следущем коде, выраженная в том, что boolean(v) <> true:
var
v: variant;
begin
v := true;
if boolean(v) then ...
end;
ЗЫ.
Приведенный код корректно работает и для Д5 при любом значении tvardate(v).vboolean > 0. Т.е. также как в Д6.
← →
Anatoly Podgoretsky © (2004-12-22 16:09) [202]Ты думаешь речь идет про этот код?
Вопрос шире, об правомерности явного приведения к варианту.
А этот код ты мог бы упроститьbegin
if true then ...
end;
Но ты волен делать в своем коде, что угодно, а я лично буду избегать таких сомнительных конструкций.
И какой смысл крутить по новому кругу?
← →
Суслик © (2004-12-22 16:14) [203]
> [202] Anatoly Podgoretsky © (22.12.04 16:09)
> Ты думаешь речь идет про этот код?
Именно про него я и говорил :)
Предлагаю резюме: текущая реализация явного приведения wordbool к boolean (или variant к boolean, где vartype у variant = varBoolean) работает корректно.
← →
Anatoly Podgoretsky © (2004-12-22 16:28) [204]Ну говорил ты в разных вариантах, и только в 201 сказал, что обеспечишь vartype равным varBoolean, а если робеспечишь то и приведение лишнее, а вот то что у тебя когда давно не работало, то можно дать зуб на отсечение (не мой конечно), что проблема была именно с vartype. Кроме того за время существования вариантов они много изменили в компиляторе, видимо поэтому это уже не приведение, преобрахование, через compiler magic.
Мой же спич не об этом, а об опасности, особенно при работе с вариантами, по славнению с переменными bool.
← →
Суслик © (2004-12-22 16:41) [205]
> [204] Anatoly Podgoretsky © (22.12.04 16:28)
> Ну говорил ты в разных вариантах, и только в 201 сказал,
> что обеспечишь vartype равным varBoolean
Неправда. Я еще утром это говорил и извинился за введение в общественность в непонятки, т.к. и раньше это имел в виду.
Ранее ошибка была в следующей ситуации:
1. Var type = varBoolean (проверял)
2. При v := true несрабатывало if v then, тогда как срабатывало if boolean(v) then.
Зуб даю (тоже не свой), что анализ cpu говорил, что целевой тип при преобразовании ИЗ variant (в данном случае должен быть boolean) выбырался неверно. Я тогда еще не бывал на этом форуме и слабо представлял, как выяснять есть ли ошибка в списке признанных багов и куда вообще о багах сообщать. Поэтому поддтвердить документально детали ошибки не могу.
Предлагаю забить на тему.
Говорю же - зацепился за "грубую ошибку". Сам понимаешь, не всегда приятно слышать о чем-то, в чем ты уверен, потому как либо ты ошибаешься, либо тебя незаслуженно оклеветали :))) (первое страшнее).
← →
Piter © (2004-12-22 19:48) [206]Sandman25 © (22.12.04 9:17) [181]
они добираются до момента, когда всюду стремятся использовать Tag в качестве выбора
а ты на основе своего личного опыта гооришь? :)
Если честно - я не встречал людей, которые делали как ты говоришь.
И сам так никогда не делал, ибо далеко не сразу узнал, что такое Tag, зачем он и что туда можно писать что хочешь...
← →
Сергей Суровцев © (2004-12-23 08:42) [207]Если код написан красиво, правильно сформатирован и откоментирован и, главное, при этом работает на 50% медленнее чем мог бы - это профессионал.
← →
Gero © (2004-12-23 09:15) [208]
> Сергей Суровцев © (23.12.04 08:42)
Если код написан красиво, правильно сформатирован и откоментирован и, главное, при этом работает на 50% быстрее чем мог бы — это гуру.
← →
y-soft © (2004-12-23 12:25) [209]>Gero © (23.12.04 09:15) [208]
Если код написан красиво, правильно сформатирован и откоментирован и, главное, при этом работает на 50% быстрее чем мог бы — это гуру.
Неправда - если код красиво оформлен и понятен, да еще (о ужас!) прокомментирован, то это точно не гуру, ибо ход мыслей гуру простым смертным недоступен по определению :))
← →
Сергей Суровцев © (2004-12-23 12:27) [210]>Gero © (23.12.04 09:15) [208]
>и, главное, при этом работает на 50% быстрее чем мог бы — это
>гуру.
Нет. Не быстрее, а именно медленнее. Потому что настоящий профессионал уже сейчас думает о завтрашнем дне.
← →
Gero © (2004-12-23 12:31) [211]
> Сергей Суровцев © (23.12.04 12:27)
Ладно, тогда гуру это тот, чей код работает на 100% медленнее :)
← →
Юрий Зотов © (2004-12-23 13:36) [212]Кажется, до меня, наконец, дошло, как ответить на этот вопрос:
> По каким моментам кода вы понимаете - профи или так...?
На него уже давно ответил Чехов: словам должно быть просторно, а мыслям - тесно.
← →
ламер © (2004-12-23 19:43) [213]Сергей Суровцев © (04.12.23 12:27) [210]
весьма спорное заявление.
← →
Fay © (2004-12-23 22:00) [214]2 Сергей Суровцев © (23.12.04 12:27) [210]
У меня институт просто набит такими "гурами".
← →
Гарри Поттер © (2004-12-23 22:28) [215]Кудесник © (21.12.04 10:30)
По каким моментам кода вы понимаете - профи или так... ?
"Профи" - подразумевает что человек этим занимается профессонально, ведь так? Тогда никак неопределишь, уровень мастерства у некоторых кодеров работающих за деньги часто гораздо ниже чем у любителей пишущих фриваре.
← →
Marser © (2004-12-23 23:34) [216]
> Gero © (23.12.04 12:31) [211]
Не в обиду кое-кому буде сказано, но СС гуру всё-таки в "Потрепаться"...
← →
Palladin © (2004-12-24 03:55) [217]Еше разок.
Пррррофи, если уж на то пошло, OP или Delphi - есть максимальная лаконичность кода. Кто как из "страрших" эту лаконичность воспримет так и будет воспринято ОНО. Ну и собственно ОН или ОНА.
И еще разок: Хороший код - это лакончный код, сколько бы он не стоил с точки зрения оптимизации до нельзя.
← →
Resmar (2004-12-24 06:00) [218]> Marser © (23.12.04 23:34) [216]
Сказало отражение.
← →
Сергей Суровцев © (2004-12-24 07:20) [219]>Fay © (23.12.04 22:00) [214]
>2 Сергей Суровцев © (23.12.04 12:27) [210]
>У меня институт просто набит такими "гурами".
Ничегошеньки ты не понял. Это для того, чтобы каждые полгода повышать быстродействие на 10%. 1.1, 1.2, 2.0 и т.д. Об этом думает только профессионал. :)
← →
Piter © (2004-12-24 20:49) [220]Сергей Суровцев © (23.12.04 12:27) [210]
Потому что настоящий профессионал уже сейчас думает о завтрашнем дне
Ну если профессионализм только в переписывании своего кода - тогда увольте. Имхо, для настоящего профессионала всегда работа найдется.
← →
DiamondShark © (2004-12-24 20:59) [221]
> Имхо, для настоящего профессионала всегда работа найдется.
Именно! Повышать быстродействие на 10% в год.
:)
← →
Piter © (2004-12-24 21:39) [222]Сергей Суровцев © (24.12.04 7:20) [219]
Это для того, чтобы каждые полгода повышать быстродействие на 10%. 1.1, 1.2, 2.0 и т.д. Об этом думает только профессионал. :)
Об этом думает только человек, который боится за свою судьбу. Явно не профессионал.
Ясно, что всегда можно оптимизировать программу. Но чтобы специально писать медленнее...
← →
Anatoly Podgoretsky © (2004-12-25 02:33) [223]Он просто мудрый
← →
Fay © (2004-12-25 03:59) [224]Anatoly Podgoretsky © (25.12.04 2:33) [223]
"мудрый"
Какой замечательный эвфемизм 8)
← →
Marser © (2004-12-26 14:23) [225]
> Resmar (24.12.04 06:00) [218]
> > Marser © (23.12.04 23:34) [216]
>
> Сказало отражение.
А я и в "Потрепаться" просто вольный художник :-)
Когда-то в "Общих вопросах" сидел. Не исключено, что скоро вернусь в тематические.
По сабжу.
Понятие "профи" довольно расплывчатое. Но человека, написавшего не одну тысячу(десяток, сотню тысяч) строк кода, от новичка, ИМХО, обычно отличают:
Структурированность кода - повторяющиеся действия выносятся в отдельные подпрограммы или методы.
Оптимизированность - минимум лишнего. Операция, которую можно выполнить один раз, не заносится в цикл. При многократном обращении к полям экземпляра класса используется with.
Устойчивость кода, особенно в узких местах, с использованием(корректным!) try..except и try..finally.
... Et cetera
Ну и конечно, не следует забывать, что любую идею можно довести до абсурда.
> Сергей Суровцев © (24.12.04 07:20) [219]
> Ничегошеньки ты не понял. Это для того, чтобы каждые полгода
> повышать быстродействие на 10%. 1.1, 1.2, 2.0 и т.д. Об
> этом думает только профессионал. :)
Я-то понял, что вы имеете в виду. Только я таких "профессионалов" не очень воспринимаю. Думать о своём завтрашнем дне, пренебрегая интересами своей конторы это как-то...
← →
Anatoly Podgoretsky © (2004-12-26 14:50) [226]Когда-то в "Общих вопросах" сидел. Не исключено, что скоро вернусь в тематические.
Ты больше не пугай так
← →
Marser © (2004-12-26 14:56) [227]
> Anatoly Podgoretsky © (26.12.04 14:50) [226]
:-)
Сами ведь приглашали...
← →
Piter © (2004-12-26 15:25) [228]Marser © (26.12.04 14:23) [225]
При многократном обращении к полям экземпляра класса используется with.
Ну тут палка о двух концах... Плюсы очевидны, а вот отлаживать труднее. По крайней мере D7 не особо интеллектуальна в этом плане и если переменная находится внутри with, то при дебаге, при наведении на нее ничего не пишется (не обрабатывается ситуация, что переменная внутри with). Чтобы узнать значение этой переменной приходится вызывать watch list и прописывать ее "полный" путь. Неудобно.
Ну и не работает CTRL+click если переменная внутри with. В общем, тут не совсем продумано борландом...
← →
Anatoly Podgoretsky © (2004-12-26 15:27) [229]Marser © (26.12.04 14:56) [227]
Когда это было, столько воды утекло. :-)
← →
Piter © (2004-12-26 15:44) [230]А в чем проблема? Пусть Marser отвечает в тематических конференциях - я только за, человек он умный. Или типа у Анатолий на него зуб? Ну дык это фигня, у всех на кого-то есть зуб :)
← →
boriskb © (2004-12-26 15:50) [231]Piter © (26.12.04 15:44) [230]
человек он умный
От многих уже слышу.
Мне кажется вы путаете "умный" и "начитанный"
Умных фанатиков не бывает.
← →
Piter © (2004-12-26 18:44) [232]boriskb © (26.12.04 15:50) [231]
Умных фанатиков не бывает
Впервые слышу. Все самые умные люди - фанатики. Или лучше сказать фанаты. Или еще можно сказать одержимые свои делом.
И то, что Marser умен, следует из моих личных наблюдений. А то, что вы не согласны с человеком по религиозным причинам - это совсем другое. Человек может даже быть вам крайне неприятен и антисоциален. Но тем не менее он может быть умным.
Вот Билл Гейтс - однозначно очень умный человек. Хотя многие ему завидуют и кем только не называют.
← →
boriskb © (2004-12-26 19:00) [233]Piter © (26.12.04 18:44) [232]
Все самые умные люди - фанатики
Ради бога - ты имеешь полное право так думать. Хотя... если б подумал - не написал бы этого.
Фанатики и фанаты "две большие разницы" :)
что вы не согласны с человеком по религиозным причинам
а это вообще в стиле этого форума:) Самому выдумать - самому и опровергать.
PS А вообще - ты хороший парень - я давно хотел тебе это сказать :) :)
← →
Gero © (2004-12-26 19:07) [234]
> Умных фанатиков не бывает.
Умные бывают.
Мудрые — нет.
Имхо.
← →
Piter © (2004-12-26 20:19) [235]boriskb © (26.12.04 19:00) [233]
Ради бога - ты имеешь полное право так думать
ну ты соответственно имеешь право думать наоборот
Хотя... если б подумал - не написал бы этого
характерный прием демагогии
Самому выдумать - самому и опровергать
а что я выдумал и опроверг?
Gero © (26.12.04 19:07) [234]
Умные бывают.
Мудрые — нет
а чем отличается умный от мудрого?
← →
Igorek © (2004-12-26 21:23) [236]Вот еще придумал:
- если б ты подумал, то не написал бы такого
- ты тоже
:-)
← →
Игорь Шевченко © (2004-12-26 21:37) [237]Piter © (26.12.04 15:25) [228]
> По крайней мере D7 не особо интеллектуальна в этом плане
> и если переменная находится внутри with, то при дебаге,
> при наведении на нее ничего не пишется (не обрабатывается
> ситуация, что переменная внутри with). Чтобы узнать значение
> этой переменной приходится вызывать watch list и прописывать
> ее "полный" путь. Неудобно.
Смею тебя заверить, что отлаживать код с with приходится редко. Отгадай с трех раз, почему ?
С уважением,
← →
Anatoly Podgoretsky © (2004-12-26 21:56) [238]Наверно без ошибок пишешь, или, что даже страшно подумать, ты не используешь with :-)
← →
Gero © (2004-12-26 22:28) [239]
> а чем отличается умный от мудрого?
Наличием жизненного опыта, наверное. Но не только этим.
Сложный вопрос, я не настолько умен, чтобы дать ответ на него.
← →
Игорь Шевченко © (2004-12-26 22:30) [240]Anatoly Podgoretsky © (26.12.04 21:56) [238]
with использую, хотя не могу сказать, что часто, да и ошибки бывают, куда же без них. Но почему-то эти два события практически не совпадают :)
Мне проще вынести тот код, что находится внутри with, в отдельный метод того объекта, который упоминается в with, если овчинка стоит той выделки.
С уважением,
← →
Piter © (2004-12-26 23:38) [241]Gero © (26.12.04 22:28) [239]
Сложный вопрос, я не настолько умен, чтобы дать ответ на него
ну а если ты не знаешь что такое "мудрый", как же ты можешь оперировать этим понятием? :)
Игорь Шевченко © (26.12.04 21:37) [237]
Смею тебя заверить, что отлаживать код с with приходится редко
это уже другой вопрос. Это не мешает Дельфи стать чуточку умнее в этом плане. Хотя, может D8/2005 уже стали?
Игорь Шевченко © (26.12.04 22:30) [240]
Мне проще вынести тот код, что находится внутри with, в отдельный метод того объекта
зачастую with применяется вовсе не над твоим объектом...
← →
Игорь Шевченко © (2004-12-27 00:52) [242]Piter © (26.12.04 23:38) [241]
> зачастую with применяется вовсе не над твоим объектом...
Весьма вероятно. Любую конструкцию языка можно использовать простым неправильным или неудобным способом.
Я веду речь о том, что у меня использование этой конструкции не вызывает трудностей с отладкой. Не менее вероятно, что ошибки я стараюсь делать в других местах, нежели в тех, где используется with.
В конструции with TMySuperForm.Create(Application) do
...
отлаживать вроде нечего, TForm.Create отлажен давно.
С уважением,
← →
Gero © (2004-12-27 01:44) [243]
> ну а если ты не знаешь что такое "мудрый", как же ты можешь
> оперировать этим понятием?
А где я говорил, что не знаю значения слова «мудрый»?
← →
VMcL © (2004-12-27 07:52) [244]>>Piter © (26.12.04 20:19) [235]
>а чем отличается умный от мудрого?
Дураки не учатся на своих ошибках.
Умные учатся на своих ошибках.
Мудрые же учатся на чужих ошибках.
© не помню
← →
Piter © (2004-12-27 21:38) [245]Gero © (27.12.04 1:44) [243]
а где я говорил, что не знаю значения слова «мудрый»?
Ну значит ты не знаешь значение слова "умный". Ибо если ты знашь значение "умный" и значение "мудрый", то почему не можешь ответить на вопрос:
> а чем отличается умный от мудрого?
← →
Gero © (2004-12-27 22:10) [246]
> Piter © (27.12.04 21:38)
Значения слов знаю, четкого различий сказать не могу.
Вот ты же представляешь себе, значение слова «мудрый».
И значение слова «умный» тоже, думаю, представляешь.
Так ответь мне, чем они существенно различаются?
А вобще оба понятия довольно абстрактны.
Страницы: 1 2 3 4 5 6 7 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 1.2 MB
Время: 0.048 c