Текущий архив: 2007.04.08;
Скачать: CL | DM;
Вниз
If ... then : Begin End VS Exit; Найти похожие ветки
← →
Prohodil Mimo © (2007-03-12 17:32) [0]Что лучше или правильнее использовать?
Procedure Test(I : Integer);
Begin
If I > 0 Then
Begin
<не важно что>
<не важно что>
<не важно что>
<не важно что>
End;
End;
или
Procedure Test(I : Byte);
Begin
If I <= 0 Then Exit;
<не важно что>
<не важно что>
<не важно что>
<не важно что>
End;
Это просто пример, взятый с потолка.
← →
Kerk © (2007-03-12 17:33) [1]Классики говорят, что из процедуры должна быть только одна точка выхода.
Я лично использую то, что удобнее в данный момент.
← →
Prohodil Mimo © (2007-03-12 17:35) [2]со вторым вариантом строк поменьше, а вот
> Классики говорят...
От сюда и вопрос возник.
← →
homm © (2007-03-12 17:36) [3]в зависимости от того что между if и then стоит. Если с Exit легче условие написать, и читется логичнее, почему бы нет...
← →
stone © (2007-03-12 17:36) [4]
> Prohodil Mimo © (12.03.07 17:32)
imho, теоретически правильнее 1
но если много этих самых <не важно что>, то все-равно использую 2
← →
Kerk © (2007-03-12 17:37) [5]Мне кажется, не стоит кидаться в крайности. В сабжевом примере однозначно предпочтительнее более короткий вариант. А вот если в большой и сложной процедуры откуда-нибудь из середины осуществляется exit - это не есть гуд.
← →
Рамиль © (2007-03-12 17:37) [6]По мне так легче вначале проверить и выскочить. Тем более если есть несколько проверок, после которых выполнение процедуры не имеет смысла.
← →
Ega23 © (2007-03-12 17:38) [7]
> Prohodil Mimo © (12.03.07 17:32)
Заглядываем в генофонд. Видим:
procedure TCustomConnection.SetConnected(Value: Boolean);
begin
if (csReading in ComponentState) and Value then
FStreamedConnected := True else
begin
if Value = GetConnected then Exit;
if Value then
begin
if Assigned(BeforeConnect) then BeforeConnect(Self);
DoConnect;
SendConnectEvent(True);
if Assigned(AfterConnect) then AfterConnect(Self);
end else
begin
if Assigned(BeforeDisconnect) then BeforeDisconnect(Self);
SendConnectEvent(False);
DoDisconnect;
if Assigned(AfterDisconnect) then AfterDisconnect(Self);
end;
end;
end;
← →
Ega23 © (2007-03-12 17:40) [8]Вот ещё более извращённый пример из генофонда:
procedure TBlobField.Assign(Source: TPersistent);
var
StreamPersist: IStreamPersist;
begin
if Source is TBlobField then
begin
LoadFromBlob(TBlobField(Source));
Exit;
end;
if Source is TStrings then
begin
LoadFromStrings(TStrings(Source));
Exit;
end;
if SupportsStreamPersist(Source, StreamPersist) then
begin
LoadFromStreamPersist(StreamPersist);
Exit;
end;
inherited Assign(Source);
end;
← →
Prohodil Mimo © (2007-03-12 17:41) [9]Ega23 © (07.03.12 17:40) [8]
Вот ещё более извращённый пример из генофонда:
выходит, что лучше Exit чем Else ?
← →
Kerk © (2007-03-12 17:42) [10]> [8] Ega23 © (12.03.07 17:40)
Тогда уж как-нить так:procedure TBlobField.Assign(Source: TPersistent);
var
StreamPersist: IStreamPersist;
begin
if Source is TBlobField then
LoadFromBlob(TBlobField(Source)) else
if Source is TStrings then
LoadFromStrings(TStrings(Source)) else
if SupportsStreamPersist(Source, StreamPersist) then
LoadFromStreamPersist(StreamPersist) else
inherited Assign(Source);
end;
← →
Рамиль © (2007-03-12 17:45) [11]
> Kerk © (12.03.07 17:42) [10]
Так я и говорю, легче выскочить, чем нагромождать else. Понятнее.
← →
Prohodil Mimo © (2007-03-12 17:47) [12]Рамиль © (07.03.12 17:45) [11]
Понятнее.
[8] я раза 3-4 перечитал, пока въехал полностью,
с [10] хватило бы и одного раза.
← →
Ega23 © (2007-03-12 17:47) [13]
> Kerk © (12.03.07 17:42) [10]
>
> Тогда уж как-нить так:
Задай этот вопрос разработчикам VCL... :)
← →
Ega23 © (2007-03-12 17:48) [14]
> [8] я раза 3-4 перечитал, пока въехал полностью,
> с [10] хватило бы и одного раза.
>
Не знаю, лично мне [8] - понятнее, чем [10]
← →
Рамиль © (2007-03-12 17:49) [15]
> Ega23 © (12.03.07 17:38) [7]
> if Value = GetConnected then Exit;
Некрасиво как то...
if Value xor GetConnected then Exit :)
← →
Ketmar © (2007-03-12 17:52) [16]фигня.
false xor false -- false. не заменяется.
← →
Ega23 © (2007-03-12 17:53) [17]
> false xor false -- false. не заменяется.
А "минус-минус" зачем? :)
← →
Рамиль © (2007-03-12 17:57) [18]
> Ketmar © (12.03.07 17:52) [16]
> фигня.
>
> false xor false -- false. не заменяется.
забыл not
if not(Value xor GetConnected) then Exit
← →
Prohodil Mimo © (2007-03-12 17:58) [19]Рамиль © (07.03.12 17:57) [18]
if not(not(not(not(not()not(....))))) then
что бы враги не догадалтсь
← →
Yanis © (2007-03-12 17:59) [20]
> А "минус-минус" зачем? :)
Это дефис :)
дефис = два тире.
P. S. не спрашивай про два знака равно =)
← →
wicked © (2007-03-12 18:00) [21]вариант 2 использую только для проверки "предусловий" - валидны ли параметры и необходимые поля обьекта... не валидны - выходим
потом, когда начинается уже соль функции, строго придерживаюсь варианта 1
← →
Ketmar © (2007-03-12 18:05) [22]> Yanis © (12.03.07 17:59) [20]
а два знака равно -- это Lua, а не то, что могли подумать. %-)
← →
Чапаев © (2007-03-12 18:07) [23]> > if Value = GetConnected then Exit;
> Некрасиво как то...
> if Value xor GetConnected then Exit
if not (Value xor GetConnected) then Exit
Что там с системой левелапов, я с него хочу пару левелов снять за неправильные советы. %-)
Страницы: 1 вся ветка
Текущий архив: 2007.04.08;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.033 c