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;
答案 0 :(得分:8)
这真的取决于方法的复杂性,你应该始终以可读性为目标,这些例子对我来说都很好
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;
我,personaly,喜欢避免使用其他语句并尽可能少写代码行,所以我会选择示例2,但是示例1也很好,选项3和4的可读性不是很高。
我认为如果你把这4个例子给初学者,第一个是最容易理解的。
答案 1 :(得分:3)
为什么不使用。
function MyFunc: Boolean;
begin
Result := eval;
/* good by if-else statement */
end;
结果与3种变体中的任何一种相同。表现明智,基本上没有区别。
唯一的区别在于可读性。如果函数真的很简单,为什么还要使用if语句
答案 2 :(得分:1)
实际上并不重要,因为现代编译器知道如何“吃掉”并优化它,因此您将收到几乎相同的指令,可能处于不同的执行顺序。根据我的口味,第二种方式更适合阅读。
答案 3 :(得分:1)
我喜欢避免不必要的任务,所以我倾向于使用
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])));
答案 4 :(得分:0)
是真正的答案 - 您只需将结果设置为值:)
请注意,您可以将结果用作函数中的正常变量。
e.g。
function DoSomeStuff: Boolean;
Begin
Result := (evaulate some conditions);
if Result then
begin
//Do good stuff
end;
end;
答案 5 :(得分:0)
当函数有很多时,我使用第二种方式:
if (...) then
begin
[...]
result := default_value;
exit
end;
检查(或错误)条件。我不想在每种情况下重复“result := default_value;
”。
答案 6 :(得分:-1)