Algorithm 我可以在函数中设置状态吗?
我有以下代码:Algorithm 我可以在函数中设置状态吗?,algorithm,delphi,optimization,Algorithm,Delphi,Optimization,我有以下代码: procedure EstablishCommunication; var State : TStates; Attempts : Byte; procedure IncAttempts; begin Inc(Attempts); end; begin State := stReadDeviceID; Attempts := 0; while True d
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;
...
...
...
我想把将state设置为stError的代码放在过程inctruments中,结果是:
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;
...
...
...
那么,我可以把代码移到另一个位置吗
这是代码气味吗
如果是的话,你能给我一个更好的建议吗?这没什么问题,应该可以。您已经在修改另一个局部变量
尝试
,因此没有理由修改状态
会有更多的味道。
我认为你应该小心使用内联函数太多。代码通常很难阅读/理解。我认为这是完美有效的代码。当在另一个方法中声明一个方法时,我会问自己以下问题。大多数情况下我不会这样做,但有时会产生更好的代码
- 内部函数是否需要像在子类中一样进行更改李>
- 我可以在不调用内部方法的情况下重写外部方法吗
- 内部功能是否在外部方法之外有实际应用
- 内部功能是否足够复杂,以至于应该在外部方法的范围之外进行单元测试
然而,如果你没有上面的任何一个,它可以删除重复的代码和/或简化设计,那么你可以考虑使用内部函数。
< P>我会说新代码有一些提示……/P> 这完全取决于您在当前代码中管理了多少状态,以及状态的数量将来是否会发生变化。注意设置状态的方式和时间,以及检查状态的方式和时间 在您显示的两个代码段中,有一个细微的区别: 在第一个原始代码中,当前状态在迭代过程中被保留,新的错误状态在迭代开始时被设置,并且总是被检查在第二个重构代码中,状态在迭代的中间被改变,如果状态为“代码> STReDeVice ID ”,则只更改该状态。 现在,如果此
中的最后一行为True do
,则迭代为如果State=stError,则中断
,则您的第一个代码将再次运行迭代,在迭代开始时将状态更改为stError
。您的第二个代码将在当前迭代结束时退出,case
-语句的stError
-部分中的代码将永远不会执行
如果您想一直学习GoF的状态设计模式,请查看以下页面:
- (没有Delphi代码…)
- (使用Delphi代码!)
- (没有Delphi代码…)
- (使用Delphi代码!)