Если сомневаетесь, рассмотреть проблему с другой подход: «Как бы я проверить эти объекты? " «Как я могу проверить окно?» «Что бы облегчить тестирование?» Будучи ленивым программистом, для меня очень важный вопрос. Я хочу, чтобы тесты были грязными, но очень эффективны, доказывая, что мой код работает.
В вашем случае у вас есть автомобиль с дверями, которые могут открываться и закрываться, а в дверях есть окна, которые могут открываться и закрываться, и они могут или не могут быть электрически управляемы. Как бы вы протестировали функцию «window-down»? Является ли существование окна зависимым от двигателя? Это даже зависит от автомобиля, или он действительно зависит только от двери? У разных дверей разные окна с разными правилами или разные поездки? Используют ли разные двери одинаковые электродвигатели для привода окон, или же оконные двигатели отличаются для левого монтажа или правого монтажа?
И подумайте, что клиент может дать вам требование, согласно которому «окна работают только при работе двигателя», но это правда? В большинстве автомобилей окна работают, когда выключатель питания автомобиля повернут на «включено». Иными словами, зависит ли работа окна от вращающегося коленчатого вала в двигателе, или это действительно зависит от 12 вольт электричества? Так вам действительно нужен экземпляр двигателя в машине, чтобы проверить окно, или вам просто нужна батарея?
Как только вы начнете задавать эти вопросы, вы, вероятно, сделаете вывод о том, что окно электропитания заслуживает собственного набора тестов (вверх/вниз/частично/полноправное движение/и т. Д.), Поэтому оно становится хороший кандидат на то, чтобы быть его собственным классом. Количество разных дверей может быть сложным, поэтому вы считаете, что «завод двери» может быть подходящим классом для создания, который может управлять всеми различными видами дверей. Тестирование вещей в изоляции всегда проще: посмотрите на более сложные вопросы о настройке дроссельной заслонки двигателя для проверки функции окна? Что относительно передачи или открытия/закрытия двери? Все эти перестановки затрудняют тестирование, хотя они не влияют на работу окна или нет. Таким образом, все это заставило меня подумать, что классы окон должны быть проверены как можно более автономно. В реальном мире вам нужно всего лишь 12 вольт, чтобы проверить окно власти, установленное в двери. Таким образом, в вашем смоделированном мире вам нужен только макет или поддельный источник питания, чтобы обеспечить смоделированную мощность, а не объект двигателя или передачу. Это более простой тест.
После того, как вы примете эти соображения, вы начинаете понимать, что проходящие зависимости в тестах (вот источник питания для теста окна) позволяет их легко тестировать; таким образом, способ собрать реальные компоненты в вашей модели означал бы инкапсулирующее строительство на фабриках, чтобы сделать самый простой способ создать свой автомобиль; поэтому построение автомобиля может предполагать использование абстрактного шаблона фабрики для ввода всех зависимостей в автомобиль.
Возможно, вы даже начинаете с простого, но хрупкого класса автомобилей с жестко закодированным двигателем и жестко закодированными дверями, а затем реорганизуете его, чтобы добавить тесты, подобные приведенным выше. Вероятно, вы все равно останетесь с независимыми объектами «Автомобиль», «Дверь» и «Окно» и абстрактным шаблоном фабрики, чтобы создать их все на основе модели автомобиля, который строится. Эта идея называется «эмерджентным дизайном».
Не было ни одного наилучшего ответа, я думаю, что это относится к вики сообщества. – DOK
@ DOK: Согласен ... :) – rozon
Там * есть один лучший ответ: John R. Strohm's. –