Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1174044399
Vas
2007-03-16 14:26
2007.04.08
Столбци


6-1161325036
YurkaT
2006-10-20 10:17
2007.04.08
IdHTTPServer - проблемма с выполнением JS


10-1130760965
Галинка
2005-10-31 15:16
2007.04.08
Как совместить MatLab &amp; Delphi


6-1161705795
Velimir
2006-10-24 20:03
2007.04.08
Подскажите, адресок с подробным описанием Indy UDP компонента


2-1174018141
ANikolay
2007-03-16 07:09
2007.04.08
Недоступно значение переменной!....