будет разделение ответственности: кухня, санузел, комнаты. Дому нужна зависимость: источник электричества. К счастью, электростанция рядом, установим связь между ней и новым домом.
A. Shared object В этом случае и второй дом подключится к электростанции напрямую. B. Dependency injection Первый дом поделится своими зависимостями, чтобы «запитать» второй.
кроме рутины по передаче зависимостей на каждом шаге. Архитектура работает. Но вот мы получаем задание: через дорогу начинается стройка больницы. И ей необходимо электричество. (Модальная презентация).
будем строить новую магистраль от электростанции, так как отпадет смысл в предыдущих ухищрениях. • Петрович из четвертого дома удачно живет прямо у дороги, он и поделится электричеством, а также всеми остальными коммуникациями.
мере реализует задачу из предметной области. Задача «система распознала пользователя, развернула периферию и готова к работе» тоже относится к бизнес-логике, это важная «фича» на раннем этапе разработки. Раз есть бизнес-логика, должна быть и соответсвующая модель. Таким образом, при помощи моделей реализован весь пользовательский опыт, включая авторизацию.
логики. • Main Screen стал рядовым объектом. • Session удерживается в памяти контроллером сессий, но явно с ним не взаимодействует. Завершение сессии автоматически выгрузит из памяти все сервисы и модели.
не требующих распространения на все дерево. Например, команда «открыть боковое меню» может быть отправлена из любой модели Main Flow, модель сценария перехватит и выполнит ее.
мы используем готовые блоки функционала в моделях в качестве свойств: фильтры, форматтеры, валидаторы. Подход «Дерево моделей» позволяет наделить каждый такой объект всеми возможностями полноценной модели.
встроенные в дерево, легко переиспользовать. Инкапсуляция: каждый строительный блок в дереве моделей отвечает за определенную задачу, но все они работают вместе. Моделей столько, сколько этого требует логика, без привязки к экранам.
лишь не увидим результатов и не сможем давать новые команды. Логика не знает о UIKit. «Ядро» будет работать и под OS X. Представление, пусть это будет UIViewController, держит слабую ссылку на модель, ведь как мы помним, модель удерживается в памяти родителем.
и передавать ей пользовательские команды. Модель ничего не знает ни о представлении, ни о реализации родителя. Сигналы — идеальная метафора для этого подхода.
«поддерево», управляет данными, но непосредственно на экране не представлена. Кто-то в слое представления должен «строить» иерархию контроллеров вида в соответствии с ее активностью. UINavigationController — дословно: контроллер навигации пользовательского интерфейса.
для родительской модели. При необходимости может держать ссылки на определенные контроллеры в своем стеке для передачи откликов. (хотя это и плохой подход) Логика создания экзамена по-прежнему принадлежит слою модели, контроллер навигации лишь преобразует структуру поддерева в «экраны».
модель. 2. Модель создается с правильным родителем. 3. Срабатывает pushChildSignal, подписанный на него UINavigationController создает подходящий вид и связывает его с моделью. 4. UINavigationController выполняет push стека навигации.
проекта и кода — постоянная величина. Неявная инъекция зависимостей. Масштабируемость — одно из базовых свойств. Базовые классы неизменны. Платформонезависимость логики.