Разработка интерфейса iPhone в кончике или в коде? - PullRequest
15 голосов
/ 30 ноября 2009

Я некоторое время размышлял над этим вопросом ...

С одной стороны, Interface Builder предлагает действительно простой способ разработки интерфейса и связывания элементов с объектами в коде.

С другой стороны, в больших проектах Interface Builder становится проблематичным в обслуживании.

Любые предложения будут с благодарностью.

Ответы [ 4 ]

17 голосов
/ 30 ноября 2009

Когда-то я был категорически против использования Interface Builder в моих собственных проектах. Это было связано с рядом факторов. Я впервые начал работать с инструментами XCode, когда iPhone SDK вернулся в бета-версию (примерно в марте 2008 года), и, поскольку я не пришел из Mac Macoa, я был немного незнаком с его использованием. Это не было основным фактором в моем первоначальном отказе от IB для разработки iPhone, хотя - Интерфейсный Разработчик для разработки iPhone во время первой бета-версии iPhone SDK действительно отстой, и это было неудобно.

Однако с сегодняшним iPhone SDK история сильно отличается. Несмотря на то, что все еще есть некоторые раздражающие ошибки IB, я почти завершил 180˚ с моим отношением к использованию Interface Builder. Я обнаружил, что чаще всего полезно использовать Interface Builder в ваших проектах. Теперь это отличный инструмент, и вы должны воспользоваться им.

Теперь, не поймите меня неправильно - я все еще твердо в лагере, который считает, что вы должны быть в состоянии реализовать все, что вы делаете в Интерфейсном Разработчике, используя только код, и я думаю, что могу сделать так бесценно. Не используйте Interface Builder в качестве опоры - в итоге вы только навредите себе (и своей производительности, либо качеству своих продуктов). В то время как тонкости перетаскивания в IB отлично подходят для 90% того, что вам нужно сделать, когда у вас есть что-то нестандартное для реализации, которое можно сделать только в коде, вы либо пожелаете, чтобы вы следовали, либо будете благодарны за следование этому совету. Мне посчастливилось так долго ненавидеть IB, что я научился делать все в одном коде, а затем применил эти знания к IB.

Edit:
Чтобы решить проблему отсутствия возможности повторного использования (воспринимаемого или реального) с NIB по сравнению с кодом ... вы не будете реализовывать что-то, что должно быть многократно использовано в Interface Builder по всей вероятности. Вы не можете создать пользовательский элемент управления или представление в IB, так что это исключено, и в большинстве случаев вы собираетесь реализовывать подкласс контроллера представления, созданный для решения конкретной задачи. Конечно, вы всегда должны стремиться сделать ваш код и связанные ресурсы максимально пригодными для повторного использования. Это может включать соображения проектирования, чтобы избежать ненужного дублирования подклассов контроллера представления, которые очень похожи.

8 голосов
/ 30 ноября 2009

Использование компоновщиков освобождает вас от кода, который в противном случае вам нужно было бы обслуживать, и чем меньше вам нужно поддерживать, тем лучше.

Макеты, созданные IB, требуют некоторого обслуживания, но это стандартный инструмент с собственной документацией и собственной онлайн-поддержкой (форумы, списки и т. Д.). Если кому-то еще нужно перейти к вашему коду, вы можете практически гарантировать, что у него есть опыт работы с IB, но не обязательно ваш особый стиль построения макетов.

7 голосов
/ 30 ноября 2009

Это зависит от ваших предпочтений.

Я предпочитаю писать это в коде.

  1. Я могу повторно использовать код.
  2. Использование XIB / NIB обычно нарушает правило одного определения (если вы делаете какую-либо настройку).
  3. Обслуживание XIB / NIB часто более утомительно и подвержено ошибкам (ODR). Мне очень не нравится поддерживать стили кнопок (пример) для каждой кнопки.
  4. циклические ссылки более вероятны.
  5. Экземпляры кода / объектов / ib часто менее пригодны для повторного использования / модульные. Хотя я из тех, кто избегает объекта пользовательского интерфейса, который может делать все.
  6. Отложенный / неоднозначный порядок инициализации создает довольно пугающее состояние для клиентов, которые никогда не должны предполагать, что объект готов к использованию или полностью инициализирован (если вы не предпочитаете поддерживать эти проверки, что является хорошим способом тратить время).
  7. Если важна производительность, угадайте, что быстрее?
  8. Управление ресурсами против линкера ... серьезно, я написал подпрограммы и тесты для проверки существования перьев в комплекте.

IB отлично подходит для создания прототипов и просмотра возможностей и внешнего вида объектов (я не графический дизайнер), хотя I думаю, что проще всего написать его в коде, если прототип существует, если у вас есть намерение поддержания или повторного использования.

Моя рекомендация: писать многократно используемые и стабильные библиотеки кода и использовать IB в первую очередь для создания прототипов и одноразовых.


Ответы:

Sbrocket: Мне любопытно, почему вы утверждаете, что циклические ссылки более вероятны в результате использования NIB.

Привет Sbrocket: Начну с того, что я использую Interface Builder со времен Project Builder (предшественник Xcode).

Отсутствие надежного структурированного владения, идентификации и инициализации. Я не хочу, чтобы ivars были соединениями IB, потому что это затрудняет использование многих классов за пределами «текущего контекста». Другими словами, он связывает код с ресурсом (чаще, чем в идеале). Поскольку вы не можете определить порядок инициализации или определить инициализаторы или дополнительные аргументы инициализации в IB, вы должны сообщить объектам друг о друге, создавая циклические зависимости и ссылки.

Sbrocket: или почему ленивая инициализация (при условии, что это именно то, на что вы ссылаетесь) настолько страшна, когда ее относительно легко (или на самом деле во многих случаях автоматически) обеспечить инициализацию и подключение объекта.

Re: страшно Я не говорил о ленивой инициализации. Я говорил об отложенном и неоднозначном порядке инициализации.

Инициализация пера полуупорядочена. Фактический порядок / процесс может варьироваться, и это не может быть надежно использовано в многократно используемых интроспективных программах ... опять же, вы в конечном итоге написали бы слишком много кода, который хрупок, невозможен для повторного использования, никогда не может быть гарантированно вести себя предсказуемо и должен всегда проверять состояние (еще одна запись для круговой зависимости). Если это не разовая реализация, зачем беспокоиться об осложнениях?

Этот подход к программированию хаотичен, и реализации должны (в свою очередь) быть готовы обработать что-либо в любое время. Одно дело оградить себя от сбоев, но написать защитный код производственного уровня в этом контексте ... никак.

Гораздо проще написать непротиворечивую программу, инициализация которой определяет достоверность в контексте, и реализации могут знать (если она инициализирована), что объект обычно готов к использованию. Особый случай сложность сведена к минимуму. Многие такие проекты разваливаются по мере увеличения сложности программы, в то время как авторы библиотек добавляют слои к слоям «защитных мер» просто для того, чтобы поддерживать движение шестерен - многопоточность - отличный вход для таких гейзенгов. Ненужные двусмысленности нежелательны в повторно используемом коде уровня производства; людям не нужно перекрестно ссылаться на все особые случаи программы, а сложности, связанные с определенным поведением и особыми случаями, только распространяются или игнорируются (при условии, что они должным образом отслеживаются и документируются, что является более сложным делом, чем правильная запись с самого начала ). Я думаю, что мы все можем согласиться с тем, что следует избегать обременительных интерфейсов и реализаций.

Sbrocket: Мне также было бы интересно увидеть некоторые точные цифры, которые показывают, что загрузка NIB медленнее - конечно, на первый взгляд это может иметь смысл, но мы всегда такие плохие предикторы узких мест производительности без некоторых жесткое тестирование.

Я никогда не говорил (явно), что это было медленнее :) 1060 *

Ладно, если серьезно, разархивирование NIB было (для меня) удивительно медленным процессом, хотя наши представления о медленном и разархивирующем времени могут сильно различаться.

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

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

Помните, что анализ производительности и улучшения изучены .

2 голосов
/ 11 апреля 2010

Интерфейсный конструктор отлично подходит для определенного уровня сложности. Для вещей более или менее сложных, я бы предпочел сделать это в коде.

Если у вас есть интерфейс, который не будет использоваться более чем одним способом, имеет несколько, но не много элементов, и не требует хитрой компоновки, то IB - это замечательно.

В долгосрочной перспективе я почти никогда не использую IB. В этом суть как проектов, над которыми я работаю, так и личных предпочтений. Определенно, есть некоторые интерфейсы, к которым я бы сразу обратился в IB, но мне не нужно было создавать один из них через некоторое время.

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