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

Вниз

---|Ветка была без названия|---   Найти похожие ветки 

 
Beginner3000   (2003-07-16 00:26) [0]

Прошу извинить, но сегодня у меня много вопросов.
у Тейксейры и Пачеко написано, что следует избегать более трёх вложений условий if,
а использовать более красивые алгоритмы.
Вопрос: как "украсить" алгоритм вида
if A then
begin
DO1;
...
if B then
begin
DO2;
...
if C then
begin
DO3;
...
if D then
begin
DO4;
...
end;
else DO5;
end;
DO6;
...
end;
end;
?


 
Rouse_ ©   (2003-07-16 00:31) [1]

IMHO
case

Желаю успехов

ЗЫ: хотя некоторые любят while


 
Beginner3000   (2003-07-16 00:37) [2]

while Это цикл
case - для одного условия, причём порядкового
я же указал, как мне кажется, более сложную конструкцию


 
Rouse_ ©   (2003-07-16 00:47) [3]

case
A:DO1;
B:DO2;
C:DO3;
else
DO5;
end;

Найдите 5 отличий

ЗЫ: Кто вам сказал что while должна быть обязательно циклом?


 
Marser ©   (2003-07-16 00:49) [4]

Объединять условия, например if (a) and (b) then c, т.е. с помощью булевых операторов.


 
Beginner3000   (2003-07-16 00:56) [5]

to Rouse_ ©
я имел ввиду именно вложенные условия
с наличием ещё некоторых операторов до и после вложений
в вашем случае
DO1 должен в большей части повторять DO2
DO2 - DO3 и так далее
а наличие у НЕКОТОРЫХ условий ещё и ELSE вообще не укладывается в эту схему


 
Beginner3000   (2003-07-16 00:59) [6]

to Marser ©
те же ньюансы.
если бы всё было так просто


 
Юрий Зотов ©   (2003-07-16 01:04) [7]

"Следует избегать" не означает что это нужно делать обязательно и тем более, жертвуя эффективностью кода. Многоуровневые IF"ы трудно читаются, вот почему их следует избегать - но это же не догма. Если такой IF действительно нужен и наиболее эффективен - таи и пишите его спокойно. Только постарайтесь структурировать отступа так, чтобы с первого взгляда было понятно, что к чему относится.


 
Beginner3000   (2003-07-16 01:08) [8]

как то в своё время я наваял прогу большую, правда не на делфи, а на внутреннем языке математической среды мэпл 6
в ней было на сколько помню 16 вложений
считая циклы и условия
всё вперемешку, в разном порядке
(распечатка 40 листов с комментариями)
считала всё как надо, только не очень эффективно, учитывая что язык - интерпретируемый

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


 
Rouse_ ©   (2003-07-16 01:19) [9]

> Marser © (16.07.03 00:49)
Подождем решения автора ;)

Желаю успехов


 
Спрашивающий_   (2003-07-16 01:25) [10]

А вот так эффективнее и быстрее а смысл тот же
If A Then 1 Else
If B Then 2 Else
If C Then 3 Else 4;
Обратите внимание если условие нашлось остальные условия программа пробегать не будет. Актуально если If много, а время дорого.


 
Юрий Зотов ©   (2003-07-16 01:27) [11]

> Marser © (16.07.03 00:49)

Не всегда конструкция
if A then
if B then ...
будет эквивалентна конструкции
if A and B then ...

Это зависит от используемой схемы вычисления булевых выражений и от того, что такое A и B (например, это могут быть функции).


 
Beginner3000   (2003-07-16 01:34) [12]

>Спрашивающий_
а почему в компилированной программе
она должна "пробегать" не подходящие условия?
разве что у Тейксейры и Пачеко написано, что
else обрабатывается дольше чем then,
но тогда после then должны быть не самые короткие,
а самые частые операторы


 
Спрашивающий_   (2003-07-16 02:00) [13]

>а почему в компилированной программе
она должна "пробегать" не подходящие условия?

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


 
Yuri I. Bouloui   (2003-07-16 10:14) [14]

Для уменьшения кол-ва if-ов классики ООАП рекоммендуют применять паттерны. Или у Фаулера видим: "... заметив блок switch следует подумать о полиморфизме" ...


 
Vlad Oshin ©   (2003-07-16 10:43) [15]

Переводя Зотова и Тарраша
Следует делать всегда, кроме тех случаев, когда это плохо.


 
Anatoly Podgoretsky ©   (2003-07-16 10:44) [16]

Marser © (16.07.03 00:49)
В привеленном примере это невозможно, если так написать то будет совсем другая логика. Например если a=true b=false то DO1 не будет выполнено, а должно быть.

Beginner3000 (16.07.03 00:26)
Прислушайся к тому, что сказал Юрий Зотов © (16.07.03 01:04)
или подумай об изменении алгоритам.


 
DiamondShark ©   (2003-07-16 12:09) [17]

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

Аналогично поступаю со сложными условиями в ифах или запросах: размечаю нужное условие на карте Карно, формальная процедура -- и готово минимальное выражение.

Любите формальные методы!


 
Думкин ©   (2003-07-16 12:12) [18]

DiamondShark © (16.07.03 12:09)
В точку. Меня только это и спасает иногда. Последние игры так и писал.


 
clickmaker ©   (2003-07-16 12:15) [19]

Ежели алгоритм позволяет, то
if not A then Exit;
if not B then Exit;
...
А код, который должен по-любому отыграть, разместить в finally


 
Marser ©   (2003-07-16 13:34) [20]


> Юрий Зотов © (16.07.03 01:27)
> > Marser © (16.07.03 00:49)
>
> Не всегда конструкция
> if A then
> if B then ...
> будет эквивалентна конструкции
> if A and B then ...
>
> Это зависит от используемой схемы вычисления булевых выражений
> и от того, что такое A и B (например, это могут быть функции).


Я априори считал их операциями и функциями. Все зависит от конкретики поставленной задакчи. Мне приходилось как-то упрощать условия таким образом, хотя это не всегда к месту. Что до автора, то ему не надо путать красоту исходника с эффективностью выходного программного кода. Жертвоватьь эффективностью ради красоты - графоманство, ИМХО.


 
Beginner3000   (2003-07-16 23:41) [21]

>Yuri I. Bouloui (16.07.03 10:14)
>Для уменьшения кол-ва if-ов классики ООАП рекоммендуют
>применять паттерны. Или у Фаулера видим: "... заметив блок
>switch следует подумать о полиморфизме" ...

просьба уточнить



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

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

Наверх




Память: 0.52 MB
Время: 0.012 c
1-10190
Санек
2003-07-22 12:28
2003.08.04
ToolBox


7-10475
Lola
2003-05-22 20:38
2003.08.04
ShellExecute


1-10184
race1
2003-07-22 14:52
2003.08.04
прозрачность TGraphicControl а


4-10509
SKI
2003-06-02 00:22
2003.08.04
Работа с ресурсами


11-10160
DNT
2002-11-30 17:44
2003.08.04
Без окна