Last active
March 19, 2021 16:16
-
-
Save st-small/402f44ff750328321b6da4386b9351eb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******************************************************************* | |
Исторически, как, наверное, и многие новички, приходящие в мир 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