gpt4 book ai didi

c# - 类里面的通话顺序很重要时的最佳实践?

转载 作者:太空狗 更新时间:2023-10-29 17:29:47 24 4
gpt4 key购买 nike

我有一个类有两个重要功能:

public class Foo {
//plenty of properties here
void DoSomeThing(){/*code to calculate results*/}
void SaveSomething(){/* code to save the results in DB*/}

}

SaveSomething() 使用在 DoSomeThing() 中计算的结果。

问题是我们不能在 DoSomeThing() 之前调用 SaveSomething(),否则如果发生这种情况,结果将不是真实结果。我的意思是调用顺序很重要,这是维护代码的一个问题。(当新的添加到团队时)。

有什么办法可以解决这个问题吗?

我想到了以下3种方法

  1. 如果在 DoSomeThing() 之前调用,则在 SaveSomething() 中抛出异常
  2. DoSomeThing()SaveSomething() 中设置了一个 bool 代码更改为:

    bool resultsAreCalculated = false;
    void SaveSomething(){
    if (!resultsAreCalculated) {
    DoSomeThing();
    // the resultsAreCalculated = true; is set in DoSomeThing();
    // can we throw some exception?
    }
    /* code to save the results in DB*/
    }
  3. 像 Fluent 一样实现它:

    Foo x = new Foo();
    x.DoSomeThing().SaveSomething();

    在这种情况下,重要的是要保证这种情况不会发生:

    x.SaveSomething().DoSomeThing();

现在,我使用第二种方法。有没有更好的方法或者这就足够了?

最佳答案

理想情况下,需要遵循特定顺序执行的方法表示或暗示需要实现某种工作流。

有一些设计模式支持强制执行类似工作流的线性执行顺序,例如 Template Method Pattern , 或 Strategy .

参加Template Method方法,您的 Foo 类将有一个定义执行 Do()Save() 顺序的抽象基类,类似于:

public abstract class FooBase
{
protected abstract void DoSomeThing();
protected abstract void SaveSomething();
public void DoAndSave()
{
//Enforce Execution order
DoSomeThing();
SaveSomething();
}

}

public class Foo : FooBase
{
protected override void DoSomeThing()
{
/*code to calculate results*/
}

protected override void SaveSomething()
{
/* code to save the results in DB*/
}
}

这样,您类消费者将只能访问 DoAndSave(),并且他们不会违反您预期的执行顺序。

还有另一种模式可以处理工作流/状态转换类型的情况。可以引用Chain of Command , 和 State图案。

回应您的评论:这遵循相同的模板思想,您在模板中添加另一个步骤,假设您想在保存前验证结果,您可以将模板扩展为:

public abstract class FooBase
{
protected abstract void DoSomeThing();
protected abstract void SaveSomething();
protected abstract bool AreValidResults();
public void DoAndSave()
{
//Enforce Execution order
DoSomeThing();

if (AreValidResults())
SaveSomething();
}

}

当然,对于更详细的工作流程,我在原始答案末尾提到了状态模式,您可以更精细地控制从一种状态到另一种状态的转换条件。

关于c# - 类里面的通话顺序很重要时的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8229293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com