Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > If THEN ELSE


Автор: Black_Joker 10.10.2003, 12:01
Сколько можно сделать вложений в струкутру
If Then Else
К примеру:

(1 уровень)
If
then (2 уровень)
If then (3 ровень)
if then (...)
Else (3 уровень)
...
Else (1 уровень)

Сколько уровней можно делать?

Автор: var-alex 10.10.2003, 14:58
Сколько хочешь, только я -бы писал
if then
begin
if then
begin
end
else
begin
end;
end
else
begin
end;

Так понятней, и наверняка не ошибётся компилер к какому if rfrq else

Автор: val 10.10.2003, 15:10
Цитата
Сколько хочешь, только я -бы писал


Не совсем так... Насколько мне известно - не более 64 штук.

Автор: Vit 10.10.2003, 15:15
В TurboPascal было 128, сколько в Дельфи - не знаю, но, по-моему, уже десяток уровней вложенности не самая хорошая идея...

Автор: val 10.10.2003, 16:58
Цитата
уже десяток уровней вложенности не самая хорошая идея...


Действительно, одля этого используют ператор case

Автор: December 10.10.2003, 19:40
Цитата(val @ 10.10.2003, 16:58)
Действительно, одля этого используют ператор case

case не все типы берёт. Иногда эргономичнее наворачивать вот такие вот условные деревья.

Автор: x77 10.10.2003, 19:56
не думаю. сама ситуация представляется порочной в принципе, мне кажется, надо менять логику программы. эргономичность - это офигительно. но для современных компов сэкономленный, пусть даже, мегабайт - ничто, по сравнению с читабельностью кода, и в некоторых случаях именно из этого следует исходить.

Автор: December 11.10.2003, 00:43
Цитата(x77 @ 10.10.2003, 19:56)
эргономичность - это офигительно. но для современных компов сэкономленный, пусть даже, мегабайт - ничто, по сравнению с читабельностью кода, и в некоторых случаях именно из этого следует исходить.

Под эргономичностью понимается удобство работы человека, а не железки. Дело в том, что мне, например, нужно постепенно наворачивать это дерево if'ов по мере усложнения проекта, причём наворачивать однообразно - практически бездумно. Читабельность кода также остаётся на уровне благодаря должному форматированию.

Автор: x77 11.10.2003, 01:09
я понимаю, но всё равно я бы решал вопрос как-то иначе. трудно сказать что-то осмысленное без знания конкретики, конечно. просто при написании кода я придерживаюсь одного простого правила: если проедура занимает больше одного PgDn'а, - её надо менять. и бесконечное ифы - это не есть здорово smile.gif

Автор: Fedor 11.10.2003, 08:10
Цитата
нужно постепенно наворачивать это дерево if'ов по мере усложнения проекта, причём наворачивать однообразно - практически бездумно

А представь, что у тебя десять уровней ифов, и в каждом - по несколько елсов, а там есть свои ифы... Так конечно можно легко бездумно наворотить программу, да причем и правильную... Но представь, что кто-то будет читать после тебя программу или ты сам месяцев через 12 вдруг захочешь вспомнить, шо оно там було. Программа будет почти нечитаема.
Цитата
просто при написании кода я придерживаюсь одного простого правила: если проедура занимает больше одного PgDn'а, - её надо менять

Крут... smile.gif

Автор: NiJazz 11.10.2003, 08:19
Цитата
Не совсем так... Насколько мне известно - не более 64 штук.


Всего-то! smile.gif

Автор: NiJazz 11.10.2003, 08:20
Morpheus, но ведь программа пишется для того, чтобы работать, а не как книжка. smile.gif
Хотя момент тоже актуальный.

Автор: val 11.10.2003, 10:10
Цитата
но для современных компов сэкономленный, пусть даже, мегабайт - ничто


Господа, не забывайте, что программы пишуться не только для обыкновенных PC!
А в Дельфи частенько отлаживат алгоритмические модели...



Автор: December 11.10.2003, 12:47
Цитата(val @ 11.10.2003, 10:10)
А в Дельфи частенько отлаживат алгоритмические модели...

Не, блин, я про офисное приложение чахлодохлое говорю, а он сразу про алгоритмические модели! ТАМ, ессно, о таком даже не думается.
Morpheus Я говорю только о том случае, когда else только один - для следующего if'а. Представь что-то типа анализа файла настроек.

Автор: Vit 11.10.2003, 16:29
Цитата(December @ 11.10.2003, 03:47)
Представь что-то типа анализа файла настроек.

Представил, там же вообще вложенные if не нужны! Делаешь параметры в ввиде set of something, далее обычным одновложенным if, in и case делаются все выборы. Ещё раз говорю, и ни я один - вложенность if больше 3х-4х это во первых плохой стиль программирования, а во вторых неправильная архитектура программы - тем более в том случае, что ты привёл - просто надо не делать тупой набор офигенного количества строковых переменных, которых действительно будет много и вариантов их комбинаций ещё больше, а остановиться и подумать как вместо строковых параметров использовать другие типы: массивы, записи, множества, свои классы и т.п. Всё это можно инкапсулировать в код который будет совершенно прозрачным, причём добавление нового параметра не будет приводить к ещё одному if...


PS. Многовложенные if всегда легко заменяются на некое количество процедур.

Автор: December 11.10.2003, 17:56
Блииииииииин! bored.gif hmmm.gif
1. Джентльмены, не говорите, что вы не в состоянии представить случай, когда программёру проще написать кучу ифов чем создавать целую интерпретирующую систему.
2. Я не говорю, что так должно быть - так ИНОГДА БЫСТРЕЕ.
3. Ну, не настройки, представьте интерпретатор скрипта, где ты получаешь в основном строки (с параметрами, возможно). Сначала у тебя в скрипте может быть два слова. Потом тебе нужно добавить ещё два (три, четыре). И так далее. Что, для такого простого случая будем делать хитрые системы с кодировкой допустимых операторов? Классы создавать да иерархии выстраивать? Да проще лишний раз copy'n'paste, чем ради дохлой утилитины время на обдумывание тратить!
hmmm.gif

Автор: &-ray 11.10.2003, 22:42
Согласен.
У меня бывает не один десяток if'ов выстраивается.
А в отдельные процедуры и функции вывожу код, который много раз повторяется в программе или же очень длиный, который для понимания лучше разбить на отдельные процедуры.

Автор: Fedor 12.10.2003, 08:16
December
Здаюсь... Ты прав smile.gif

Автор: var-alex 12.10.2003, 09:15
Цитата(December @ 11.10.2003, 17:56)
Блииииииииин! bored.gif    hmmm.gif
3. Ну, не настройки, представьте интерпретатор скрипта, где ты получаешь в основном строки (с параметрами, возможно). Сначала у тебя в скрипте может быть два слова. Потом тебе нужно добавить ещё два (три, четыре). И так далее. Что, для такого простого случая будем делать хитрые системы с кодировкой допустимых операторов? Классы создавать да иерархии выстраивать? Да проще лишний раз copy'n'paste, чем ради дохлой утилитины время на обдумывание тратить!
hmmm.gif

Для построения комполяторов-интерпритаторов есть своя теория, и свои алгоритмы. И большим ко-вом вложеных if-ов там не пахнет, при верной реализации!

Автор: neutrino 12.10.2003, 10:27
Если интерпретатор не особо навороченный (Простой скриптовый язык), то все December сделал правильно. Если писать по этим хитрым алгоритмам, то надо будет и книженцию читать по написанию парсеров и еще хрен знает чего. Если нужна скорость, то вложенные ифы намного быстрее сделают работу, нежели там всякие множества и их переборы.

Автор: Black_Joker 12.10.2003, 17:59
Этот вопрос был по поводу написания переводчика html -> txt (часть проги для диссера)

Анализ текста:

Тег - не тег? (<)
Если тег - нужный ли тег? (есть ли полезая информация или просто украшатесьства и структура)
Если не тег - какая буква или символ (русс - не русс. - по аська-коду) + &#***
Если русс - переводить по кодировкам.
И т.д. просто перебором реализовать давольно напряжно.

Автор: Vit 13.10.2003, 04:51
Да нет, всё понятно - этот подход ясен, собственно многие так и поступаю, особенно молодые и неопытные программисты - есть 2 if добавим ещё 2, при необходимости добавим ещё 2 и т.д.... Хоть интерпретатор, хоть что угодно - через пол года работы над кодом упираемся в тупик - по-тихоньку по-маленьку у нас процедура на 2000 строк кода с 40 вложенными циклами с 40 вложенными if, бессчётным количеством break, а ещё через пару месяцев код пестрит уже и многочисленными Goto... А начиналось всё так невинно, всё так просто и ясно... Знаем, плавали. В этом и состоит отличие кода новичка от кода опытного программиста - при внешней громоздкости и избыточности кода на первых этапах этот код легко расширяем и легко дополняем, причём не за счёт вложенности if и циклов. "Мозги" программы инкапсулированны в один или несколько классов, а добавление новой функциональности происходит путём добавления маленькой процедуры/метода и добавление нескольких констант/переменных в массив и т.п. Мораль такова - при написании программы в первую очередь думать о возможной дальнейшей модификации и дополнения каждой детали проекта и даже если вы не планируете это делать сейчас, архитектура должна быть такой чтобы модернизация была простой и лёгкой, а не перелопачиванием всего кода... Особенно в скриптовых языках - сам с таким сталкивался - именно скриптовые языки как ни что другое требует очень частого добавления новых лексем и вложенные if там подходят меньше всего.

Автор: Black_Joker 13.10.2003, 11:01
я пересмотрел код и решил перейти к case ** of
Подскажите модно ли писать
r:=
case r of
1 OR 2: begin ... end
3 OR 4 OR 5: begin ... end
else ...

или только

r:=
case r of
1 : begin ... end
3 : begin ... end
else ...

Автор: x77 13.10.2003, 11:07
Код
case I of
 1..5: Caption := 'Low';
 6..9: Caption := 'High';
 0, 10..99: Caption := 'Out of range';
else
 Caption := '';
end;

Автор: Maverick 13.10.2003, 23:40
Из собственного опыта - видел 11 вложенных уровней... Разобраться по-человечески не удалось - пришлось переписывать начисто... Так что в данном случае следует думать о большей читабельности, чтоб сопровождающий задачу после вас не поминал вас "добрым" словом...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)