Громкое ДА с TDD (и с несколькими исключениями)
Спорные хорошо, но я бы утверждать, что тот, кто отвечает «нет» на этот вопрос отсутствует фундаментальное понятие TDD.
Для меня ответ - да, если ты следуешь TDD. Если нет, то нет правдоподобного ответа.
DDD в TDD
Часто упоминается, что TDD имеет основные преимущества.
- Оборона
- Обеспечение кода может измениться, но не его поведение .
- Это позволяет очень важную практику рефакторинга .
- Вы получаете этот TDD или нет.
- дизайн
- Вы указываете, что что-то должно делать, как оно должно вести себя, прежде чем его реализовать .
- Это часто означает более обоснованные решения о реализации .
- Документация
- Набор тестов должен служить документацией спецификации (требований).
- Использование тестов для этой цели означает, что документация и реализация всегда находятся в согласованном состоянии - изменение одного означает изменение другого. Сравните с сохранением требований и дизайна на отдельном текстовом документе.
Отдельная ответственность от реализации
Как программисты, ужасно заманчиво думать об атрибутах как о чем-то значимом, а о получателях и установщиках - как о неких накладных расходах.
Но атрибуты - это детали реализации, а сеттеры и геттеры - это контрактный интерфейс, который фактически заставляет программы работать.
Гораздо важнее записать, что объект должен:
Позвольте своим клиентам изменить свое состояние
а также
Разрешить своим клиентам запрашивать его состояние
затем, как это состояние на самом деле хранится (для которого атрибут является наиболее распространенным, но не единственным способом).
Тест, такой как
(The Painter class) should store the provided colour
важно для документации части TDD.
Тот факт, что возможная реализация является тривиальным (атрибутом) и не приносит никакой пользы для защиты, должен быть неизвестен вам при написании теста.
Отсутствие круговой инженерии ...
Одной из ключевых проблем в мире разработки систем является отсутствие кругового инжиниринга 1 - процесс разработки системы разбивается на отдельные подпроцессы, артефакты которых (документация, код) часто несовместимы.
1 Броди, Майкл Л. «Джон Милопулос: шить семена концептуального моделирования». Концептуальное моделирование: основы и приложения. Springer Berlin Heidelberg, 2009. 1-9.
... и как TDD решает это
Это часть документации TDD, которая обеспечивает согласованность спецификаций системы и ее кода.
Сначала проект, потом реализация
В рамках TDD мы сначала пишем неудачный приемочный тест, а затем пишем код, который позволяет им пройти.
В BDD более высокого уровня мы сначала пишем сценарии, а затем заставляем их проходить.
Почему вы должны исключить сеттеры и геттеры?
Теоретически, в рамках TDD один человек может написать тест, а другой - реализовать код, который делает его успешным.
Так что спросите себя:
Должен ли человек, пишущий тесты для класса, упомянуть методы получения и установки.
Поскольку методы получения и установки публичный интерфейс класса, то ответ, очевидно , да , или не будет никакого способа набора или запроса состояния объекта.
Очевидно, что если вы сначала напишите код, ответ может быть не таким четким.
Исключения
Есть некоторые очевидные исключения из этого правила - функции, которые являются четкими деталями реализации и явно не являются частью дизайна системы.
Например, локальный метод 'B ()':
function A() {
// B() will be called here
function B() {
...
}
}
Или частная функция square()
здесь:
class Something {
private:
square() {...}
public:
addAndSquare() {...}
substractAndSquare() {...}
}
Или любая другая функция, которая не является частью public
интерфейса, который нуждается в написании при разработке системного компонента.