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代码!)

这取决于。。state是一个局部变量,所以当进行max_尝试时,您的过程将做什么?它看起来像一个错误条件,是引发异常的好地方。但是,这取决于……这是有限状态机的一部分。我打算在斯特罗州提出一个例外。为了更好地解释,我编辑了代码。你为什么不使用对象,在对象中有字段,而不是使用局部变量?这个状态机在主线程中运行了很长时间吗?我经常使用内部方法。我并不真的同意它们使代码更难阅读——我看不出与单独的方法相比在可读性方面有什么区别。但我要做的一件事是传入参数。因此,在外部函数中,我总是在所有内部函数之后声明变量。内部方法具有一定的功能和实用性,尤其是当它们需要访问最外部方法的局部变量时,或者当一个代码片段除了以某种有序和谨慎的方式修改局部变量外几乎没有其他作用时,需要重复执行。