Я думаю, что если мой класс выполняет SRP, нет необходимости извлекать больше
чем один интерфейс.
Принцип единой ответственности заключается в том, что у класса (или метода) не должно быть более одной причины для изменения (т.е. каждый отвечает только за одну функцию). Чтобы соблюдать это, вы будете создавать новые классы по мере развития вашей системы.
например. если вы начнете с класса Car
и обнаружите, что вам нужна функциональность для переключения передач, вы извлечете его в класс Gearbox
. Это означает, что если вы меняете механизм переключения передач, родительский класс Car
менять не нужно. Если вы добавите усилитель рулевого управления в свой автомобиль, вы снова извлечете его в свой класс. Радио было бы другим классом.
Этот каскад абстракции будет происходить на протяжении всего вашего Car
класса. Переместившись от самого Car
вниз, вы обнаружите, что детализация увеличивается в каждом классе - например, в то время как класс Car
может иметь метод changeGear()
, позволяющий пользователю выбирать включенную передачу, класс Gearbox
будет следить за тем, как это происходит (например, нажать на сцепление, отключить текущую передачу). выберите новую передачу и т. д.)
Однако при разработке ОО мы не хотим раскрывать детали нашего Gearbox
конечному пользователю - мы хотим, чтобы они взаимодействовали с нашей системой на высоком уровне абстракции, без необходимости знать, как работают внутренние устройства. Работа. Мы также хотим ограждать эти внутренние компоненты, чтобы мы могли изменить их в будущем, не требуя от пользователей рефакторинга их кода (поэтому мы помечаем их как private
или protected
).
Из-за этого мы позволяем пользователям взаимодействовать с нашим автомобилем только через сам класс Car
. Это , где вступает Принцип разделения интерфейса . SRP гарантирует, что класс Car
делегирует свои подкомпоненты различным классам, но все наши методы public
все равно будут вызывается через сам класс Car
. ISP гарантирует, что вместо того, чтобы объединять все это вместе в одном интерфейсе, мы вместо этого создаем логические различия и выставляем несколько интерфейсов для связанной функциональности.