Принцип единственной ответственности
Single Responsibility Principle - SRP
Структура (в оригинале класс) должна иметь только одну причину для изменения, другими словами, структура должна иметь только одну ответственность.
Представьте, что есть устройство, которое и печатает, и сканирует документы. Если это устройство сломается, то придется заменить и печатающую, и сканирующую части, даже если сломалась только одна. Лучше иметь два отдельных устройства для каждой функции.
В Go, можно использовать структуры и интерфейсы, чтобы обеспечить единственную ответственность. Например, разделим функциональность обработки заказов на два отдельных компонента: один для управления заказами, а другой для их обработки.
Принцип открытости/закрытости
Open-Closed Principle - OCP
Описание: Структуры должны быть открыты для расширения, но закрыты для модификации. Это значит, что поведение структуры может быть расширено без изменения ее кода.
Представьте сервис нотификаций, который отправляет уведомления голубиной почтой. Но вот незадача, пользователи захотели получать уведомления по SMS. Вместо изменения существующего подхода по отправке нотификаций, можно просто расширить наш сервис, добавив в него очередной способ отправки. Голубей также оставляем.
В Go OCP достигается с помощью интерфейсов. Создаем интерфейс, который определяет нужное поведение, и затем реализуем это поведение по своему в различных структурах без изменения существующего кода.
В примере, интерфейс Notifier определяет метод Notify. EmailNotifier и SMSNotifier реализуют этот интерфейс, каждый предоставляя свою логику для отправки уведомлений.
NotificationService использует Notifier для отправки уведомлений. Мы можем легко добавить новые способы уведомления, реализовав интерфейс Notifier, не изменяя при этом существующий код NotificationService. Это и есть суть принципа открытости/закрытости: система открыта для расширения, но закрыта для изменения.
Остальные принципы рассмотрим в следующей части.