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この情報を使用します。だから私は、言うな、聞かないという観点から、これはOKだと思います。task2task1

に関しては、Processor.Processそこにも問題はありません。クライアントは電話myProcessor.Processをかけ、何をすべきかを尋ねずに伝えます。

質問しないでください、OK のように見えますが、コードに何か気に入らない点があるのではないでしょうか? たとえばDoStuffToDataDataクラスに を配置して、状態と動作を組み合わせることを検討できます。ただし、これが優れているかどうかは、モデルとそのコンテキストによって異なります。

于 2010-10-17T11:47:48.707 に答える
0

1 つのオプションは、依存性注入(DI) を使用することです。ただし、これによってコードが過度に複雑にならないようにしてください。DI は単体テストとモック化に役立ちますが、クラスが小さすぎる可能性もあります。

于 2010-10-17T10:00:54.023 に答える