告诉不要在任务之间询问和共享状态

时间:2010-10-17 09:54:16

标签: c# tell-dont-ask

在这个简单的例子中(当然我的现实世界问题有点复杂,虽然基础是相同的),我如何强制告诉不要求最大值?我喜欢最大化告诉不要在流程方法中询问,在其当前状态下更难以模拟和测试。

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);
        }
    }

2 个答案:

答案 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有用,但也可能导致类太小。