В последнее время я занимаюсь объектно-ориентированным дизайном, стремясь улучшить свои дизайнерские навыки. Этот вопрос касается определенного дизайнерского выбора, который я вижу несколько часто и не понимаю смысла. Я знаю, что выбор дизайна имеет тенденцию к субъективному, но я хотел бы знать, что другие думают об этом, чтобы узнать, улучшаются ли мои дизайнерские инстинкты или ухудшаются.Внедрение интерфейса по сравнению с методом, возвращающим объект, реализующий интерфейс
Я смотрел Robert C Martin(Uncle Bob) -Clean Architecture and Design-2012 COHAA The Path to Agility Conference. Во время разговора он рассказывает историю о развитии Fitnesse. Я не знаком с программным обеспечением, поэтому я ищу его и найду the project hosted on github.
При просмотре проекта, одна вещь привлекает мое внимание в WikiPage
interface: метод PageCrawler getPageCrawler();
. Поэтому я просматриваю PageCrawler
interface, чтобы посмотреть, как это выглядит. Изучив этот интерфейс, я думаю, что методы в PageCrawler
выглядят так, как будто они будут принадлежать WikiPage
и что WikiPage
может разумно реализовать интерфейс.
Я бы подумал, что разделение двух может привести к тому, что WikiPage
будет подвергать внутренности, чтобы информация, необходимая для сканирования страницы, была доступна для объектов, которые сканируют ее. Кроме того, абстрактный класс BaseWikiPage
просто возвращает новый PageCrawlerImpl
, и нет никаких других PageCrawler
реализаций в проекте из того, что я вижу.
Я видел этот тип кода в других проектах, где метод одного интерфейса/класса возвращает объект другого интерфейса/класса с методами, которые могут разумно принадлежать первому классу. Пытаясь увидеть намерение разработчиков Fitnesse, единственной причиной такого дизайна, с которой я столкнулся, является то, что разработчикам, которые создают новые вики-страницы путем реализации WikiPage
, не требуется повторная реализация функций обхода, то есть функциональность обхода должны быть одинаковыми независимо от реализации страницы wiki. Является ли это целью такого дизайна, или я что-то упускаю?
Я нашел вопрос Implementing an interface vs. providing an interface на SO, но это было не совсем то же самое и не давало большого понимания, когда вы можете создать что-то подобное.
Спасибо, Джон, я так не думал об этом. Однако моя интерпретация ISP отличается. Я думал, что интернет-провайдер разделяет обязанности на единые интерфейсы и создает объект, реализуя интерфейсы, не обязательно возвращая объект из метода, реализующего интерфейс. В этом случае я думаю, что существование интерфейса 'PageCrawler' - это использование ISP. Если «WikiPage» реализует его, клиенты интерфейса «PageCrawler» до сих пор не знают, что разработчик является «WikiPage». – TheSecretSquad
Кроме того, похоже, что вы говорите, что клиенты 'WikiPage' не должны знать о методах' PageCrawler' (это то, что вы имели в виду?), Но у них все еще есть доступ к ним, но теперь они зависят от того, что кажется избыточное сообщение ('getPageCrawler'). Разве это не лучше, если использовать декоратор, например, если WikiPage реализует 'PageCrawler', а затем' WikiPage' может выбрать делегирование отдельному объекту внутри, который также реализует 'PageCrawler'? Я предполагаю, что моя перспектива: они говорят, что «WikiPage» имеет «PageCrawler», но для меня «WikiPage» является _crawlable_. – TheSecretSquad