我正因为这个而挣扎:
我的类有一些具有时间耦合的方法。这是一些方法MethodA必须首先调用来“初始化”数据MethodB需要正常工作。
我通常通过将有问题的依赖传递给“方法B” 作为论据,就像这个片段中一样:
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。必须以正确的顺序调用它们。这才是真正的问题:一个应该在另一个之前被调用。
如果您遵循贫血领域模型,您可以打破您的班级并将其分成 2 个较小的班级。你意识到糟糕的设计是因为你当前的类违反了SRP http://en.wikipedia.org/wiki/Single_responsibility_principle,简而言之它有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;
}
}
如果您发现使用这两个类很麻烦,请使用另一个类聚合服务 http://blog.ploeh.dk/2010/02/02/RefactoringtoAggregateServices/为了那个原因。前任:
public class ClassC
{
public ClassA ClassA = new ClassA();
public ClassB ClassB = new ClassB();
public void Execute(){
string result = ClassA.MethodA();
ClassB.MethodB(result);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)