Форум: "Прочее";
Текущий архив: 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.05 c