我有这个代码:
procedure EstablishCommunication;
var
State : TStates;
Attempts : Byte;
procedure IncAttempts;
begin
Inc(Attempts);
end;
begin
State := stReadDeviceID;
Attempts := 0;
while True do
begin
if Attempts >= MAX_ATTEMPTS then
begin
State := stError;
end;
case State of
stReadDeviceID:
begin
// some code
IncAttempts;
end;
stError:
begin
// Error code
end;
...
...
...
我想把将状态设置为 stError 的代码放在过程 IncAttempts 中,结果:
procedure EstablishCommunication;
var
State : TStates;
Attempts : Byte;
procedure IncAttempts;
begin
Inc(Attempts);
if Attempts >= MAX_ATTEMPTS then
begin
State := stError;
end;
end;
begin
State := stReadDeviceID;
Attempts := 0;
while True do
begin
case State of
stReadDeviceID:
begin
// some code
IncAttempts;
end;
stError:
begin
// Error code
end;
...
...
...
那么,我可以将代码移到 IncAttempts 吗?
这是代码味道吗?
如果是,你能给我一个更好的方法吗?
最佳答案
我认为这是完美的有效代码。在另一个方法中声明一个方法时,我会问自己以下问题。大多数时候我不这样做,但有时它会产生更好的代码。
- 内部功能是否需要像在子类中那样进行更改?
- 我可以在不调用内部方法的情况下重写外部方法并且没问题吗?
- 内部函数在外部方法之外是否有实际应用?
- 内部函数是否足够复杂以至于应该在外部方法的范围之外进行单元测试?
如果上述任何情况适用,请不要使用内部方法。
但是,如果您没有上述任何一项,并且它可以删除重复代码和/或简化设计,那么您可以考虑使用内部函数。
关于algorithm - 我可以在函数中设置状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4807959/