gpt4 book ai didi

c# - 如何处理时间耦合?

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

我为此苦苦挣扎:

我的类(class)有一些具有时间耦合的方法。也就是说,必须首先调用一些方法 MethodA 来“初始化”MethodB 正常工作所需的数据。

我通常通过将有问题的依赖项传递给 “MethodB” 作为参数 来明确时间耦合,就像在这个片段中:

private class SomeClass
{
private string field;
private int count;

public SomeClass()
{
MethodA();
MethodB(field);
}

private void MethodA()
{
field = "Something";
}

private void MethodB(string str)
{
count = str.Length;
}
}

虽然它使事情变得明确,但我觉得我做错了什么。我最终得到了根本不使用字段的方法(静态方法!),所以这个类开始看起来不那么内聚了。

这是最好的方法吗? (通过传递参数失去凝聚力)

编辑:关于一些建议在构造函数中使用字段作为参数或使用构建器模式来避免无效状态的答案:我不能那样做,因为在我的例子中我正在构建一个解析器 . MethodA 读取输入并根据它设置状态(从文件中读取字符),然后调用 MethodB。它们必须以正确的顺序调用。这才是真正的问题:一个应该在另一个之前被调用。

最佳答案

如果您遵循 Anemic Domain Model,您可以打破您的类(class)并使其成为 2 个更小的类(class)。你意识到糟糕的设计是因为你当前的类(class)违反了 SRP ,简而言之它有2个职责:1个处理输入过程,1个处理输入结果。

分解为ClassA处理输入和返回结果,然后ClassBClassA的结果作为参数,然后处理它。例如:

public class ClassA
{
public string MethodA()
{
// read the input
return "Something"; // or return the input
}
}

public class ClassB
{
private int count;
public void MethodB(string str)
{
count = str.Length;
}
}

如果您发现使用这两个类很麻烦,请使用另一个 aggregate service为了那个原因。例如:

public class ClassC
{
public ClassA ClassA = new ClassA();
public ClassB ClassB = new ClassB();
public void Execute(){
string result = ClassA.MethodA();
ClassB.MethodB(result);
}
}

关于c# - 如何处理时间耦合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29499530/

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