Правильно ли иметь ViewControllers с большим количеством кода? - PullRequest
18 голосов
/ 09 декабря 2011

Я все еще новичок в Какао и Objective-C (<1 год). Мое приложение теперь имеет более 50 классов, но некоторые из ViewControllers переполнены кодом, например, 700 строк или более. </p>

Мой вопрос: хорошо ли иметь «большой» ViewController или есть шаблоны для разбиения кода на фракции? Большая часть кода реализует методы делегата, поэтому у меня нет идеи, как его убрать.

Я знаю, что могу структурироваться с помощью прагматических отметок.

Спасибо за любой вклад.

РЕДАКТИРОВАТЬ (декабрь 2013 г.): есть замечательная статья Криса Эйдхофа из objc.io по этому вопросу. Он также говорил об этом на Macoun 2013 / Франкфурт. Разделение протоколов UITableView - отличный пример.

РЕДАКТИРОВАТЬ2 В NSScreencast также есть 2 видео, объясняющих принципы рефакторинга ViewController (эпизоды # 102 и # 103).

Ответы [ 5 ]

6 голосов
/ 09 декабря 2011

Одной из наиболее распространенных причин появления контроллеров больших представлений является отсутствие разделения ч / б моделей и контроллеров в архитектуре MVC.Другими словами, обрабатываете ли вы свои данные в ваших контроллерах представления?

Если да, вырвите компонент модели из VC и поместите его в отдельный класс.Это также заставит вас задуматься о лучшем дизайне.

Для справки, в View Controller:

  • Обработка всех изменений в UIView и элементах пользовательского интерфейса, содержащихся в.
  • Все анимации, переходы и операции CALayer.

В модели:

  • Вся обработка данных, включая сортировку, преобразование, хранение и т. Д.
4 голосов
/ 09 декабря 2011

ИМХО, 700 строк (пока) не огромны для кода iOS, я видел и обрабатывал намного хуже.Конечно, если все ваши VC такие большие, у вас есть проблема.

Вы обязательно должны использовать и злоупотреблять #pragma mark, это очень полезно, по крайней мере, под Xcode.

Тогда, если вы обнаружите, что у вас слишком много кода в одном файле, вы можете извлекать функциональность для классов или категорий по мере необходимости.

Создание классов может быть очень полезным в долгосрочной перспективе для управленияповторяющиеся задачи в проектах (например, подключение к веб-сервису, анализ XML / JSON, взаимодействие с SQLlite, ведение журналов и т. д.).Если вы занимаетесь регулярным программированием на iOS, вы можете создать «общую» библиотеку полезного кода следующим образом.

Создание категорий, особенно на UIViewController, может помочь уменьшить шаблон кода, который занимаетмного места.Вы можете (и, вероятно, должны) также создать общую базу UIViewController для своего приложения, которая будет обрабатывать такие вещи, как вращение, может быть журналирование, навигация и т. Д. В централизованной части кода.

3 голосов
/ 09 декабря 2011

Вы должны попытаться определить, что на самом деле делает ваш ViewController.

Если вы можете разделить некоторые проблемы, вы можете переместить их в собственные классы.Узнайте, какие свойства и ivars используются методами viewControllers.Если вы можете найти подмножество функций, которые используют общее подмножество ivars / properties, они вместе, скорее всего, станут собственным классом.Контроллер тогда будет владеть таким новым классом и делегировать работу этому.

Если ваш ViewController управляет каким-либо состоянием, например.вы найдете один и тот же оператор switch или if-chain в двух или более методах, которые шаблон STATE может сделать ваш VC намного более читабельным.Но в основном вы можете использовать любой шаблон, который помогает уменьшить обязанности VC.

ИМХО ViewController - это то место, где вы бы подключали модель к представлениям.Распространение изменений модели в представления и обработка взаимодействия пользователя с представлениями - единственное, что должно произойти там.Все другие обязанности, такие как расчет, передача по сети, анализ, проверка ... должны выполняться в разных классах, которые использует VC.

Вам может понравиться книга «Чистый код» Роберта С. Мартина.Он глубоко исследует, как можно структурировать код, чтобы повысить его читабельность и возможность повторного использования.

2 голосов
/ 09 декабря 2011

Вы можете распространять код, используя категории в зависимости от функциональности.См. http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Category.html

0 голосов
/ 09 декабря 2011

Предпочитают использовать класс NSObject для управления частью функций вашего контроллера представления. Основные причины кода более понятны и проще для отладки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...