Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Вниз

В дебрях IF   Найти похожие ветки 

 
Kostafey ©   (2007-01-13 11:36) [0]

Всех с прошедшими праздниками !

Что имеем. Нужно сравнитть некий var (типа строка) с рядом значений, есели ничего не подошло, то else

 if str=const1 then...<без ;>
 else if str=const2 then...<без ;>
 else if str=const3 then...<без ;>
 ...
 else ...


а что если внутри if ешще if ?

 if str=const1 then...<без ;>
 else if str=const2 then if ... then ...<без ;>
 else if str=const3 then...<без ;> // А ВОТ ЭТОТ ELSE К КАКОМУ IF относится и вообще как правильно выходить из такой ситуации ?
 ...
 else ...


 
kaZaNoVa ©   (2007-01-13 11:37) [1]

скобки надо


 
palva ©   (2007-01-13 11:40) [2]

else относится к ближайшему if слева, у которого нет своего else.


 
PEAKTOP ©   (2007-01-13 11:50) [3]

Я обычно стараюсь избегать таких конструкций. Но если "отпетлять" на Integer +Case не получается, то

     if (...) then
else if (...) then
else if (...) then
     begin
       if (...)then
       begin
         .....
       end
       else
       begin
         .....
       end
     end
else if (...) then
else if (...) then
else if (...) then
else if (...) then


 
Sergey Masloff   (2007-01-13 12:28) [4]

palva ©   (13.01.07 11:40) [2]
>else относится к ближайшему if слева, у которого нет своего else
Да но читать такой код очень сложно. Поэтому я бы предпочел чтобы код который мне придется читать был как у реактора(ц) но then begin чтобы в одну строку были. То есть

else if (...) then begin
 if (...)then begin
        .....
 end
end else if (



 
sniknik ©   (2007-01-13 12:40) [5]

> Я обычно стараюсь избегать таких конструкций. Но если "отпетлять" на Integer +Case не получается, то
ага. + а если это "безобразие"(не про ответвление, а про вообще подобный список) находится в процедуре (куда можно и специально выделить) то делаю так
begin
 if (...) then begin ...  Exit; end;
 if (...) then begin ...  Exit; end;
 if (...) then begin
   if (...) then begin
     ...
   end  else begin
     ...
   end;
   Exit;
 end;
 if (...) then begin ...  Exit; end;
 if (...) then begin ...  Exit; end;
 if (...) then ...
end;

более "смотрибельно" и логически понятнее получается, имхо.


 
Sergey Masloff   (2007-01-13 12:43) [6]

sniknik ©   (13.01.07 12:40) [5]
В каждой избушке свои погремушки. Я стараюсь сократить использование exit до минимума даже если код чуть-чуть длиннее получается. Потому что когда нужно читать его быстро экзиты (мне) очень мешают.


 
vuk ©   (2007-01-13 12:52) [7]

to Kostafey ©   (13.01.07 11:36):
>Нужно сравнитть некий var (типа строка) с рядом значений
Массив строковых констант + цикл.


 
jack128 ©   (2007-01-13 15:40) [8]

vuk ©   (13.01.07 12:52) [7]
Так что ли?
for I := low(StrArr) to High(StrArr) do
 if StrArr[I] = Str then
   case I of
     0: ...;
     1: ...;
     2: ...;
   else
     ...
   end;

ИМХО - слабо читабельно. Цикл нужно использовать когда нужно выполнить одно и тоже действие.  А тут кроме сравнения никаких общих действий нету...


 
ors_archangel ©   (2007-01-13 17:29) [9]

Предлагаю:

type
 TAction = (action1,action2,...,actionN);
const
 ActionName: array[TAction] of string = ("Name1","Name2",...,"NameN");
var
 action: TAction;
 defaulAction: boolean;
begin
 defaultAction := true;
 for action := low(TAction) to high(TAction) do
   if s = ActionName[action] then begin
     case action of
     action1: . . .
     action2: . . .
     . . .       . . .
     actionN: . . .
     end;
     defaultAction := false;
     break;
  end;
 if defaultAction then begin
   . . .
 end;
end;

Читабильно или нет?
И всё из-за одного тупого case :(


 
sniknik ©   (2007-01-13 17:39) [10]

если менять на case то тогда, скорее всего сделал бы так
procedure TForm1.Button1Click(Sender: TObject);

 function inMasStr(const value: string): integer;
 const MasStr: array[0..3] of string = ("Zerro", "One", "Two", "Three");
 var i: integer;
 begin
   for i:= 0 to MaxAr do
     begin
       result:= i;
       Exit;
     end;
   result:= -1;
 end;

begin
 case inMasStr("One") of
   0: ... ;
   1: ... ;
   2: ... ;
   3: if (...) then ...
               else ... ;
   4: ... ;
   5: ... ;
   else
     ... ;
 end;
end;


 
ren   (2007-01-13 19:35) [11]

Удалено модератором


 
Rouse_ ©   (2007-01-13 19:47) [12]

Чарльз Калверт по этому поводу говори следующее:
http://www.cyberguru.ru/programming/delphi/delphi-code-standard-4.html
там же по поводу читабельности begin по варианту Сергея Маслова есть :)


 
Sergey Masloff   (2007-01-13 19:59) [13]

Rouse_ ©   (13.01.07 19:47) [12]
Наверное во время написания этого чарльзу платили построчно ;-) Ну режет же глаз.
 И скобки я обычно на автомате пишу в любых if...
 Вобщем Калверт конечно человек уважаемый но...

На самом деле я элементарно переключаюсь между стилями когда нужно подстроиться под стиль общий для команды. Правда уже довольно продолжительное время стили для своей команды определяю я так что навык может пропасть ;-)))


 
Rouse_ ©   (2007-01-13 20:05) [14]


> Наверное во время написания этого чарльзу платили построчно
> ;-) Ну режет же глаз.

Не согласен, причем категорически - я не могу нормально читать код когда begin в ифах вынесен на одной строке, особливо конструкции else if A then begin...
Но это уже привычка.

ЗЫ: Кстати, Серег, ты шрайберовский код то получил вчера от меня? А то отправил, а ты молчком, не на то мыло чтоли пульнул? :)


 
Sergey Masloff   (2007-01-13 20:13) [15]

Rouse_ ©   (13.01.07 20:05) [14]
Не на то. Я с утра съездил на работу взял тот что Игорь прислал. Но все равно спасибо ;-)

В качестве анекдота. У нас же суперпупер безопасность, тут приходит письмо с этим кодом от Игоря. Ну естественно вложений нет но автоматическая приписка от робота - злобные зловредные вложения удалены если они вам нужны то идите по ссылке.
 Иду по ссылке там целая страничка - что в файле с какого адреса он получен, знаю ли я человека который его отправил, должен ли он был что-то прислать. Все заполняешь, подтверждаешь. И потом мне дня два шли контрольные сообщения - вашей заявке назначен исполнитель такой-то, ваша заявка утверждена начальником таким-то и в конце концов я получил вожделенный файлик. Через 2 дня. За такое время я легко пешком бы к Игорю сходил и назад вернуляся б. Вот так и живем.


 
Rouse_ ©   (2007-01-13 20:14) [16]


> Rouse_ ©   (13.01.07 20:05) [14]
> Не на то. Я с утра съездил на работу взял тот что Игорь
> прислал. Но все равно спасибо ;-)

Эт как?!!!! Не понял, я ж тебе с болванки, которая с книгой шла заархивил всю директорию SRC. Отправь плз мне то, что у тебя на флешке...


 
Sergey Masloff   (2007-01-13 20:17) [17]

Не на тот адрес послал ;-)))) Код-то тот, наверное. Я на работе почту не смотрел а дома не приходило ничего.


 
Rouse_ ©   (2007-01-13 20:21) [18]

Ааа, у тебя там внизу в письме
>> только на адрес блаблабла@istranet.ru

Ну вот на него я и пульнул, странно...


 
Kostafey ©   (2007-01-13 20:29) [19]

Спасибо всем большшое за ответы.
Некоторые из перечисленных вариантов мне приходили на ум, но хотел услышать ваше мнение.


 
Rouse_ ©   (2007-01-13 20:36) [20]


> Kostafey ©   (13.01.07 20:29) [19]

Все-же советую целиком прочитать статью Калверта, практически весь VCL, за исключением некоторых юнитов сторонних разработчиков, написан с учетом этого стиля.
http://www.cyberguru.ru/programming/delphi/delphi-code-standard.html


 
MeF Dei Corvi ©   (2007-01-13 21:04) [21]

А такой не будет правильным?

if str = const1 then...
else if str = const2 then (if ... then ...)
else if str = const3 then...


 
Kostafey ©   (2007-01-13 21:15) [22]

> [20] Rouse_ ©   (13.01.07 20:36)

читаю...

> else if str = const2 then (if ... then ...)

Вы серьезно ? Я честно говоря с таким синтаксисом не знаком.
Это значит, что последующий else if НЕ БУДЕТ относиться к (if ) стоящим в скобках ?


 
vuk ©   (2007-01-13 21:38) [23]

to jack128 ©   (13.01.07 15:40) [8]:
>Так что ли?
Не совсем. Сначала вычисляется индекс в массиве, а потом уже по нему case. Кстати, в Delphi где-то готовая функция есть (навскидку не помню, как называется), принимает на входе строку и const array of string, возвращает индекс строки в массиве. Так что можно case делать без объявления локальных переменных.

>ИМХО - слабо читабельно.
А вот мое IMHO ровно противоположное. В пачке вложенных if разобраться несколько сложнее.

>Цикл нужно использовать когда нужно
>выполнить одно и тоже действие.  А тут
>кроме сравнения никаких общих действий нету...
Угу. Поиск в массиве при помощи цикла делать не будем никогда и ни за что. :)


 
Kostafey ©   (2007-01-13 21:53) [24]

> Кстати, в Delphi где-то готовая функция есть (навскидку
> не помню, как называется), принимает на входе строку и const
> array of string, возвращает индекс строки в массиве. Так
> что можно case делать без объявления локальных переменных.

Это стоит выкопать.


 
sniknik ©   (2007-01-13 22:07) [25]

> Это стоит выкопать.
AnsiIndexStr


 
MeF Dei Corvi ©   (2007-01-14 05:15) [26]


> то значит, что последующий else if НЕ БУДЕТ относиться к
> (if ) стоящим в скобках ?

Так и есть.

 a := 3;
 b := 2;
 c := 2;
 if a = 1 then writeln(1)
 else if a = 3 then (if b = 1 then writeln(3))
 else writeln(2);

Не выведет ничего, тогда как

 a := 3;
 b := 2;
 c := 2;
 if a = 1 then writeln(1)
 else if a = 3 then if b = 1 then writeln(3)
 else writeln(2);

выведет 2.


 
palva ©   (2007-01-14 11:02) [27]

Интересно, что в алголе (предшественнике паскаля) сразу после then запрещено писать уловный оператор. Только после else (если он имеется). Поэтому там этой проблемы нет. Синтаксис паскаля такое допускает, но лично я никогда так не пишу. Обычно код оформляю так:

if s = "1" then begin
...
end else if s = "3" then begin
...
end else if s = "4" then begin
...
end else begin
...
end;

И я не оригинален. Кроме того, это понятно тем, кто привык мыслить конструкциями бейсика.


 
_uw_   (2007-01-14 11:21) [28]

palva ©   (14.01.07 11:02) [27]

А ведь верно, там еще говорилось о том, что при вложенных операторах if then else возникает неоднозначность определения, какой else относится к какому if then. Я так к этой мысли привык, что был удивлен, что Вирт на этом совсем не заморачивается.

Код оформляю точно так же, только в тех случаях, когда условие не помещается на одной строке, then [begin] размещаю на новой строке. На С пишу точно так же. Торвалдс с нами солидарен :)


 
Anatoly Podgoretsky ©   (2007-01-14 13:22) [29]

> palva  (14.01.2007 11:02:27)  [27]

Не очень это понятно, а вот

if ... then ...
else if ...
else if ...
...
else ...

понятно


 
Anatoly Podgoretsky ©   (2007-01-14 13:23) [30]

> _uw_  (14.01.2007 11:21:28)  [28]

неоднозначность разрешается с помощью операторных скобок.


 
_uw_   (2007-01-14 13:35) [31]

Да, но palva сказал "сразу после then запрещено писать уловный оператор". begin писать можно.


 
Anatoly Podgoretsky ©   (2007-01-14 13:45) [32]

begin это и есть операторные скобки в Паскале.
Мне не нравится синтаксис if then else в Паскале, правда Вирт исправил эту погрешность в новых языках, зато добавил новые.


 
_uw_   (2007-01-14 14:07) [33]

palva говорил об Алголе. Там begin - тоже операторная скобка. Так вот, речь идет о запрете писать условный оператор после слова then - в Алголе. Толя, не морочь себе голову - никто больше на Алголе не пишет.


 
Anatoly Podgoretsky ©   (2007-01-14 14:10) [34]

> _uw_  (14.01.2007 14:07:33)  [33]

Я не понял, что это про Алгол, но это они правильно, поскольку нефиг.


 
_uw_   (2007-01-14 14:12) [35]

Anatoly Podgoretsky ©   (14.01.07 14:10) [34]

Фу, черт! Ты не заметил слова "Алгол", а я думал, ты дурака валяешь :)


 
Anatoly Podgoretsky ©   (2007-01-14 14:14) [36]

> _uw_  (14.01.2007 14:12:35)  [35]

Не, я просто недоволен Виртом.


 
_uw_   (2007-01-14 14:16) [37]

А растолкуй, что не нравится.


 
Anatoly Podgoretsky ©   (2007-01-14 15:01) [38]

> _uw_  (14.01.2007 14:16:37)  [37]

Мне нравится следующая структура

if expr then
...
...
else
..
..
end

Аргументы Вирта мне известны, но они не последовательны
например сравним два цикла с пост и пред условием

while expr do 1 operator

repeat
  many operators
until expr

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

И т.д. и т.п.

Переходить на новые языки от Вирта не намерен. Буду жить с тем, что есть.



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

Форум: "Прочее";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.043 c
15-1167329662
Rouse_
2006-12-28 21:14
2007.02.04
Вот вам для разминки мозгов.


15-1168589311
WondeRu
2007-01-12 11:08
2007.02.04
Парсинг


15-1168582732
NLex
2007-01-12 09:18
2007.02.04
Развитие в области...


15-1168652745
Tirael
2007-01-13 04:45
2007.02.04
наклон линии


3-1163498274
Чапаев
2006-11-14 12:57
2007.02.04
Что бы такое raise нуть?..





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