我因此而苦苦挣扎:
我的类有一些具有时间耦合的方法.这是,一些方法治法,必须先调用为"初始化"的数据的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;
}
}
Run Code Online (Sandbox Code Playgroud)
虽然它使事情明确,但我觉得我做错了.我最终得到了根本不使用字段的方法(静态方法!),所以这个类开始变得不那么紧密了.
这是最好的方法吗?(通过传递参数失去凝聚力)
编辑:关于一些建议使用字段作为构造函数中的参数或使用构建器模式来避免无效状态的答案:我不能这样做,因为在我的情况下我正在构建一个Parser.MethodA读取输入并根据它设置状态(从文件中读取字符),然后调用MethodB.必须以正确的顺序调用它们.这是真正的问题:应该在另一个之前调用一个.
如果你遵循贫血领域模型,你可以打破你的班级,把它分成 2 个更小的班级。您意识到糟糕的设计是因为您当前的类违反了SRP,简而言之,它有 2 个责任:1 个负责处理输入过程,1 个负责处理输入结果。
分解它以便ClassA处理输入和返回结果,然后ClassB将结果ClassA作为参数,然后处理它。前任:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您发现使用这两个类很麻烦,请为此使用另一个聚合服务。前任:
public class ClassC
{
public ClassA ClassA = new ClassA();
public ClassB ClassB = new ClassB();
public void Execute(){
string result = ClassA.MethodA();
ClassB.MethodB(result);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以删除参数MethodB并使用field,这样就不会失去内聚力
private class SomeClass
{
private string field;
private int count;
public SomeClass()
{
MethodA();
MethodB();
}
private void MethodA()
{
field = "Something";
}
private void MethodB()
{
count = field.Length;
}
}
Run Code Online (Sandbox Code Playgroud)
笔记:
1)你描述问题的方式看起来像模板方法设计模式,你应该看看这里。
2)静态方法不属于该类