Тесты ведущий автомобиль


Я поймала струю код-запах, происходящий от одного из моих тестов, в сценарии сродни следующим:

[TestFixture]
public void CarPresenterTests{

    [Test]
    public void Throws_If_Cars_Wheels_Collection_Is_Null(){
         IEnumerable<Wheels> wheels = null;
         var car = new Car(wheels);
         Assert.That(
         ()=>new CarPresenter(car),
         Throws.InstanceOf<ArgumentException>()
         .With.Message.EqualTo("Can't create if cars wheels is null"));
    }
}

public class CarPresenter{
    public CarPresenter(Car car)
    {
        if(car.Wheels == null)
            throw new ArgumentException("Can't create if cars wheels is null");
        _car = car;
        foreach(var wheel in _car.Wheels)
        {
            wheel.Rolling += WheelRollingHandler;
        }
    }
}

Я изо всех сил пытался описать в чем проблема, кроме того, что мне кажется неправильным, что CarPresenter должны пытаться диктовать машине , соответствует ли его диски инициализируются правильно.

Я подумал, что указатели люди здесь могут дать мне?



487
5
задан 22 июня 2011 в 12:06 Источник Поделиться
Комментарии
3 ответа

Это действительно автомобиль, автомобиль без колес?

Если нет, то проверка должна проводиться на автомобиль сроки строительства и CarPresenter не должны проверять на null, он должен считать, что хороший рабочий автомобиль передается ему. (Коррекция, CarPresenter должны проверить на сроки строительства, что автомобиль - это не нуль.)

При условии, конечно, что автомобиль - это класс, который вы управляете, а также, следовательно, вы можете изменить его.

И хотя речь идет о запахах... у вас нет столько инкапсуляции. Колеса на машине должны, вероятно, быть наедине с публичных методов доступа, если это необходимо.

Ответ на комментарий:


Так, что вы просто обрабатывать событие
Колеса.Роллинг событие и принять, что
если колеса имеет значение null исключение будет
кинули

Нет, если вы посмотрите на сроки строительства и убедитесь, что у вас есть рабочие колеса, то вам не нужно беспокоиться об этом позже. Это намного лучше, чтобы тупо (исключение на этапе выполнения) указать как можно раньше, если кто-то ошибся (передает значение null для колес), чем ждать, когда эти колеса, чтобы взорвать, кто знает, где в коде.

10
ответ дан 22 июня 2011 в 12:06 Источник Поделиться

Во-первых - мне не нравится идея, утверждающая, на сообщение исключения. Я бы предпочел класса бросить WheelNotFoundException , а не исключение ArgumentException. Это может быть легко утверждать на.

Во-вторых, запах, что я вижу из самого класса:


  1. Как @c_maker указал, проверка на наличие колес должно быть сделано при создании автомобиля. Это не CarPresenter'ы ответственность, чтобы проверить, если автомобиль является действительным. Кроме того, CarPresenter берет машину в качестве параметра - в этом контракте должны сообщить CarPresenter , что автомобиль создан правильно.

  2. Опять немного нарушение инкапсуляции - CarPresenter должны заниматься только автомобилем объекта, а не открыть его свойства элемента непосредственно. В этом случае я предпочел бы иметь автомобиль.Человека события обрабатываются в CarPresenter и в автомобиле класса следует цепь событий, чтобы колесо катится.

  3. Автомобиль имеет колесас коллекцией колеса. Вы смотрите на общий обработчик событий для колесас коллекцией? Я бы предпочел каждое колесо , имеющей собственное мероприятие.

2
ответ дан 22 июня 2011 в 03:06 Источник Поделиться

В основном, при прохождении колеса в конструкторе, вы говорите, его общедоступный интерфейс как-то связано с приданием ей колеса. То есть все, что делает автомобили могут дать неверный ввод.

Инкапсулировать строительных машин:

builder = new CarBuilder();

var car = builder.Car().Wheel().Wheel().Wheel().Wheel().SteeringWheel().AsCar();

Можно даже сделать колеса фабрик и таких для разных типов колес.

0
ответ дан 22 июня 2011 в 02:06 Источник Поделиться