0

在这个简单的例子中(当然我的现实世界的问题要复杂一点,虽然基础是一样的),我如何强制告诉不要问到最大?我想最大限度地告诉不要在过程方法中询问,在当前状态下,它更难模拟和测试。

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

2 回答 2

2

从告诉-不问的角度来看,这段代码似乎并不算太​​糟糕。

Tell-don't-ask 基本上意味着您不应该查询一个对象的状态,根据它的状态做出决定,然后告诉同一个对象要做什么。如果对象拥有它需要的所有信息,它应该自己决定。

您从 获取数据task1并使用此信息task2,而无需告诉task1您要做什么。所以我会从告诉-不问的角度说这很好。

关于Processor.Process:那里也没有错。客户会打电话myProcessor.Process,从而告诉它要做什么,而无需询问。

Tell-don't-ask looks OK, maybe there is something else about the code you don't like? For instance, you could consider putting the DoStuffToData in the Data class, thereby combining state and behavior. But whether this is better depends on the model and its context.

于 2010-10-17T11:47:48.707 回答
0

一种选择是使用依赖注入(DI)。但是,请确保这不会使您的代码过于复杂。DI 可用于单元测试和模拟,但它也可能导致类太小。

于 2010-10-17T10:00:54.023 回答