Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];

Вниз

if Value = True then   Найти похожие ветки 

 
StriderMan ©   (2009-12-22 11:46) [0]

Откопал недавно в исходниках FastReport такой кусок:

 if Mode = True then

Лично я считаю что это образчик неграмотного и безкультурного кода. За такое в нашем отделе принято посмеиваться и всячески подначивать написавшего. Естественно сосискатель написавшей такое в тесте скорее всего работу не получит. Тем не менее на одном из форумов большинство уверяет что это мол стиль такой, а не говнокод. Что думаете господа мастера? Может я не прав?


 
Sergey13 ©   (2009-12-22 11:54) [1]

А я давеча на заборе такое видел!!!
О времена! О нравы!


 
KSergey ©   (2009-12-22 12:11) [2]

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


 
Sha ©   (2009-12-22 12:15) [3]

В генофонде изредка встречается.


 
Дмитрий С ©   (2009-12-22 12:24) [4]

var
 B: Boolean;
begin
 B := Boolean(2);
 if B then ShowMessage("if B then");
 if B = true then ShowMessage("if B = true then");
end;


 
Sha ©   (2009-12-22 12:27) [5]

> Дмитрий С ©   (22.12.09 12:24) [4]

> var
>   B: Boolean;
> begin
>   B := Boolean(2);


За такое - расстрел на месте, как и за это:

if Mode = True then
begin
 Result := True
end
else begin
 Result := False
end;


 
Ega23 ©   (2009-12-22 12:28) [6]


>  if Mode = True then


а что такое Mode и каков ея тип данных?


 
StriderMan ©   (2009-12-22 12:29) [7]


> Дмитрий С ©   (22.12.09 12:24) [4]

Да, в boolean можно запихать много чего, целый байт! Но за такое вообще бить надо :)


 
Медвежонок Пятачок ©   (2009-12-22 12:29) [8]

procedure TfrxEngineOptions.SetSilentMode(Mode: Boolean);
begin
 if Mode = True then


 
StriderMan ©   (2009-12-22 12:30) [9]


> а что такое Mode и каков ея тип данных?

procedure TfrxEngineOptions.SetSilentMode(Mode: Boolean);
begin
 if Mode = True then
   FSilentMode := simSilent
 else
   FSilentMode := simMessageBoxes;
end;


 
Piter ©   (2009-12-22 12:32) [10]

Удалено модератором


 
StriderMan ©   (2009-12-22 12:38) [11]


> ну ты крут, в популярной компоненте отыскал нарушение стилевых  рекомендаций )) Думаю, тема обоснована не возмущением насчет  FastReport, а собственной гордостью - мол, какой я крутой, для меня это детская ошибка ))

повеселило :))))


> Если "if Value = True then" это единственная "ошибка" на весь код FastReport, то это практически идеальный компонент.

FastReport"ом я в целом доволен. Тем не менее подобные коды наводят на определенные мысли...


> Со временем приходит осознание, что идеального кода не бывает.

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


> Для крупных, массовых, коммерческих проектов это еще более актуально.

Для продуктов, продаваемых с исходниками красота кода очень важна


 
Хитрий Лис   (2009-12-22 12:38) [12]


> StriderMan ©   (22.12.09 11:46)  
> Лично я считаю...

Вот давайте на этом и остановимся :) хотя нет... немножко посклочничаем...


> ... что это образчик неграмотного и безкультурного кода.

А в чём, простите, неграмотность и безкультурье?


> За такое в нашем отделе принято посмеиваться и всячески подначивать написавшего.

Потому что, в вашем отделе работают глупые и недалёкие работники :) предположу, что по-молодости...


> Естественно сосискатель написавшей такое в тесте скорее всего работу не получит.

Соискателю повезёт :)


> Тем не менее на одном из форумов большинство уверяет что это мол стиль такой, а не говнокод.

Они правы, потому что они не глупые и не недалёкие :)


> Может я не прав?

Вы неправы.


 
StriderMan ©   (2009-12-22 12:42) [13]


> А в чём, простите, неграмотность и безкультурье?

В том что код содержит избыточность. Зачем это? Тогда для надежности можно было написать if (Mode = true) = true then


> Потому что, в вашем отделе работают глупые и недалёкие работники :) предположу, что по-молодости...

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


 
StriderMan ©   (2009-12-22 12:43) [14]


> В генофонде изредка встречается.

Нашел только в одном месте в CLX


 
Sha ©   (2009-12-22 12:48) [15]

> StriderMan ©   (22.12.09 12:43) [14]
> Нашел только в одном месте в CLX

В D7 таких мест точно больше,
причем есть проверки и на True и на False,
но не скажу, что от этого код плохо читается.


 
Хитрий Лис   (2009-12-22 13:01) [16]


> StriderMan ©   (22.12.09 12:42) [13]
> > А в чём, простите, неграмотность и безкультурье?
> В том что код содержит избыточность.

Код не содержит избыточности. Но даже если бы и содержал - то какое отношение это имеет к неграмотности и безкультурью ?

А если не секрет, какой продукт разрабатывает ваш коллектив ?
Мне так, чисто для себя, поржать...


 
Piter ©   (2009-12-22 13:06) [17]

Удалено модератором


 
Дмитрий Белькевич   (2009-12-22 13:11) [18]

>Лично я считаю что это образчик неграмотного и безкультурного кода.

Бескультурье ;)


 
boriskb ©   (2009-12-22 13:19) [19]

> [0] StriderMan ©   (22.12.09 11:46)


На мой взляд ничего криминального.
Такой факт может очем либо бОльшем сказать, но однозначно ничего не говорит.

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


 
Sha ©   (2009-12-22 13:20) [20]

Человеку свойствинно ошебаться.


 
Sergey13 ©   (2009-12-22 13:28) [21]

> [19] boriskb ©   (22.12.09 13:19)

Первоисточники говорят об ином.
"Каб не клин и не мох, так и плотник бы сдох" (с) старинная пословица.
Т.е. гвоздями, крутые плотники вообще могут не пользоваться. А вот необходимость патчей и прочих хотфиксов нашими предками никогда не оспаривалась.

8-)


 
StriderMan ©   (2009-12-22 13:50) [22]


> А если не секрет, какой продукт разрабатывает ваш коллектив

Неее, этого я не скажу. Но продукт серьезный. Продается к счастью без исходников :)


> Да чего тут обсуждать. Не знаю сколько автору лет, но предполагаю,
>  что < 25

26, и я не бородат :)


> Бескультурье ;)

пардон, да. Увидел свою неграмотность уже после поста.


> Но даже если бы и содержал - то какое отношение это имеет к неграмотности и безкультурью ?

самое прямое.


 
RWolf ©   (2009-12-22 13:56) [23]

> if Mode = True then

Вовсе не факт, что код, вызывающий эту конструкцию, написан на Delphi, и не передаёт в переменной Mode своё понимание булевой Истины (каковая в разных языках может быть 1, -1, 0xFF и проч.).

Так что — да, неграмотный код.
Правильный способ только один — if Mode then...

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


 
StriderMan ©   (2009-12-22 14:00) [24]

ну хорошо, покопался вот в исходниках старых, нашел такое:

if (SomeObj1.SomeSubObject.SomeProp = true) or (SomeObj2.SomeSubObject.SomeProp = false) or (SomeObj3.SomeSubObject.SomeProp = true) then
 DoSomething


Это что, тоже нормально?


 
Alx2 ©   (2009-12-22 14:02) [25]

Мне не нравится такой изврат над булевыми выражениями. Но если того где-то требуют правила оформления кода - нефиг фыркать, имхо. Привычка могла оттуда пойти. А вот в некоторых вузах преподы учат ребят писать в таком стиле - вот это, уже, перебор. Код должен читаться легко. Кому-то стало легче от описанного подхода, кому-то противнее. Кто-то предпочитает держать читателя в курсе дела через "говорящие" имена и короткие методы, что не обязательно требует сравнения с истиной.
Все равно, в итоге победит более способный ритор. Тут не математика :)
В свое время, рекомендации креститься тремя перстами, вместо двух, привели к расколу.


 
KSergey ©   (2009-12-22 14:10) [26]

> StriderMan ©   (22.12.09 12:42) [13]
> Потому что в нашем отделе занимаются коллективной разработкой
> и есть определенные правила хорошего тона, которых мы придерживаемся

Молодцы, возьмите пирожок с полочки.
Но один на всех, раз уж вы единый коллектив.

Я не вижу вреда от приведенного кода, хотя и пользы, конечно, тоже.
Разовые случаи его встречания могут объясняться совершенно разными причинами.
Вплоть до того, что в этом месте автор планирует в будущем вместо True написать значение какой-то настройки. Или просто "сроки горели".


 
StriderMan ©   (2009-12-22 14:15) [27]


> в будущем вместо True написать значение какой-то настройки. Или просто "сроки горели".

Всем известно что нет ничего более постоянного чем временное.


 
Rouse_ ©   (2009-12-22 14:23) [28]

реализация кода в виде if B = True then говорит как минимум о не полном предствалении корректной работы с типами переменных. Обычно авторы такого кода используют до кучи итератор I типа DWORD, а потом долго размышляют почему-же всетаки выполняется следующий цикл
for I := 0 to List.Count - 1 do с учетом что List.Count реально равен нулю.


 
Думкин ©   (2009-12-22 14:26) [29]

C:\Program Files\Borland\BDS\4.0\source\Win32\vcl\DdeMan.pas

function TDdeMgr.AllowWildConnect(hszApp: HSZ; hszTopic: HSZ): HDdeData;
var
 conns: packed array[0..1] of THSZPair;
begin
 Result := 0;
 if hszTopic = 0 then Exit;
 if AllowConnect(hszApp, hszTopic) = True then
 begin
   conns[0].hszSvc := FHszApp;
   conns[0].hszTopic := hszTopic;
   conns[1].hszSvc := 0;
   conns[1].hszTopic := 0;
   Result := DdeCreateDataHandle(ddeMgr.DdeInstId, @conns,
     2 * sizeof(THSZPair), 0, 0, CF_TEXT, 0);
 end;
end;

C:\Program Files\Borland\BDS\4.0\source\Win32\vcl\ComCtrls.pas

procedure TToolBar.SetButtonHeight(Value: Integer);
begin
 if Value <> FButtonHeight then
 begin
   FButtonHeight := Value;
   if ThemeServices.ThemesEnabled = True then
     RecreateWnd;
   RecreateButtons;
 end;
end;

procedure TToolBar.SetButtonWidth(Value: Integer);
begin
 if Value <> FButtonWidth then
 begin
   FButtonWidth := Value;
   if ThemeServices.ThemesEnabled = True then
     RecreateWnd;
   RecreateButtons;
 end;
end;


 
Rouse_ ©   (2009-12-22 14:30) [30]


> Думкин ©   (22.12.09 14:26) [29]

То что часть исходников VCL писали совершенно левые люди и иногда с грубейшими ошибками, всем известно и это как раз абсолютно не говорит о том это правильный подход :)


 
StriderMan ©   (2009-12-22 14:36) [31]


> используют до кучи итератор I типа DWORD, а потом долго размышляют почему-же всетаки выполняется следующий цикл

с такими извратами не встречался.

Чаще вижу что-то вроде

if (a=b) then
 Result := true
else  
 Result := false;

вместо православного Result := a = b;


 
Б   (2009-12-22 14:42) [32]

А есть ещё и такие перлы:


Function IsTrue(B: boolean): boolean;
begin
 If (B = True) then Result:= True
 else                    Result:= False;
End;



 
Хитрий Лис   (2009-12-22 14:42) [33]


> Думкин ©   (22.12.09 14:26) [29]

Как посмел! Ты же покусился на святое!

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


 
StriderMan ©   (2009-12-22 14:55) [34]


> Piter ©   (22.12.09 13:06) [17]
> Да чего тут обсуждать. Не знаю сколько автору лет, но предполагаю,
>  что < 25

(Автору > 25) = true :)


 
Mystic ©   (2009-12-22 14:56) [35]

Я так иногда пишу. Обычно правда = False. И не потому, что не знаю, а потому что мне так больше нравится. Особенно, когда название переменной не содержит явно вопроса (IsFile), как например в этом случае.

if Mode then // а что такое Mode??? Вообще, эта строка по английски коробит
if Mode = True then// тут как-то более явно, что Mode это переменная типа Boolean


 
StriderMan ©   (2009-12-22 15:02) [36]


> // а что такое Mode??? Вообще, эта строка по английски коробит


procedure TfrxEngineOptions.SetSilentMode(Mode: Boolean);
begin  
 if Mode = True then
   FSilentMode := simSilent  
 else    
   FSilentMode := simMessageBoxes;
end;



 
Alx2 ©   (2009-12-22 15:04) [37]

так и просится вместо mode: boolean переменная типа а-ля TSilentMode


 
Дмитрий Тимохов   (2009-12-22 15:05) [38]

не вижу ничего плохого, иногда сам так пишу, когда считаю, что читающему будет понятней.

не вижу ничего зазорного.


 
Piter ©   (2009-12-22 15:07) [39]

Rouse_ ©   (22.12.09 14:23) [28]
реализация кода в виде if B = True then говорит как минимум о не полном предствалении корректной работы с типами переменных


... в Delphi. Это да. Но это не говорит о слабом уровне программиста как таковом, он легко мог писать по старой памяти. Например, в PHP писать так "if a then" вообще крайне не рекомендуется, ибо там динамическая типизация.


 
Ega23 ©   (2009-12-22 15:13) [40]

function ConvertBooleanValue(const Value : Boolean) : Boolean;
begin
 if (Value = True) then
 begin
   Result := False;
 end
 else
   if (Value = False) then
   begin
     Result := True;
   end
   else
     raise Exception.Create("Unknown boolean value");
end;


 
Mystic ©   (2009-12-22 15:15) [41]

> StriderMan ©   (22.12.09 15:02) [36]

И чем это плохо? Вообще, условие if a = b then встречается часто и никаких трудностей с его пониманием нет, нужный шаблон в мозгу срабатывает на автомате. if a then уже встречается реже.

Вообще, ход моей мысли такой: "Если a равно True", что кодируется в if a = True, потом оптимизируется до if a. При чтении кода ситуация часто обратная: if a в конце концов переходит в сознании до "Если a равно True".

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


 
pasha_golub ©   (2009-12-22 15:16) [42]


> Особенно, когда название переменной не содержит явно вопроса
> (IsFile), как например в этом случае.

Вы имеете мои +100. Читабельность превыше всего!


 
Медвежонок Пятачок ©   (2009-12-22 15:19) [43]

Но надо же еще сам результат сравнения аргумента с литералом сравнить на истинность.

"если условие "а равно истине" истинно"

то есть читабельнее так:
if (a = true) = true then ....


 
Ega23 ©   (2009-12-22 15:20) [44]


> pasha_golub ©   (22.12.09 15:16) [42]


У тебя же было что-то такое с вариантами. Когда явно на = true нужно было сравнивать.


 
Alx2 ©   (2009-12-22 15:21) [45]

if isTrueAndNothingExceptTrue((a = true) = true) then ....


 
Sergey Masloff   (2009-12-22 15:21) [46]

Rouse_ ©   (22.12.09 14:23) [28]
>реализация кода в виде if B = True then говорит как минимум о не полном >предствалении корректной работы с типами переменных. Обычно авторы >такого кода используют до кучи итератор I типа DWORD, а потом долго >размышляют почему-же всетаки выполняется следующий цикл
>for I := 0 to List.Count - 1 do с учетом что List.Count реально равен нулю.
Да ну, это анекдот. Те кто уже знают про DWORD такое писать не могут ;-)


 
StriderMan ©   (2009-12-22 15:22) [47]


> Но так спор из-за шести символов, которые никак не влияют на читабельность

Так из-за подобной фигни и возникают все холивары :)


 
Mystic ©   (2009-12-22 15:24) [48]

Ой, до извратства можно дойти как угодно


 {$B-}
 Result := SelectDialog.Execute() and (IsDirExists(SelectDialog.Path) or CreateDir(SelectDialog.Path)) and CopyFiles(S, SelectDialog.Path);


 
StriderMan ©   (2009-12-22 15:30) [49]


> Mystic ©   (22.12.09 15:24) [48]

че, очень изящно вышло ;)


 
RWolf ©   (2009-12-22 15:33) [50]


> Читабельность превыше всего!

Выражение
if Form1.Visible then DoSomething;
читабельнее, чем
if Form1.Visible=True then DoSomething;


 
Дуп   (2009-12-22 15:38) [51]

> Rouse_ ©   (22.12.09 14:30) [30]

Я никого не защищал!! :)

Самое интересное у нас было на семинаре по Аксапте недавно. Консультант говорит как не надо накладывать фильтр на данные и для примера как надо лезет в родной код от микрософта, а там это и сидит - неправильное. Матов было много. :)

Причем то неправильное, оно не на уровне читабельности и красивости. Там реальный косяк. Ну, и я же вроде упоминал уже как там было, что 2=1.
(1/3+1/3+1/3)+(1/3+1/3+1/3)=1.


 
Дмитрий Тимохов   (2009-12-22 15:40) [52]

Оба плохо читаются, хорошо читается



if Form1.Visible=True then
  DoSomething;



 
Alx2 ©   (2009-12-22 15:40) [53]

>Дуп   (22.12.09 15:38) [51]

Кэш твой - враг твой :)


 
Mystic ©   (2009-12-22 15:40) [54]


> Выражение
> if Form1.Visible then DoSomething;
> читабельнее, чем
> if Form1.Visible=True then DoSomething;


Это да. Но если брать Mode вместо Form1.Visible, то мне больше нравится второй вариант. На самом деле я большинство условных операторов мысленно проговариваю, и получается нечто такое:

если Form1 видима равно True, то { хм... }
если Form1 видима, то... { нормальное предложение }
если режим то ... { хм... }
если режим установлен в True, то  { в принципе нормально }


> че, очень изящно вышло ;)


Это сокращенный вариант, в деле было пять AND-ов, внутри пару OR-ов, все работало с ShellApi функциями и оператор занимал три строки.


 
Думкин ©   (2009-12-22 15:43) [55]


> Alx2 ©   (22.12.09 15:40) [53]

Мне его чистить жалко. Я тут оказывается, один пароль посеял. :(


 
RWolf ©   (2009-12-22 15:43) [56]


> Дмитрий Тимохов   (22.12.09 15:40) [52]

Люди не говорят «Если форма видима — это правда, то сделай то-то».
Естественный язык звучит так: «Если форма видима — сделай то-то».


 
RWolf ©   (2009-12-22 15:46) [57]


Mystic ©   (22.12.09 15:40) [54]

> Это да. Но если брать Mode вместо Form1.Visible, то мне
> больше нравится второй вариант.


Это потому, что для переменной Mode выбрано плохое имя, не соответствующее её назначению.


 
Дмитрий Тимохов   (2009-12-22 15:46) [58]

>>RWolf ©   (22.12.09 15:43) [56]

Читай Мистика выше - полностью согласен с ним.
Насчет визибле, может и поторопился.


 
Alx2 ©   (2009-12-22 15:47) [59]

И тип! Тип - тоже! :)


 
StriderMan ©   (2009-12-22 15:51) [60]


> Это потому, что для переменной Mode выбрано плохое имя, не соответствующее её назначению.

это уже другой холивар :) пусть вместо Mode будет абстрактное Value


 
RWolf ©   (2009-12-22 16:40) [61]

Абстрактные идентификаторы не есть хорошо; в идеале, программа должна напоминать пересказ алгоритма человеческим языком. Спору нет, бывают случаи, когда абстрактное имя приходится к месту (или просто нельзя переименовать идентификатор), в таких случаях можно и с True/False сравнить.
Вообще, это вопрос восприятия булевых переменных. Если для человека это простое перечисление из двух абстрактных значений «True» и «False», для него, наверное, нагляднее будет сравнивать переменную с константой. Лично я воспринимаю такую переменную, как условие ветвления, и с этой точки зрения такое сравнение просто захламляет код.


 
DVM ©   (2009-12-22 17:08) [62]


> StriderMan ©   (22.12.09 11:46) 


>  if Mode = True then
>
> Лично я считаю что это образчик неграмотного и безкультурного
> кода. За такое в нашем отделе принято посмеиваться и всячески
> подначивать написавшего.

На мой взгляд такая конструкция более наглядна. Сам правда так не пишу (исключительно из за того что так длиннее), но не вижу никаких причин посмеиваться над такой записью.


 
sniknik ©   (2009-12-22 17:46) [63]

> в некоторых подобное необходимо (типа PHP).
jet если указывать в where boolper = true запрос работает быстрее чем where boolper, хотя результат и одинаковый.
во втором случае ни индексы ни оптимизатор не работает как понимаю.


 
ANB   (2009-12-22 18:05) [64]


> where boolper

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


 
Кто б сомневался ©   (2009-12-22 18:09) [65]


> Откопал недавно в исходниках FastReport такой кусок:
>
>  if Mode = True then
>
> Лично я считаю что это образчик неграмотного и безкультурного
> кода.


В разных ситуациях, следует по разному писать. Нужно делать код как можно понятнее.
К примеру лучшим вариантов для этого кода, будет не
If mode = true then и не
if Mode then

И то и то не очень.

Лучше так

const
 GAME_MODE_ON = true;  // для примера

if Mode = GAME_MODE_ON then


 
Piter ©   (2009-12-22 18:10) [66]

Удалено модератором


 
Кто б сомневался ©   (2009-12-22 18:10) [67]

Здесь сразу понятно какой режим включен. Первый или второй, т.е. не нужно возвращатся и смотреть что это за Mode.


 
Кто б сомневался ©   (2009-12-22 18:12) [68]


> Piter ©   (22.12.09 18:10) [66]
>
> Кто б сомневался ©   (22.12.09 18:09) [65]
> if Mode = GAME_MODE_ON then
>
> ну это ты уже параноишь.


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

Есть метод, который принимает
RestartWindows(AShutdown: boolean);

Иначе если false рестарт.

Я пишу:

const
 SHUTDOWN = true;
begin
 RestartWindows(SHUTDOWN);

Вот для таких случаев это очень и очень удобно.


 
Кто б сомневался ©   (2009-12-22 18:16) [69]

или
GetIcon(Icon: Ticon, LargeIcon: boolean);

Пишем.
const
 GET_LARGE_ICON = true;

GetIcon(vIcon, GET_LARGE_ICON);

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


 
Дмитрий Белькевич   (2009-12-22 18:31) [70]


procedure TfrxEngineOptions.SetSilentMode(Mode: Boolean);
begin  
if Mode = True then
  FSilentMode := simSilent  
else    
  FSilentMode := simMessageBoxes;
end;



procedure TfrxEngineOptions.SetSilentMode(Silent: Boolean);
begin  
if Silent then
  FSilentMode := simSilent  
else    
  FSilentMode := simMessageBoxes;
end;


 
Piter ©   (2009-12-22 18:37) [71]

вообще-то для этого придумали перечисляемые типы. Например:

TIconType = (itBigIcon, itSmallIcon);

пишем

GetIcon(vIcon, itBigIcon)

А ты перечисляемый тип из двух элементов решил заменить на boolean, как на подходящий по размерности. С таким же успехом любой перечисляемый тип можно заменить на byte и кучей самостоятельно определенных констант. Вопрос - нафига.


 
Кто б сомневался ©   (2009-12-22 18:43) [72]


> вообще-то для этого придумали перечисляемые типы. Например:


Я знаю, но там где два значения, удобнее и практичнее использовать boolean. Не нужно ничего объявлять лишнего.
Собственно так делал и borland в своем registry и вообще часто встречается конструкция.


 
Ega23 ©   (2009-12-22 18:44) [73]

procedure TfrxEngineOptions.SetSilentMode(Mode: Boolean);
const
 ar : array[0..1] of (какой-то тип данных) = (simMessageBoxes, simSilent);
begin  
 FSilentMode := ar[Ord(Mode)];
end;


 
Mystic ©   (2009-12-22 18:48) [74]


procedure TfrxEngineOptions.SetSilentMode(Mode: Boolean);
const
ar : array[Boolean] of (какой-то тип данных) = (simMessageBoxes, simSilent);
begin  
FSilentMode := ar[Mode];
end;


??


 
Mystic ©   (2009-12-22 18:49) [75]

Только вместо ar лучше какой-нить SimTable


 
GDI+   (2009-12-22 18:50) [76]


> StriderMan ©   (22.12.09 11:46)
>
> Откопал недавно в исходниках FastReport такой кусок:
>
>  if Mode = True then


Писал бывший сишник, так как в C есть true и TRUE.


 
Rouse_ ©   (2009-12-22 18:54) [77]


>
> Писал бывший сишник, так как в C есть true и TRUE.

Ааа, а там видимо уже отменили if (B) {} или if (!B) {}


 
RWolf ©   (2009-12-22 18:58) [78]


> Mystic ©   (22.12.09 18:48) [74]


Лучше всё же так:
procedure TfrxEngineOptions.SetSilentMode(Mode: TSilentMode);
begin  
FSilentMode := Mode;
end;


 
Piter ©   (2009-12-22 19:02) [79]

Кто б сомневался ©   (22.12.09 18:43) [72]
Я знаю, но там где два значения, удобнее и практичнее использовать boolean


твой вариант:

GET_LARGE_ICON = true;
GET_SMALL_ICON = false;


мой вариант:

TIconType = (itSmall, itBig);

чем твой вариант удобнее, поясни пожалуйста?

насчет практичности - что ты имел в виду? И то и другое в памяти занимает 1 байт (если ты про это).


 
Piter ©   (2009-12-22 19:04) [80]

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

TIconType = (itSmall, itBig, itVeryBig);


 
Кто б сомневался ©   (2009-12-22 19:13) [81]


> Кто б сомневался ©   (22.12.09 18:43) [72]
> Я знаю, но там где два значения, удобнее и практичнее использовать
> boolean
>
> твой вариант:
>
> GET_LARGE_ICON = true;
> GET_SMALL_ICON = false;
>
> мой вариант:
>
> TIconType = (itSmall, itBig);
>
> чем твой вариант удобнее, поясни пожалуйста?
>
> насчет практичности - что ты имел

в виду? И то и другое в памяти занимает 1 байт (если ты про это).


Вариант в boolean в функциях используется намного чаще чем в enum типами. в API в VCL - да собственно везде.
Для меня это удобнее

1. Не нужно объявлять при написании функции ничего
2. Не усложняется код в теле функции
3. При работе с функцией, не нужно искать enum тип, обычно приходится жать ctrl + lmb - чтобы посмотреть что там за типы.
4. Не усложняется код, представь если будет куча Enum типов по 2 значения, все б сильно матерились тогда.


 
RWolf ©   (2009-12-22 19:14) [82]

[72][79]
Паскаль — язык со строгой типизацией; раз она есть — надо использовать её преимущества, тут и спорить не о чем.


 
RWolf ©   (2009-12-22 19:17) [83]


Кто б сомневался ©   (22.12.09 19:13) [81]
> GET_LARGE_ICON = true;
> GET_SMALL_ICON = false;

Любую из таких констант можно передать в любую из функций с параметром boolean — а это потенциальные баги.
TIconType из [79] можно передать только в функцию, которая этот тип принимает.


 
Кто б сомневался ©   (2009-12-22 19:18) [84]


> Любую из таких констант можно передать в любую из функций


Ну дык ноги плохому танцору мешают :)
Вобще такие вещи всегда локально объявлены.


 
Piter ©   (2009-12-22 19:57) [85]

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


 
Кто б сомневался ©   (2009-12-22 20:04) [86]


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


Что значит "правильнее"? и так и так правильно.
Просто вспомни часто ли ты встречал в функциях enum тип из двух значений, и вспомни как часто встречаются boolean в любых функциях будь то win API или VCL или еще что-то . Вот это и будет ответ.
А это просто надстройка над boolean - для более удобного чтения.


 
grammar-nazi   (2009-12-22 20:08) [87]


> RWolf ©   (22.12.09 18:58) [78]
>
> Лучше всё же так:
> procedure TfrxEngineOptions.SetSilentMode(Mode: TSilentMode);
>
> begin  
> FSilentMode := Mode;
> end;


нет, не лучше. SetSilentMode(Mode: Boolean) разрешает установить один из двух режимов, SetSilentMode(Mode: TSilentMode) разрешает установить один из (High(TSilentMode) - Low(TSilentMode) + 1) режимов.


 
Piter ©   (2009-12-22 21:16) [88]

Кто б сомневался ©   (22.12.09 20:04) [86]
Что значит "правильнее"?


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


 
Virgo_Style ©   (2009-12-22 21:50) [89]


> SetSilentMode(Mode: TSilentMode) разрешает установить один
> из (High(TSilentMode) - Low(TSilentMode) + 1) режимов.


А уж TSilentModes: set of TSilentMode вообще позволяет творить чудеса.

Но это все хорошо при условии, что нужны куча режимов или чудеса.

"Каждому овощу - свой фрукт" - кажется, так говорит кто-то из гуру? ;)


 
oxffff ©   (2009-12-22 22:35) [90]

А если подумать и рассмотреть такой вариант.

function True:integer;
begin
result:=15;
end;

{$R *.dfm}

procedure TForm4.FormCreate(Sender: TObject);
var a:integer;
begin
a:=15;
if a=true then showmessage("GOOD");
end;


 
oxffff ©   (2009-12-22 22:45) [91]

Технически можно сделать так.
Но Delphi 2010 это не хавает.

mytype=record
b:integer;
class operator Equal(a: mytype; b: boolean) : Boolean;
end;

procedure TForm4.FormCreate(Sender: TObject);
var a:mytype;
begin
if a=True then showmessage("Stuff");
end;


 
oxffff ©   (2009-12-22 22:47) [92]


> Но Delphi 2010 это не хавает.


Собственно это проблемы Delphi. :)


 
Rouse_ ©   (2009-12-23 01:34) [93]


> А если подумать и рассмотреть такой вариант.
>
> function True:integer;
> begin
> result:=15;
> end;

технически можно сделать и так:


#define TRUE = FALSE

#define TRUE (!FALSE)

#define FALSE (!TRUE)

#if !defined(FALSE) || FALSE != 0
#define FALSE 0
#endif

#defineTRUE (1==1)


но такая фигня получиться :)


 
Германн ©   (2009-12-23 01:43) [94]


> Rouse_ ©   (23.12.09 01:34) [93]

Извращенец высшего класса получится! (Без мягкого знака :)


 
Дмитрий Белькевич   (2009-12-23 02:32) [95]

#define TRUE (Math.random() > 0.5)
#define FALSE (Math.random() < 0.5)


 
Джо ©   (2009-12-23 02:40) [96]

Какой же бессмысленный и беспощадный этот цэпэпэ! :)


 
Аноним ©   (2009-12-23 02:45) [97]


> StriderMan ©   (22.12.09 12:38) [11]

шикарно
а зачем пост Piter`а то удалили?


 
Аноним ©   (2009-12-23 02:50) [98]


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

зато как фекабельно остальным



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

Форум: "Прочее";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.72 MB
Время: 0.007 c
2-1262255716
Александр К
2009-12-31 13:35
2010.03.07
Помогите перевести с c++ в pas (Оочень маленький участок кода)


2-1262794714
antonn
2010-01-06 19:18
2010.03.07
запуск консольной утилиты с передачей ей параметра в OEM


6-1213405371
antoxa2005
2008-06-14 05:02
2010.03.07
Подскажите, а как добавить вложение к письму стандарного mail аге


15-1261603824
Юрий
2009-12-24 00:30
2010.03.07
С днем рождения ! 24 декабря 2009 четверг


2-1261998166
citizen
2009-12-28 14:02
2010.03.07
Дескрипторы дочерних окон





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский