在这个简单的例子中(当然我的现实世界问题有点复杂,虽然基础是相同的),我如何强制告诉不要求最大值?我喜欢最大化告诉不要在流程方法中询问,在其当前状态下更难以模拟和测试。
public class Processor
{
public void Process()
{
var data = new Task1().DoStuff();
new Task2().DoStuffToData(data);
}
}
public class Task1
{
public Data DoStuff(){return new Data();}
}
public class Data {}
public class Task2
{
public void DoStuffToData(Data data){}
}
编辑:更新样本更多DIish
public class Processor
{
public Processor(ITask1 task1, ITask2 task) {...}
public void Process()
{
var data = task1.DoStuff();
task2.DoStuffToData(data);
}
}
答案 0 :(得分:2)
从tell-don't-ask的角度来看,这段代码似乎并不太糟糕。
Tell-not-ask基本上意味着你不应该查询关于它的对象状态,根据它的状态做出决定然后然后告诉同一个对象要什么。如果对象具有所需的所有信息,则应自行决定。
您从task1
获取数据并使用task2
使用此信息,而不告诉task1
该怎么做。所以我从说不要问的角度说这是好的。
关于Processor.Process
:也没有错。客户会打电话给myProcessor.Process
,从而告诉它该怎么做,而不是询问。
告诉 - 不要问看起来不错,也许还有其他一些你不喜欢的代码?
例如,您可以考虑将DoStuffToData
放在Data
类中,从而结合状态和行为。但这是否更好取决于模型及其背景。
答案 1 :(得分:0)
一种选择是使用Depenancy Injection(DI)。但是,请确保这不会使代码过于复杂。 DI对unit testing and mocking有用,但也可能导致类太小。