Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
4-10489
Brand2000
2003-05-29 01:46
2003.08.04
Загрузка моей программы перед загрузкой Explorer a


3-10117
yurez
2003-07-14 13:10
2003.08.04
не могунормально установить ib server


3-10139
AndDem
2003-07-15 08:12
2003.08.04
Коннект к листу Excel из Delphi


7-10477
Dimaz-z
2003-05-24 16:52
2003.08.04
Как узнать, в каком порту установлен модем?


1-10197
Till
2003-07-23 09:40
2003.08.04
Не пойму почему так происходит





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