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

Вниз

Обсудим if?   Найти похожие ветки 

 
DrPass ©   (2007-12-14 18:39) [40]


> Фунции типа
> bool OR(condition1, condition2, ...)
> bool AND(condition1, condition2, ...)

А использовать так: if OR(condition1, condition2) then ...


 
turbouser ©   (2007-12-14 18:43) [41]


> DrPass ©   (14.12.07 18:39) [40]


iif(OR(condition1, condition2),"Yes","No")


 
DrPass ©   (2007-12-14 19:05) [42]


> turbouser ©   (14.12.07 18:43) [41]

Действительно, эта конструкция на порядок современнее, продуманней, удобнее и полезнее, чем архаичный if. С сегодняшнего дня никаких if"ов!


 
Kostafey ©   (2007-12-14 19:06) [43]

Надо не от if избавляться, а фкнкцию
наподобие приведенного

> [37] clickmaker ©   (14.12.07 18:25)
>
> > Что такое iff ненашел.
>
> any IIf(condition, true_value, false_value)
> это типа (a == b ? c : d) в плюсах

в Delphi (или другие языки) добавлять


 
ketmar_   (2007-12-14 19:28) [44]

в некоторых "или других языках" тернарный оператор уже есть.


 
Kostafey ©   (2007-12-14 19:36) [45]

> [44] ketmar_   (14.12.07 19:28)
> в некоторых "или других языках" тернарный оператор уже есть.

Значит добывить в те, в которых нет! :)


 
ketmar_   (2007-12-14 19:52) [46]

>Значит добывить в те, в которых нет! :)
право же, без этой ерунды вполне нормально живётся. а вот без анонимных функций и closures намного менее приятно.


 
Kostafey ©   (2007-12-14 20:06) [47]

> [46] ketmar_   (14.12.07 19:52)
> право же, без этой ерунды вполне нормально живётся.

Про то и спор...


> а вот без анонимных функций и closures намного менее приятно.

Уй какие слова страшные :)


 
boa_kaa ©   (2007-12-14 22:42) [48]


> turbouser ©   (14.12.07 18:25) [36]
> > Kolan ©   (14.12.07 18:23) [35]Public Function IIf( _
>   ByVal Expression As Boolean, _    ByVal TruePart As Object,
>  _    ByVal FalsePart As Object _ ) As Object

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


 
Petr V. Abramov ©   (2007-12-14 23:30) [49]


> @!!ex ©   (14.12.07 15:42) [11]
> Та ну.
> if никуда не денется. Может в интрепретируемых языках от
> него и избавятсья

смотрим на развитие SQL, кторый по определению самый декларативный. Те, кто хотел жить, дополнил его процедурными расширениями, типа T-SQL, PL/SQL и тдд. Сам SQL активно дополняется всякими nullf, ifnull, case...when и пр. в зависимости от СУБД.
Почему?
Потому что декларативный язык ПРЕКРАСНО справляется с задачей ДАЙ, но ПО ОПРЕДЕЛЕНИЮ не может справться с задачей ЖРИ.


 
AntiUser   (2007-12-15 03:05) [50]


if reddat=false then begin
 if (ds.data1d.data="") or (ds.data1m.data="") or (ds.data2d.data="") or (ds.data2m.data="") or (ds.data1g.data="") or (ds.data2g.data="") then
 ErrorOpis.Add(errdat+AddNumberAndLine(ds.data1d.Line))
 else begin
   val(ds.data1d.data,d1d,c);
   if c<>0 then ErrorOpis.Add(errdat+AddNumberAndLine(ds.data1d.Line))
   else begin
     val(ds.data1m.data,d1m,c);
     if c<>0 then ErrorOpis.Add(errdat+AddNumberAndLine(ds.data1m.Line))
     else begin
       val(ds.data1g.data,d1g,c);
       if c<>0 then ErrorOpis.Add(errdat+AddNumberAndLine(ds.data1g.Line))
       else begin
       if (FirstDate>d1g) and (d1g<>0) then FirstDate:=d1g;
       val(ds.data2d.data,d2d,c);
         if c<>0 then ErrorOpis.Add(errdat+AddNumberAndLine(ds.data2d.Line))
         else begin
           val(ds.data2m.data,d2m,c);
           if c<>0 then ErrorOpis.Add(errdat+AddNumberAndLine(ds.data2m.Line))
           else begin
             val(ds.data2g.data,d2g,c);
             if c<>0 then ErrorOpis.Add(errdat+AddNumberAndLine(ds.data2g.Line))
             else begin
               if (EndDate<d2g) and (d2g<>0) then EndDate:=d2g;
               If ((VerifyData(d1g,d1m,d1d))=false) or ((VerifyData(d2g,d2m, d2d))=false) then ErrorOpis.Add(errdat+AddNumberAndLine(ds.data1d.Line))
               else begin
                 if d1g <> 0 then begin
                   if d2g <> 0 then begin
                     if d1g>d2g then begin ErrorOpis.Add(errdat+AddNumberAndLine(ds.data2g.Line)); goto EndVerData;end;
                     if d1g=d2g then begin
                       if d1m <> 0 then begin
                         if d2m <> 0 then begin
                           if d1m > d2m then begin ErrorOpis.Add(errdat+AddNumberAndLine(ds.data2m.Line)); goto EndVerData;end;
                           if (d1m=d2m) and (d1g=d2g) then begin
                              if d1d <> 0 then begin
                               if d2d <> 0 then begin
                                 if d1d > d2d then ErrorOpis.Add(errdat+AddNumberAndLine(ds.data2d.Line));
                               end;
                             end;
                           end;
                         end;
                       end;
                     end;
                   end;
                 end;
               end;
             end;
           end;
         end;
       end;
     end;
   end;
 end;
end;

А вы говорите... =)


 
jack128 ©   (2007-12-15 08:53) [51]

Предлагается вообще убрать из языка ветвления?? И что, такой язык будет полон по Тьюрингу??  Что то слабо себе такое представляю...


 
Piter_   (2007-12-17 01:54) [52]

Удалено модератором
Примечание: Нарушение режима RO и как принято продление его до 7 дней


 
Германн ©   (2007-12-17 01:58) [53]


> Piter_   (17.12.07 01:54) [52]

Опять!
Или это провокация? Ник Piter совсем другой.


 
J_f_S   (2007-12-17 02:01) [54]


>  Piter

Замечу, что и сам настоящий Питер провокации любит. Так что, может, он и есть.


 
Германн ©   (2007-12-17 02:15) [55]


> J_f_S   (17.12.07 02:01) [54]

Может и так. Посему молчу по сути.
Тем более что в сабже, я лично, особой сути и не нашел.


 
имя   (2007-12-17 09:21) [56]

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


 
KSergey ©   (2007-12-17 09:52) [57]

между оператором if и функцией iif есть принципиальное различие. Так что далеко не всегда if можно заменить на iif.


 
guav ©   (2007-12-17 14:22) [58]

Ветвление без if
type
 TImpl = class(TObject)
 public
   constructor Create(const Param: string); virtual;
 end;

type
 T9xImpl = class(TImpl)
 public
   constructor Create(const Param: string); override;
 end;

 TNtImpl = class(TImpl)
 public
   constructor Create(const Param: string); override;
 end;

function CreateImpl(const Param: string): TImpl;
type  TImplClass = class of TImpl;
const Impls: array[Boolean] of TImplClass = (T9xImpl, TNtImpl);
begin
 Result := Impls[Win32Platform = VER_PLATFORM_WIN32_NT].Create(Param);
end;


 
Игорь Шевченко ©   (2007-12-17 14:24) [59]

guav ©   (17.12.07 14:22) [58]

То есть, ты нашел, куда реактор на субтепловых нейтронах приделать ? :)


 
clickmaker ©   (2007-12-17 14:27) [60]


> [58] guav ©   (17.12.07 14:22)

ого!
фтыкал секунд 20
но так и не понял, а Param зачем?


 
boriskb ©   (2007-12-17 14:29) [61]

> [58] guav ©   (17.12.07 14:22)

Ну да.
if же усложняет и запутывает программу.
А так... оно конечно проще


 
Mystic ©   (2007-12-17 14:35) [62]

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

Есть языки, в которых нет оператора if (smalltalk, prolog). Там это естественно. Но выкидывать IF из императивных языков не стоит :)


 
guav ©   (2007-12-17 14:39) [63]

> [59] Игорь Шевченко ©   (17.12.07 14:24)

На самом деле это почти кусок реального кода. Разницу между платформами проще инкапусулировать в реализации абстрактного базового класса, чем ставить if или case каждый раз по месту, т.е. if или case тут менее удобно.
Что касается "фабричного метода" CreateImpl, то тут почти всё равно с if или так, конструкция array[Boolean] of используется достаточно часто и в VCL, поэтому вполне имеет право на существование.


> [60] clickmaker ©   (17.12.07 14:27)

Ну не всё поудалял, я ж говорю копипаст из реального кода.


 
Mystic ©   (2007-12-17 15:17) [64]

> guav ©   (17.12.07 14:39) [63]

Это средство избавить программу от множества похожих if-ов. Равно как и чтобы не писать постоянно

if MyInstanse <> null then MyInstanse.DoSomething();

мы можем создать специальный тип TNullInstance.

Но стоит ли так поступить с единичными if? Например, есть код:


function SolveSquareEquation(a, b, c: Extended): TExtendedArray;
var
 D: Extended;
begin
 if a = 0 then
 begin
   if b = 0 then raise Exception.Create();
   SetLength(Result, 1);
   Result[0] := - c/b;
 end
 else begin
   D := b*b - 4*a*c;
   if D < 0 then raise Exception.Create();
   SetLength(Result, 2);
   Result[0] = 0.5 * (-b-Sqrt(D)) / a;
   Result[1] = 0.5 * (-b+Sqrt(D)) / a;
 end;
end;  


Место, где выполняется проверка a=0 единственное в программе. Надо ли городить разные классы решателей с одним единственым виртуальным методом? Плюс что делать с проверкой D >= 0?


 
guav ©   (2007-12-17 15:34) [65]

> [64] Mystic ©   (17.12.07 15:17)

Если действительно поставить цель победить все if, можно написать что-то роде:

function SolveSquareEquation(a, b, c: Extended): TExtendedArray;
var
D: Extended;
begin
D := b*b - 4*a*c;
try
  SetLength(Result, 2);
  Result[0] = 0.5 * (-b-Sqrt(D)) / a;
  Result[1] = 0.5 * (-b+Sqrt(D)) / a;
except
 on EZeroDivide do
 try
  SetLength(Result, 1);
  Result[0] := - c/b;
 except
   on EZeroDivide do raise Exception.Create();
 end;
end
end;  


Это, конечно, не очень похоже на хороший код, но зато ifов тут нет :-)


 
@!!ex ©   (2007-12-17 15:37) [66]

Вроде блок try замедляет работу приложения...


 
guav ©   (2007-12-17 15:42) [67]

> [66] @!!ex ©   (17.12.07 15:37)

Конечно, а ещё больше замедляет работу само возбуждение и обработка исключений, когда они возникают, но разве это существенная преграда в борьбе с ветряными мельницами ? :-)


 
Mystic ©   (2007-12-17 16:09) [68]

> Это, конечно, не очень похоже на хороший код, но зато ifов
> тут нет :-)


Код не эквивалентный. У меня подразумевается, что бросается осмысленные типы исключений, а у тебя стандартные системные. Конечно, можно и их перехватить :) Вообще я не говорил, что без if язык Delphi станет не полным по Тьюрингу. Я указывал лишь на то, в какую сторону изменится читабельности программ в случае такого отказа :)

> Вроде блок try замедляет работу приложения...

В Windows стандартный механизм да, незначительно замедляет. Где-то я слышал, что есть табличная схема, где нет дополнительных инструкций и места в стеке на try, но есть таблицы куда передавать управление в случае исключения по указанному адресу.

Я не до конца вник в детали этой схеым, но реализована она примерно так:

function MyStrToIntDef(const S: string);
var
 E: Exception;  
label OnConvertException;
begin
 Result := StrToInt(S);
 Exit;
OnConvertException:
 Result := 0;
 Exit;
end;


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


 
Rouse_ ©   (2007-12-17 17:35) [69]

В частных случаях можно просто оптимизировать код :)

Например:

function Test1(const A: Integer): Integer;
begin
 if A > 0 then
   Result := 1
 else
   Result := -1;
{
Unit1.pas.37: if A > 0 then
004642D8 85C0             test eax,eax
004642DA 7E06             jle $004642e2
Unit1.pas.38: Result := 1
004642DC B801000000       mov eax,$00000001
004642E1 C3               ret
Unit1.pas.40: Result := -1;
004642E2 83C8FF           or eax,-$01
Unit1.pas.53: end;
004642E5 C3               ret
}
end;

function Test2(const A: Integer): Integer;
asm
 cmp eax, 0
 setle al
 dec eax
 and eax, 2
 add eax, -1
end;


 
Mystic ©   (2007-12-17 18:03) [70]

> Rouse_ ©   (17.12.07 17:35) [69]

А велика разница по времени?
Мне кажется, что в обоих случаях CALL все скушает :)


 
Rouse_ ©   (2007-12-17 18:25) [71]


> А велика разница по времени?

О, нет :) Я не это имел ввиду :) Я имел ввиду что можно построить код таким образом, что оператор условного перехода не будет применяться :)


 
clickmaker ©   (2007-12-17 18:34) [72]

а asm можно считать "современным языком программирования"?
Тогда проблема решена. )


 
Дмитрий Белькевич ©   (2007-12-17 18:53) [73]

>iif(OR(condition1, condition2),"Yes","No")

Я у себя многие if"ы позаменял на перегружаемые IfThen - почти аналог сишного ?. Единственный минус - что все значения, загружаемые в функцию обязательно считаются. Это может снизить производительность и иногда приводит к специфическим багам - нужно особенность учитывать. Но читаемость повышается (если три-четыре вложенных IfThen не использовать ;)).

>if reddat=false then begin
if (ds.data1d.data="") or (ds.data1m.data="") or (ds.data2d.data="") or (ds.data2m.data="") or (ds.data1g.data="") or (ds.data2g.data="") then
ErrorOpis.Add(errdat+AddNumberAndLine(ds.data1d.Line))
>А вы говорите... =)

Иногда ифы - зло, кто бы спорил, особенно если вот так их пользовать.


 
palva ©   (2007-12-17 22:59) [74]

Вот здесь еще про if
http://bash.org.ru/quote/393278


 
Rouse_ ©   (2007-12-17 23:55) [75]


> а asm можно считать "современным языком программирования"?

Он именно им и является :)


 
Псалтырь   (2007-12-18 07:38) [76]


> Но читаемость повышается (если три-четыре вложенных IfThen
> не использовать ;)).

Спорный вопрос


 
Дмитрий Белькевич ©   (2007-12-18 12:02) [77]

что читабельнее:


ChangeZoomWheel(MakSeriesView.ZomFactor + IfThen(ssShift in Shift, 0.01, 0.1) * (-Delta));


или:


if ssShift in Shift then
 ChangeZoomWheel(MakSeriesView.ZomFactor + 0.01 * (-Delta))
else
 ChangeZoomWheel(MakSeriesView.ZomFactor + 0.1 * (-Delta));


?


 
@!!ex ©   (2007-12-18 12:15) [78]

ИМХО вариант с if....
Поскольку он представляет из себя две независимых ЦЕЛОСТНЫХ части.

а в первом варианте if целостную структуру разбивает.


 
Mystic ©   (2007-12-18 12:27) [79]

что читабельнее


if ssShift in Shift
 then p1 := p1 + 0.01 * delta
 else  p2 := p2 + 0.1 * gamma


или


 IfThen(ssShift in Shift, @p1, @p2)^ :=   IfThen(ssShift in Shift, p1 + 0.01 * delta,  p2 + 0.1 * gamma);


if нужен же не только для того, чтобы делать выбор значения исходя из исловия. Кстати, мне больше по душе сокращение Iif :)

> а в первом варианте if целостную структуру разбивает.

Тут можно спорить. Все-таки в случае с if имеет место быть copy+paste, и зона ответственности if только незначительный коэффициент. Поменяется формула, приудется править как часть if, так и часть else. Хотя я бы написал в две строки:


 ZoomDelta := IfThen(ssShift in Shift, 0.01, 0.1) * Delta;
 ChangeZoomWheel(MakSeriesView.ZomFactor - ZoomDelta);


 
Дмитрий Белькевич ©   (2007-12-18 17:06) [80]

>а в первом варианте if целостную структуру разбивает.

ИМХО именно как раз в первом случае эта структура и проявляется.
Однозначно видно, что подбирается коэффициент. А второй вариант нужно обязательно сличать две ветки ифа, для того, что бы однозначно убедится, что кроме изменения коэффициента ничего не изменено больше. Потому что можно подумать, не долго рассматривая, что там только коэффициент и изменен, а там будет еще знак дельты именен, либо еще что-то. Читаемость уменьшится.
В этом примере (в части с ифом) можно, правда, временную переменную задать. Тогда это улучшит читаемость. Но не везде так получается.

>if ssShift in Shift
then p1 := p1 + 0.01 * delta
else  p2 := p2 + 0.1 * gamma

В программировании, как и везде, крайности - излишни, да.

>Хотя я бы написал в две строки:

Монитор широкоформатный. Влазит ;)



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

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

Наверх





Память: 0.63 MB
Время: 0.092 c
1-1192792154
ancot
2007-10-19 15:09
2008.01.20
Как узнать имя события в Run Time


1-1192557712
dRake
2007-10-16 22:01
2008.01.20
Browsing paths в BDS 2006


2-1198424105
Бэтман
2007-12-23 18:35
2008.01.20
Проблема с печатью quick report


3-1189651379
Девушка
2007-09-13 06:42
2008.01.20
PostgreSQL наследование и fk


11-1182503317
=BuckLr=
2007-06-22 13:08
2008.01.20
Взять Items[i] как из RichEdit RTF-строку





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