НИ+ ngplus.games

Применение принципов SOLID

326 слов 1 tags
Источник SOLID

Single Responsibility Principle

Классы и интерфейсы должны иметь одну область действия, что характеризуется тем, что они должны иметь только одну причину для изменения.

OCP

Причина для изменения появляется, когда класс или интерфейс не работает. При необходимости добавить новое в работающий класс его необходимо расширить средствами наследования. В случае с интерфейсами создается новый.

Согласно SRP для изменения класса может быть только одна причина - он не работает. Если работает, то он расширяется.

Liskov Substitution Principle

Производные и имплементирующие классы должны реализовывать все методы базового класса и интерфейса. Это будет реализуемо в том случае, когда класс или интерфейс является абстракцией по ключевому признаку, тогда сущность не будет содержать лишних методов.

Базовый класс должен быть такой абстракцией, которая содержит действительно все ключевые признаки будущих потомков.

То же самое касается и интерфейсов - они должны имплементироваться целиком Interface Segregation Principle, соответственно должны являться абстракцией по ключевому признаку и иметь только одну причину для изменения Single Responsibility Principle.

LSP - методы базового класса не должны изменяться концептуально - что на входе и что на выходе, а сами методы могут меняться, принимать те же данные и отдавать те же результаты.

Interface Segregation Principle

Интерфейсы должны имплементироваться целиком. Если интерфейс имплементируется не полностью, значит он не является абстракцией по ключевому признаку, его необходимо разделить.

Можно провести параллель с LSP: правильные абстракции по ключевому признаку позволяют создавать как правильные базовые классы, так и правильные интерфейсы, которые полностью реализуются при наследовании и имплементации соответственно.

Также можно провести связь с SRP: каждый интерфейс должен иметь только одну причину для изменения.

Если разделить разбухший интерфейс на несколько, имеющих одну зону ответственности и одну причину для изменения, согласно SRP, классы смогут имплементировать только нужные им интерфейсы.

Dependency Inversion Principle

Классы высокого уровня должны ссылаться на классы низкого уровня через абстракции в виде интерфейсов, которые исключат зависимость первых от деталей имплементации вторых.

Таким образом, класс высокого уровня обращается к классам низкого уровня через их абстракцию в виде интерфейса, которая обеспечивает его независимость от деталей их реализации.


#программирование