Skip to content

Instantly share code, notes, and snippets.

@st-small
Last active March 19, 2021 16:16
Show Gist options
  • Save st-small/402f44ff750328321b6da4386b9351eb to your computer and use it in GitHub Desktop.
Save st-small/402f44ff750328321b6da4386b9351eb to your computer and use it in GitHub Desktop.
/*******************************************************************
Исторически, как, наверное, и многие новички, приходящие в мир iOS (и не только), основным моим приоритетом
было выстраивание архитектуры партерном MVC. С появлением разного рода проектов и поиска решения разных задач,
приходилось искать более гибкие и развернутые решения. Таким образом были рассмотрены варианты:
MVC + Coordinator - подход разгружает часть логики «С» (контроллера), но, в целом, не упрощает пути реализации и не
добавляет читаемости коду. Сверх нагруженность модуля остается. Дополнительные ресурсы на построение класса координатора,
в большинстве случаев, не приносят ожидаемой выгоды.
MVP - данный подход так же, как и MVC, ограничен минимальным набором классов для реализации одного модуля, по сути,
вынесение расчетов представления из класса «V» вью, в класс «P» презента, который отлично справляется с задачами расчетов
верстки, но совершенно не участвует в жизненном цикле, что может доставлять дополнительные неудобства.
VIPER - считаю данный подход распаренной версией чистой архитектуры со смещенными приоритетами реализации.
Холиварная тема, которая была опробована всего в одном проекте и заброшена в качестве «неудачной продажи» маркетингового
продукта со стороны одной известной компании.
Clean Swift (YARCH) - подход, который на определенное время стал для меня самым-самым родным, любимым, понятным и практичным.
С радостью пользовался им на больших проектах, пока не появились краткосрочные проекты, на которых данная реализация
являлась избыточной.
MVVM - в данный момент использую этот подход в регулярном порядке. Привлекает простота, скорость разработки модуля,
ограничение каждого элемента конкретно его задачами и инкапсуляцией внутренней логики. Идеально орабатывает на кратко- и
среднесрочных проектах. Понятна как начинающим, так и разработчикам с опытом. Хорошо справляется при работе с сервисами,
жизненным циклом приложения, обменом данными между модулями, покрытия тестами. MVVM я предпочитаю использовать в связке
с классом Assembly и xib файлом, генерируя модуль шаблоном (благо Xcode такое позволяет делать). Пример модуля «Main»
c паттерном MVVM представлен ниже.
Assembly - Элемент, который отвечает за создание модуля, подготовку модели, подготовку вью, связывание их, имеет
публичное свойство 'view', которое отдается вызывающему модулю, для правильной подготовки и показу модуля.
*******************************************************************
*******************************************************************/
public final class MainAssembly {
private var viewController: MainViewController?
public var view: MainViewController {
guard let view = viewController else {
viewController = MainViewController()
configureModule(viewController)
return viewController!
}
return view
}
private func configureModule(_ view: MainViewController?) {
guard let view = view else { return }
view.viewModel = MainViewModel()
}
}
/*******************************************************************
Model (ViewModel) - Может включать в себя логику интерактора, презентера, вью модели и пр. (если таковые
не представлены в проекте или выбран сокращенный архитектурный подход). Основной задачей вью модели является
подготовка данных, работа с ними, передача данных о вью.
*******************************************************************
*******************************************************************/
public final class MainViewModel {
// MARK: - Data
public init() {
}
}
/*******************************************************************
View (ViewController) - Является классическим элементом отображения данных и работе с действиями пользователя.
Имея связь с моделью, динамически реагирует на изменения модели, обновляя свое состояние, обращается к модели если
контекст (действия пользователя) требует обновления (изменения) данных.
*******************************************************************
*******************************************************************/
public final class MainViewController: UIViewController {
// MARK: - Outlets
// MARK: - Data
public var viewModel: MainViewModel!
public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Actions
}
// MARK: -
extension MainViewController {
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment