Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Что это за подход такой — давай выкинем все что дает нам Apple и сделаем как у крутых дядек в других конторах.
у UIViewController есть куча методов базовых для навигации и лайуота
Если вы загоните все констрейнты в код — то как потом через кучу лет разработчикам найти нужный констрейнт и элемент?
Apple предоставляет хороший подход для разработки своих приложений как для программистов так и для дизайнеров интерфейсов
Почему никто не читает эти гайды и документацию?
Но почему тогда приложение фейсбука весит более 130МБ для десятка экранов. Видимо «хорошие спецы» его клепают.
К тому же я считаю, что размер приложения — далеко не показатель качества написания кода.
Я думаю, что очень многое продиктовано требованиями продукта. Думаю только одни кастомные эмоджи на экране лайков — 20-30 классов.
Поставьте себя на место пользователя. Почему я должен скачивать очередное приложение более 100МБ и тратить свой трафик? При этом в приложении невозможно найти нужного функционала под кучей ненужного хлама.
Если вы делаете приложение для пользователей, а не для менеджеров:
— размер приложения должен быть минимален насколько это возможно (вы должны уважать трафик и время пользователя потраченые на ваше приложение)
— открытость приложения (убрать все ненужные элементы и сделать явным самый необходимый функционал)
Если работаете за зарплату и на удобства пользователей вам плевать — то смысл было писать эту статью?
Только пользователь будет оценивать вашу работу, не менеджеры и не другие программисты.
Сравните с приложениями из других социальных сетей.
Вы откройте приложение Facebook и посмотрите сколько реально экранов вы там можете найти, в коде может присутствовать скрытый функционал.
Весь мусор такой как анимации, layout, композиции view, изменение отрисовокнужно вынести из контроллера, вы имеете в виду вынести в UIView? Или может быть сделать из UIViewController view а для контроллера создать отдельный класс?
Или может быть сделать из UIViewController view а для контроллера создать отдельный класс?
UIViewController — это такой же объект как и все остальные, и что у него должна быть только одна ответственность — связывать model и view.
управлять циклом жизни своего view
взаимодействовать с другими view controller'ами.
Добавлять в него ответственность связывания model с view считаю в корне не правильным (несмотря на то, что пишет Apple в гайдлайнах).
Потому эту ответственность нужно выносить в отдельный класс — presenter (или controller). В случае с MVVM эта ответственность лежит на data binding механизме.
Делить один экран на множество view controller'ов в большенстве случаев избыточно, так как нам не всегда нужна ленивая подгрузка view и прочие фичи UIViewController. Потому можно обойтись обычными сабвью со своими presenter/contoller'ами.
Этот механизм, на мой взгляд, и создан для обновления UIView в зависимости от состояния model при помощи controller'а и обратно.
Было бы интересно услышать аргументацию в поддержку этого мнения.
Разделение на childViewController делается не ради подгрузки, а ради гибкости, которую дает композиция.
Но принцип единой ответственности говорит о другом
Кроме того в интерфейсе UIViewController нет ни намека на наличие у него модели
Аргументация — SRP.
Более того, один экран может иметь несколько слабо связанных элементов, каждый такой элемент должен контролироваться отдельным контроллером (презентером)
Если нам не нужно реагировать на события жизненного цикла вью (viewWillAppear: и т.п.) или взаимодействия с другими вью конироллерами (willMoveToParentViewController: и т.п.), то можно обойтись набором UIView.
каждый такой элемент должен контролироваться отдельным контроллером (презентером). Это и есть путь избавления от massive view controller.
Например UITextView — наследник UIView, а не UIViewController, хотя логики там будь здоров.
Хорошо, и что за responsibility?
Т.е. вы сами себе немного противоречите? Вы говорите, что разбиение на слабо связанные элементы управляемые контроллерами и в то же время говорите, что разбиение на контроллеры избыточно и можно обходиться только UIView.
И во многих случаях, я считаю, имеет смысл создавать контроллер, который будет управлять логикой UITextView, для того чтобы не выносить эту логику в общие контроллеры.
Вы очень невнимательно читаете мои комментарии, похоже.
В 3-й раз: управлять циклом жизни своего view и взаимодействовать с другими view controller'ами, управлять дочерними вью контроллерами — показывать и прятать
Нет, не противоречу. Я разделяю наследников UIViewController и контроллеры/презентеры MVC/MVP.
Но контроллер вовсе не обязательно должен наследоваться от UIViewController
Хорошо, далее вопрос, что входит в таком случае в управление циклом жизни своего view?
Показывать и прятать дочерние VC — хорошо, основываясь на чем? На изменении состояния модели?
Теперь вы поняли, что я имел ввиду?
Козел отпущения или MVC в iOS