Опубликован в вт, 07/22/2025 - 13:23
- Single responsibility principle — Принцип единственной ответственности
Каждый класс/метод должен иметь только одну причину для изменения. То есть выполнять только одну задачу. Весь код, который меняется по этой причине, должен быть собран в этом модуле.
Каждый объект должен иметь одну ответственность и эта ответственность должна быть полностью инкапсулирована в класс. Все его поведения должны быть направлены исключительно на обеспечение этой ответственности.
Для каждого класса должно быть определено единственное назначение. Все ресурсы, необходимые для его осуществления, должны быть инкапсулированы в этот класс и подчинены только этой задаче.
- Open-closed principle — Принцип открытости / закрытости
Программные сущности(классы, модули, сущности и т.д.) должны быть открыты для расширения, но закрыты для изменения.
- Liskov substitution principle — Принцип подстановки Барбары Лисков
Объекты в программе должны быть заменяемыми на объекты их подтипов без изменения корректности работы программы.
При замене родительского класса на любой производный класс корректность работы программы должна сохраняться.
Функции, которые используют базовый тип должны иметь возможность использовать подтипы базового типа, не зная об этом.
Поведение наследуемых классов не должно противоречить поведению, заданному базовым классом. Поведение наследуемых классов должно быть ожидаемым для кода, который использует базовый класс.
- Interface segregation principle — Принцип разделения интерфейса
Клиенты не должны зависеть от интерфейсов(методов), которые они не используют.
Программные сущности не должны зависеть от методов, которые они не используют.
Много интерфейсов, специально предназначенных для клиентов, лучше, чем один интерфейс общего назначения.
- Dependency inversion principle — Принцип инверсии зависимостей
Зависимости должны строиться от абстракций, а не от конкретных классов.
Классы высокого уровня не должны зависеть от классов низкого уровня. И те и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависесть от абстракций.
- Абстракция - обощение семейства объектов, выделение общей сути. Это принцип отделения концепции(общего) от конкретной реализации. В реализации это абстрактный класс(например
abstract class Item).
- Классы низкого уровня - конкретные объекты, которые имеют общее семейство, но разные детали. В реализации это какой-то наследник абстрактного класса(например
class UnitItem extends Item).
- Классы высокого уровня - классы, обрабатывыющие группы классов низкого уровня. В реализации это какой-то контроллер, в котором имплеменнтированы методы для управления сущностями
UnitItem.
- Детали - уникальные элементы классов низкого уровня, присущие только этим классам. Конкретные поля и методы класса
UnitItem, которые относятся конкретно к этому классу.
Архитектура кода должна быть основана на абстракции, а не на конкретных реализациях.