Большая часть моего приложения на C++ использует классы для описания модели данных, например. что-то вроде ClassType (который фактически эмулирует отражение на простом C++).Сохранение независимых модулей при использовании друг друга
Я хочу добавить новый модуль в свое приложение, и ему необходимо использовать эти классы ClassType, но я предпочитаю не вводить зависимости из моего нового модуля в ClassType.
До сих пор у меня есть следующие альтернативы:
- Не делая его независимым и ввести зависимость от ClassType, с риском создания более «spaghetti'-зависимостей в моем приложении (это мой наименее предпочтительным раствор)
- Представьте новый класс, например IType, и пусть мой модуль зависит только от IType. ClassType должен затем наследоваться от IType.
- Используйте строки как метод идентификации и вынуждайте пользователей нового модуля преобразовывать ClassType в строку или наоборот, если необходимо.
- Использование GUID (или даже простые целые числа), как идентификация, также требует преобразования между GUID-х и ClassType-х
Как далеко вы должны попытаться пойти, когда развязку модулей в приложении?
- просто введите интерфейс и пусть все остальные модули полагаются на интерфейс? (например, в описании типа IType)
- еще разделить его, используя другие идентификаторы, такие как строки или GUID?
Я боюсь, что, отделив его слишком далеко, код становится более неустойчивым и сложнее отлаживать. Я видел один такой пример в Qt: сигналы и слоты связаны с помощью строк, и если вы делаете ошибку ввода, функциональность не работает, но она все еще компилируется.
Как далеко вы должны блокировать свои модули?
Полностью согласен. Reinventing RTTI почти всегда предает фундаментальное отсутствие понимания C++ OOP. – Reinderien
У меня есть веские основания использовать дизайн на основе отражения, потому что мое приложение несколько особенное. Используя файл конфигурации, пользователи могут расширять datamodel с помощью дополнительных типов и свойств. Этого невозможно достичь без разработки на основе отражения, а также RTTI C++ здесь не помогает. Если бы не эта гибкость, я бы полностью согласился с вами. К сожалению, в этом случае я не могу. – Patrick
@Patrick: Если типы, с которыми вы работаете, являются динамическими, в любом случае вы не сможете реализовать свою систему типов с точки зрения типов C++. Youd лучше с типом 'UserType', который может содержать sub' UserType ', который пользователь может затем расширить. –