SOLID Принципы разделения интерфейсов и инверсии зависимости
sergey shishkin"Interface Segregation Principle (ISP)":
Программные сущности не должны зависеть от методов, которые они не используют.
"Dependency Inversion Principle (DIP)":
Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Эти два принципа очень близки по области своих требований. Оба неявно подразумевают полезность использования минимально возможного базового интерфейса, как инструмента взаимодействия двух алгоритмических блоков: "клиент" и "сервер" - эти названия выбраны просто для идентификации. При этом общая информация, используемая алгоритмическими блоками, сосредотачивается в базовом интерфейсе. Один алгоритмический блок ("сервер") выполняет реализацию базового интерфейса, другой алгоритмический блок ("клиент") обращается к этой реализации.
Целью для этих принципов является минимизация зависимостей алгоритмических блоков, позволяющая производить независимые изменения их кода, если он не меняет базовый интерфейс. Независимость изменения алгоритмических блоков уменьшает сложность и трудозатраты, если компоненты выполняют требования принципа SRP. Подобный подход возможен, потому что в разработке существуют следующие инварианты:
- <1.1>, <1.2>, <1.3>
- каждый алгоритмический блок заложенным в нем поведением формирует ограничения своего использования,
- в каждом месте использования алгоритмического блока могут быть задействованы все его ограничения,
- база алгоритмического блока следствием из определения имеет меньшую сложность и количество ограничений чем алгоритмический блок реализация,
- любое изменение алгоритмического блока изменяет его ограничения и требует проверки всех мест его использования, что порождает затраты времени программиста,
- места использования базы алгоритмического блока не требуют проверки после внесения изменений в алгоритмический блок реализацию.
При этом понятно что "размер" базового интерфейса целесообразно минимизировать, откидывая не используемый функционал и ограничения, тем самым меньше ограничивая алгоритмический блок реализацию по принципу (LSP)
Принципом ISP подчеркивается необходимость разделения (Segregation) интерфейса "сервера", если не весь его публикуемый функционал используется данным "клиентом". При этом выделяется только требуемая клиенту база и обеспечивается минимизация совместно ограничивающей информации.
И здесь хотелось бы выписать набор приемов поддержания DIP. Из очевидных областей, где можно поискать эти приемы:
- разделение описание класса на публичные и приватные части (и другие принципы ООП),
- описание взаимодействия с динамической библиотекой ограниченным набором функций и дескрипторов объектов,
- использование картотеки как интерфейса доступа к книжной библиотеки.