Небольшой демо проект для собеседований.
Архитектура: MVP+Router+SOA.
Многое намеренно упрощено. В некоторых таких местах есть комментарии.
Намеренно не использована ни одна внешняя зависимость. В некоторых местах есть комментарии с указанием, чтобы я использовал из внешних зависимостей.
- Реализована многоколоночная динамическая верстка на UICollectionView.
- Поддерживаются все размеры экранов и все ориентации устройств.
- Поддерживается темная тема.
- Поддерживаются динамические шрифты (Accessibility).
- Поддерживаются интерфейсы с написанием справа налево.
Т.к. в проекте я не использовал внешние зависимости, код верстки может показаться несколько громоздким.
В проде совершенно оправданно использовать какой-либо DSL поверх нативного API Autolayout наподобие SnapKit.
Последние 4 года в hh.ru команды под моим руководством при разработке использовали паттерн VIPER. За это время создано более 200 новых VIPER модулей. Считаю, что в момент, когда принималось решение использовать VIPER, это было оправданно. VIPER описывает понятные границы ответственностей. Был удобен в т.ч. для последовательного разбиения Legacy MVC модулей на части (выделение роутера, интерактора).
Несомненно, VIPER для ряда случаев создает излишние накладные расходы.
В данный момент для нового проекта я предпочту скорее MVVM-C + RxSwift (Combine в будущем)
Представлена самая простая реализация. Ее можно усложнять в плане поддержки отмены запросов, разных способов энкодинга, добавить поддержку хидеров авторизации, retrier, ssl pinning и т.д. С другой стороны для всего этого можно просто взять Alamofire, где все это есть. Но, само собой, об Alamofire будет знать лишь один класc. Тот, который будет реализовывать интерфейс NetworkClient. Т.е. при необходимости слезть с Alamofire переписать нужно будет только один класс (и его прямые зависимости). Любые другие части проекта никак не будут знать про Alamofire.
Планирую постепенно реализовать еще 2 варианта демо проекта:
- MVVM-C, RxSwift, все другие необходимые внешние зависимости.
- Вариант на SwiftUI+Combine.