Здравствуйте, разрабатываю приложение диагностики автомобилей.
Вот краткая последовательность работы:
- Пользователь выбирает тип подключения: Bluetooth/Wi-Fi
- Приложение подключается к машине
- Приложение отправляет несколько тестовых запросов, чтобы определить протоколы общения KWP2000/UDS
- Протоколы общения сохраняются в Singleton
- Есть 4 разных экрана на которых отображаются данные автомобиля
- Каждый экран может получать данные по разным протоколам KWP2000/UDS
Приложение работает. Графическая часть никак не связана с кодом реализации протоколов. Я в любой момент могу добавить новый протокол или новый экран ничего не сломав. Но архитектура получилась вся на основе шаблона делегирования и протоколов.
- Класс EngineViewController делегирует получение данных классам EngineKWP2000 или EngineUDS.
- Классы EngineKWP2000 и EngineUDS занимаются только расшифровкой данных, а получение данных делегируют классам KWP2000 или UDS.
- Классы KWP2000 и UDS занимаются только составлением правильных команд для отправки в машину, а делегируют получение данных классу Networking.
- К сожалению Networking приходится делать глобальным, чтобы один объект можно было использовать на разных экранах с разными протоколами.
- Класс Networking создает 2 объекта: wifiCommunication или bluetoothCommunication и уже через них общается с машиной.
Получается, что в цепочке делегирования находятся 4 класса: EngineViewController -> EngineKWP2000 -> KWP2000 -> Networking
Промежуточные классы EngineKWP2000 и KWP2000 и делегируют и сами являются делегатами. Мне не нравится эта сложность, можно ли как-то упростить архитектуру?