Во время чтения книги Чистая архитектура от Боба Мартина, наткнулся на шаблон о котором ранее не слыхал… Очень удивился, когда я понял, что я использовал его всегда 😲
Этот скромный шаблон имеет не менее скромное название - “Скромный объект”. Если ранее ты тоже не слыхал о таком паттерне - продолжай читать.
Что это за скромняга и какую проблему он решает? ☺️
При написании тестов, мы часто сталкиваются с проблемой тестирования компонентов, которые тесно связаны с каким-то фреймворком (UI, конкретные базы данных, зависимости типа Facebook, Firebase и т.д.). Тестирование таких объектов очень неудобное из-за сложности или даже невозможности создания зависимостей, которые необходимы нашему объекту для работы.
И решить эту проблему может лень из-за которой ты не пишешь тесты паттерн “Скромный объект”, который позволяет протестировать логику этих сложных для создания экземпляров объектов.
Как это работает? 🤔
🎯 Цель — разделить поведение на два класса:
- “Скромный” класс, который будет содержать все, что с трудом поддается тестированию, в упрощенном до предела виде.
- Второй класс, который будет содержать все, что было выброшено из “скромного” класса.
В итоге мы получаем Скромный Объект, который очень прост, содержит на столько мало кода и работает так прозрачно, что нам даже не нужно покрывать его тестами. Зато второй объект (нескромный) теперь не содержит зависимостей, которые трудно создать, что позволяет легко покрыть его тестами.
Скромный класс можно закрыть интерфейсом и легко подменять его в тестах “нескромного” класса.
Примеры использования паттерна 🧑💻
Использование в архитектурном паттерне MVP
MVP (Model-View-Presenter) во всю использует шаблон «Скромный объект». Можно разделить два вида поведения на два разных класса: View и Presenter.
Представление (View) — это “скромный” объект, UI зависимый код, который сложный для тестирования. Код в этом объекте должен быть максимально простым. Он просто переносит данные в графический интерфейс, никак не обрабатывая их.
Presenter — это легко тестируемый объект с четко определенной задачей - получить данные и преобразовать их для отображения на View.
Обертка над базой данных
Допустим настал тот день, когда ты решил(а) уйти с айти затянуть базу данных в свое приложение. В iOS, это может быть CoreData или Realm, но это детали от которых нужно избавиться для того, что бы покрыть нашу бизнес-логику тестами и не заботиться о том какая база данных используется под капотом.
Использование CoreData или Realm нужно сделать максимально скромным, держать код простым, например реализовать только методы CRUD.
CRUD — четыре базовые функции, используемые при работе с базами данных: создание (create), чтение (read), модификация (update), удаление (delete)
Весь остальной код, связанный с бизнес-правилами, характерными для приложения (получение списка сообщений, используя скромный объект) стоит держать отдельно, так как данный код не является скромным, легко поддается тестированию и может использовать скромный объект для совершения CRUD операций.
Заключение 🔑
Несмотря на свою скромность, шаблон “Скромный объект” так или иначе используется каждым из нас. Паттерн поможет повысить тестируемость и модульность путем выделения тяжело тестируемого кода в отдельный “скромный” класс, оставшийся код просто остается в текущем классе и его можно легко протестировать.
Куда дальше? 🛣
Уверен, что в твоем проекте есть парочку классов-монстров, которые сложны в тестировании и далеко не скромны по своим возможностям. Самое время разобраться с этим, используя паттерн “Скромный объект” 😉