Как вы устанавливаете значение Result? - PullRequest
3 голосов
/ 20 июня 2009
function MyFunc: Boolean;
begin
    if eval then
    Result := True
    else
        Result := False;

    /* Note it's a fancy example, I know that in this case I can do: Result := Eval */
end;

OR

function MyFunc: Boolean;
begin
    Result := False;

    if eval then
        Result := True;

/* good by else statement */

end;

Ответы [ 7 ]

8 голосов
/ 20 июня 2009

Это действительно зависит от сложности метода, вы всегда должны стремиться к удобочитаемости, эти примеры для меня все в порядке

function MyFunc: Boolean;
begin
   Result := False;
   if (Something or SomethingElse) and Whatever then
     Result := True;
end;


function MyFunc: Boolean;
begin
  Result := (Something or SomethingElse) and Whatever;
end;


function MyFunc: Boolean;
begin
   Exit((Something or SomethingElse) and Whatever);
end;

function MyFunc: Boolean;
begin
  if (Something or SomethingElse) and Whatever then
     Result := True
  else
     Result := False;
end;

Лично мне нравится избегать других инструкций и писать как можно меньше строк кода, поэтому я бы остановился на примере 2, но пример 1 тоже подойдет, варианты 3 и 4 не очень читабельны для ИМО.

Я думаю, что если вы дадите эти 4 примера новичку, первый будет проще для понимания.

3 голосов
/ 20 июня 2009

Почему бы не использовать.

function MyFunc: Boolean;
begin
    Result := eval;
/* good by if-else statement */
end;

Результат одинаков с любым из 3 вариантов. По производительности в принципе нет разницы.

Разница только в удобочитаемости. Если функция действительно такая простая, зачем использовать оператор if

1 голос
/ 21 июня 2009

Мне нравится избегать ненужных заданий, поэтому я склонен использовать либо

if eval then
begin
  // yada yada
  Result := True
end
else    
  Result := False;

или, когда нет окружающего кода, это:

Result := eval;

Следует помнить еще одну вещь: ветвление кода, критичного ко времени, может негативно сказаться на производительности. В некоторых ситуациях обновление значений несколько раз может быть быстрее, если это можно сочетать с предотвращением ветвлений. Вот пример:

for i := 0 to Length(aArray) - 1 do
  if Assigned(aArray[i]) then
    Inc(AssignedCounter);

Этот код может работать быстрее, если написать так:

for i := 0 to Length(aArray) - 1 do
  Inc(AssignedCounter, Ord(Assigned(aArray[i])));
1 голос
/ 20 июня 2009

На самом деле это не имеет значения, поскольку современные компиляторы знают, как его «съесть» и оптимизировать, поэтому вы получите почти одинаковые инструкции, возможно, в другом порядке выполнения. На мой вкус второй способ более понятен для чтения.

0 голосов
/ 22 июня 2009

Вы также можете сделать MyFunc: = true; имеет то же значение, что и Результат: = true;

0 голосов
/ 20 июня 2009

Я использую 2-й способ, когда функция имеет много:

 if (...) then
 begin
   [...]
   result := default_value;
   exit
 end;

проверка (или ошибка) условий. Я не хочу повторять «result := default_value;» в каждом случае.

0 голосов
/ 20 июня 2009

Это реальный ответ - вы просто устанавливаете результат в значение:)

Обратите внимание, что вы можете использовать результат как нормальную переменную внутри функции.

, например

function DoSomeStuff: Boolean;
Begin
  Result := (evaulate some conditions);
  if Result then
  begin
   //Do good stuff
  end;
end; 
...