Перейти к основному содержимому

Одна причина для изменения

Принцип единственной ответственности — это буква S в SOLID, пяти правилах проектирования кода, который остаётся простым для изменения. Он гласит: у типа должна быть одна задача — а значит, только одна причина для изменения.

Когда один тип и сохраняет заказы, и отправляет письма, он меняется, когда меняется хранилище, и когда меняется текст письма. Две задачи, две причины, вдвое больше риск сломать одно, трогая другое.

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


Слишком много задач в одном классе

Этот обработчик заказов работает — но он сохраняет заказ, составляет текст подтверждения и «отправляет» его, всё в одном методе. Проверить текст письма отдельно невозможно, а повторное использование части с хранилищем в другом месте означает тащить за собой и код писем.

Один класс, который делает всё

process() смешивает две задачи: сохранение и уведомление. Любое изменение в одной из них означает правку — и повторное тестирование — этого же класса.

Prompt
Напишите программу на Python с классом OrderProcessor, метод process которого выполняет сразу две задачи: выводит сообщение о том, что заказ сохранён в хранилище, и выводит текст письма-подтверждения для клиента. Обработайте один заказ, чтобы показать, что это работает, — как отправную точку для обсуждения принципа единственной ответственности.
Вывод: полная программа на Python

Одна задача на класс

Решение: один класс на одну задачу. OrderStore только сохраняет, EmailSender только отправляет. Небольшая функция координирует их работу.

Вывод тот же — но теперь каждую часть можно изменять, тестировать и повторно использовать отдельно.

Разделение на два класса

То же поведение, но разделённое: хранилище ничего не знает о письмах, отправитель ничего не знает о хранилище. Функция process_order просто соединяет их.

Prompt
Переработайте обработку заказов в два класса Python, у каждого из которых одна задача: OrderStore с методом save, который выводит шаг сохранения, и EmailSender с методом send_confirmation, который выводит письмо. Добавьте функцию process_order, которая вызывает оба. Обработайте один заказ и покажите тот же вывод, что и раньше.
Вывод: полная программа на Python

Выигрыш: повторное использование без опасений

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

Prompt
Используя разделённые классы OrderStore и EmailSender на Python, покажите выигрыш от единственной ответственности: отправьте уведомление об отгрузке тем же отправителем, не затрагивая хранилище, и заархивируйте заказ с помощью хранилища, не отправляя никаких писем. Выведите каждое действие.
Вывод: полная программа на Python