Я читал о TDD и хотел бы использовать его для моего следующего проекта, но я не уверен, как структурировать свои классы с помощью этой новой парадигмы. Язык, который я хотел бы использовать, - это Java, хотя на самом деле проблема не в языке.
Проект
У меня есть несколько единиц оборудования, которые поставляются с интерфейсом ASCII-over-RS232. Я могу давать простые команды, получать простые ответы и управлять ими, как будто с их лицевой панели. Каждый из них имеет немного другой синтаксис и очень разные наборы команд. Моя цель - создать абстракцию / интерфейс, чтобы я мог управлять ими через графический интерфейс и / или удаленные вызовы процедур.
Проблема
Я считаю, что первым шагом является создание абстрактного класса (я плохо разбираюсь в именах, как насчет «Коммуникатора»?), Чтобы реализовать все такие вещи, как последовательный ввод-вывод, а затем создать подкласс для каждого устройства. Я уверен, что это будет немного сложнее, но это ядро приложения в моей голове.
Теперь, для модульных тестов, я не думаю, что мне действительно нужно реальное оборудование или последовательное соединение. Что я хотел бы сделать, так это передать моим коммуникаторам InputStream и OutputStream (или Reader and Writer), которые могут быть из последовательного порта, файла stdin / stdout, переданы из тестовой функции, что угодно. Итак, я бы просто попросил конструктор Communicator использовать их в качестве входных данных? Если это так, было бы легко возложить ответственность за настройку всего этого на среду тестирования, но для реального, кто устанавливает фактическое соединение? Отдельный конструктор? Функция снова вызывает конструктор? Отдельный класс, кому поручено «подключить» коммуникатор к правильным потокам ввода / вывода?
Редактировать
Я собирался переписать проблемный раздел, чтобы получить ответы на вопрос, который, как мне казалось, я задавал, но, думаю, я понял это. Я (правильно?) Определил две разные функциональные области.
1) Работа с последовательным портом
2) Связь с устройством (понимание его вывода и генерация команд)
Несколько месяцев назад я бы объединил все это в один класс. Моей первой идеей покончить с этим было передать только потоки ввода-вывода классу, который понимает устройство, и я не мог понять, кто будет отвечать за создание потоков.
Проведя больше исследований по инверсии управления, я думаю, что у меня есть и ответ. Иметь отдельный интерфейс и класс, который решает проблему # 1, и передавать его конструктору класса (ов?), Который решает проблему # 2. Таким образом, легко проверить оба по отдельности. # 1, подключаясь к реальному оборудованию и позволяя тестовой среде делать разные вещи. № 2 может быть проверен, если ему дразнить # 1.
Это звучит разумно? Нужно ли мне делиться информацией?