Редко, когда мы получаем дизайн вопросов (я имею в виду, интересные).
Давайте на минутку забудем (очевидно) надуманный пример и сконцентрируемся на понятии.
Мы имеем2 решения:
- Hard сдерживание: потяните заголовок и создайте объект напрямую
- Soft сдерживание: вперед объявите заголовок ииспользуйте указатель
Я добровольно откажусь от всех аргументов "производительности" на данный момент.Производительность не имеет значения в 97% случаев (говорит Кнут), поэтому, если мы не измерим заметную разницу, поскольку функциональность идентична, нам не нужно беспокоиться об этом в данный момент.
Поэтому у нас есть две ортогональные концепции, пытающиеся повлиять на наше решение:
- Зависимость заставляет нас склоняться к Мягкому сдерживанию
- Простота заставляет нас склоняться к Жесткому сдерживанию
Некоторые ответы здесь справедливо говорят о полиморфизме, но точная реализация Door
- это деталь, которая Door
Беспокойство, а не Garage
.Если Door
желает предложить несколько реализаций, это нормально, если его клиенты не должны беспокоиться об этой детали.
Я сам фанат принципов KISS и YAGNI.Поэтому я бы поспорил в пользу жесткого сдерживания ... с одним предупреждением .
При разработке интерфейса, который будет открыт, поэтому интерфейс, который стоит наГраница библиотеки, то этот интерфейс должен предоставлять минимум зависимостей и внутренних компонентов.В идеале это должен быть Facade
или Proxy
, объект, единственной целью которого является скрытие внутренних элементов библиотеки, и этот объект должен иметь минимальные зависимости в своем заголовке и иметь максимальную совместимость с макетом, что означает:
- нет виртуального метода
- простой указатель в качестве атрибута (Pimpl)
Для всех внутренних классов простота не дает покоя.