Противникам интерфейс билдера посвящается


#1

На просторах интернета я наткнулся на такой месседж:

Для кого-то это может показаться очевидным, а кто-то и вовсе об этом не задумывался :slight_smile:

iOS разработчики делятся на три лагеря:

  • Верстают интерфейс вручную
  • Используют только xib
  • Используют storyboard/xib/код в зависимости от ситуации (я за последних)

Первые считают что интерфейс собранный вручную (кодом) работает быстрее.

Тут самое время задался вопросом что такое xib?
Xib - это xml разметка которая при сборке проекта компилируется в nib, всё просто:

Nib в свою очередь не что иное, как архив классов (NSKeyedArchiver), в итоге мы получаем всё те же классы как если бы писали их вручную, только заархивированные. И разархивированные и написанные вручную классы работают одинаково быстро :slight_smile: и ничем друг от друга не отличаются. Тормозить это может при разархивации (загрузки классов в память), но если xib будут небольшие это несущественно, по сравнению с ручной версткой.

Разработчики из второго лагеря предположительно знают об этом и активно пользуются xib (ранее nib в чистом виде до Interface Builder 3) но уверены что storyboard это жутко тормозная штука.

Тут самое время задался вопросом что такое storyboard?
Storyboard - это та же xml разметка которая компилируется в пакет storyboardc внутри которого несколько nib, например UITableViewController компилируется в два nib:

И каждый последующий контроллер в storyboardc это несколько nib файлов. Несколько их по причине что при разархивации nib, в память грузится сразу всё что в нём есть (никакого lazy loading). Например два контроллера в xib будет загружены сразу, два контроллера в storyboard по мере необходимости. Storyboard как дальнейшее развитие xib просто физически не может быть более тормозным, при работе только с xib как раз приходится задумываться что и когда грузить и сколько xib’ов надо, в то время как storyboard делает это за вас.

Что же тогда тормозит, откуда берутся мифы?

Допустим вы начинающий разработчик, отрываете интерфейс билдер, создаёте UITableViewController и делаете такое (86 констрейнтов):

Естественно при скролле у вас это будет тормозить, почитав интернет (индусов на stackoverflow) вы приходите к выводу что такое нужно писать вручную, само собой и все фреймы вы рассчитываете вручную (без autolayout) и да оно перестаёт тормозить, как раз за счёт этих фреймов и того что вы их рассчитали один раз при загрузку UITableViewCell!
И вы такой, да storyboard (интерфейс билдер) это сплошные тормоза, буду я всё ручками лучше писать :slight_smile:

P.S. Наболело! После таких дятлов разбираться в тоннах их быдлокода сплошная боль, так они еще и в интернетах свою тупость пропагандируют (надеюсь никого не обидел).

P.P.S. За интерфейс написанный руками платят столько же что и собранный в интерфейс билдере!

P.P.P.S. В интерфейс билдере наглядна видна архитектура вашего приложения (что куда переходит и что где открывается/вызывается и какие классы в этом участвуют), в таком проекте гораздо проще разобраться!


#2

Работал с одним датчанином, так он пропагандировал мне писать UI кодом, мотивируя тем, что это дает большую гибкость. Никакие доводы не помогли его разубедить =/


#3

Меня тоже убеждали писать только кодом, и даже на одном проекте весь UI был написан! ох и беда была когда решили немного поменять дизайн))))


#4

Где в исходном посте автор нашёл упоминание быстродействия, для меня загадка.

IB негоден по совершенно другим причинам:

  1. Он порождает дублирование кода (в данном случае ХМL), поскольку в нём отсутствует даже такая простая концепция, как именованная константа, не говоря уже о возможностях, которые даёт ООП.

  2. При работе с системой контроля версий приходится разбираться в плохо читаемом автоматически сгенерированном XML. Удачи с устранением конфликтов при слиянии веток.

Ещё раз рекомендую Макконнелла, чтобы не продолжать делать быдло XML код в Interface Builder.


#5

А датчанин то Макконнелла, похоже, читал.


#6

Код на Swift тоже может быть говнокодом. Проблема в том, что код в IB может быть только говнокодом.


#7

Про слияние веток согласен на 200%, это конечно беда!
Но целиком поддерживаю автора в том, что это

лучший из возможных вариантов!


#8

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#9

Я в начале конечно делал все в storyboard. И очень мучался в этими constarints. XCode-у то нравится, то не нравится, то еще что-то не так. Но теперь поняв autolayout и научившийся писать в коде, я все делаю в коде. Раньше очень много времени тратил тыкая мышкой в кучу мест чтобы что-то изменить. а теперь когда все пишу в коде то это очень легко сделать изменив пару строк. И сейчас даже не хочу возвращаться к storyboard.

Научился делать constraints через:

  1. VFL
  2. Anchor
    и нет проблем

#10

Именно так и получилось в моём случае. Сначала я осознал, что нет смысла настраивать внешний вид, например, кнопки в IB, чтобы получить её в единственном экземпляре, с невозможностью повторного использования.

Решение: делаем кастомный класс кнопки, настраиваем в коде, рендерим с помощью @IBDesignable в IB.

Ну а потом я начал весь экран рендерить в IB-шный View Controller.
В результате остался и лишь улучшился, наверное, единственный плюс IB - наглядность.


#11

Ну во первых это очень круто что вы даже зарегестрировались что бы мне ответить :slight_smile:

Я никого конкретно не имел в виду и уж тем более вас.

Ну я как раз про эту причину и о ней очень часто упоминают все кому не лень, например здесь.

Вы руками этот xml редактируете?

Соглашусь, но никто не мешает сделать несколько сторибордов что частично помогает.

У вас всего две причины писать а полтора два раза больше кода?


#12

Это целиком и полностью зависит от человека который его использует.

Нет, я привык использовать инструменты по их назначению наиболее эффективно.


#13

Судя по форуму у вас тонны проблем, а то что вы всё руками пишите только усугубляет ситуацию. Конечно не берусь ничего утверждать, но уверен процентов на 90.


#14

[quote=“haymob, post:13, topic:4062”]
а то что вы всё руками пишите только усугубляет ситуацию
[/quote]смысл им что то писать если у них даже со слиянием сторибордов проблемы :grinning:

практика показывает, что нет смысла им что то писать. надо просто взять проект, который они делали кодом 90 дней, и сделать его за 9 дней в перемешку кодом и IB.


#15

Ага… наверное поэтому анимирует изменение состояния кастомного текстфилда во вьюконтроллере.

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

Ну и в завершение спича - самая эффективная разработка - это миксовать как сториборды, ксибы, так и код.


#16

Вы ответили на мой месседж, извлекли из него то, чего я в него не вкладывал, и развенчали. Я счёл интересным продолжить диалог и даже зарегистрировался для этого. Или вам по душе лишь монолог?

Редактировал руками через IB. Есть другие варианты?[quote=“haymob, post:11, topic:4062”]
У вас всего две причины писать а полтора два раза больше кода?
[/quote]

Кода наоборот получается меньше (ХML - тоже код), а вносить изменения в него легко и приятно.
А IB - это copy-paste программирование со всеми вытекающими.

Это полностью зависит от людей, которые его разрабатывают.

И на изменения в графическом дизайне потом каждый раз тратить по 9 дней. Вместо того, чтобы изменить несколько строк.

И очень медленное внесение изменений, вместе с отладкой всего этого.

С помощью кода может получиться даже большая наглядность (@IBDesignable).


#19

прям ЖАРА здесь) (Сообщение не должно быть короче)


#20

Холиварная тема же.



#21

[quote=“Roman.Kerimov, post:18, topic:4062”]
И на изменения в графическом дизайне потом каждый раз тратить по 9 дней. Вместо того, чтобы изменить несколько строк.
[/quote]плохой разработчик будет одинаково плохо использовать и код, и ib.
если он не предусмотрел возможность изменения дизайна в ib, почему он это будет делать при использовании только кода?

ему скажут, что ib - плохо. он точно так же накопипастит в код лейблов и каждый вьюконтроллер будет по 1000 строк


#22

Есть, как xml файл.

Вы сравниваете сгенерированный xml с кодом написанным вручную, что как-то некорректно.

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

Любой вью можно вынести в отдельный xib и будет достаточно поправить его в одном месте!