Форум: "Прочее";
Текущий архив: 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.051 c