Форум: "Потрепаться";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
Вниз---|Ветка была без названия|--- Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c