Скажи не спрашивай и делил состояние между задачами - PullRequest
0 голосов
/ 17 октября 2010

В этом простом примере (конечно, моя проблема в реальном мире немного сложнее, хотя основы одинаковы), как мне принудительно сказать «не спрашивать по максимуму»?Я хотел бы получить максимальный совет, не спрашивайте в методе процесса, в его текущем состоянии его труднее смоделировать и проверить.

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

РЕДАКТИРОВАТЬ: Обновлен образец more DIish

public class Processor
    {
public Processor(ITask1 task1, ITask2 task) {...}
        public void Process()
        {
            var data = task1.DoStuff();
            task2.DoStuffToData(data);
        }
    }

Ответы [ 2 ]

2 голосов
/ 17 октября 2010

Этот код выглядит не так уж плохо с точки зрения Tell-Don't-Ask .

По сути, Tell-Don't-Ask означает, что вы не должны запрашивать объекто его состоянии, примите решение, основанное на его состоянии, и затем скажите тому же объекту, что и .Если объект имеет всю необходимую ему информацию, он должен решить для себя.

Вы получаете данные от task1 и используете эту информацию с task2, не сообщая task1, что делать.Так что я бы сказал, что это нормально с точки зрения «не спрашивай».

Что касается Processor.Process: там тоже ничего плохого.Клиент звонит myProcessor.Process и тем самым говорит ему, что делать, не спрашивая.

Скажи-не-спроси выглядит хорошо, может быть, есть что-то еще в коде, который тебе не нравится?Например, вы можете рассмотреть вопрос о включении DoStuffToData в класс Data, тем самым комбинируя состояние и поведение.Но будет ли это лучше, зависит от модели и ее контекста.

0 голосов
/ 17 октября 2010

Один из вариантов - использовать Depenancy Injection (DI).Однако убедитесь, что это не слишком усложнит ваш код.DI может быть полезен для модульного тестирования и макета , но также может привести к слишком маленьким классам.

...