Вопрос 1: Objective-C эквивалент Java-пакетов?
Objective-C не имеет эквивалента для пакетов Java или пространств имен C ++. Частично причиной этого является то, что Objective-C изначально был очень тонким слоем времени выполнения поверх C, и добавлял объекты в C с минимальной суетой. К сожалению для нас сейчас, конфликты имен - это то, с чем нам приходится сталкиваться при использовании Objective-C. Вы выиграли, вы проиграли ...
Одно небольшое пояснение (хотя это не так уж много для утешения) заключается в том, что Objective-C на самом деле имеет два плоских пространства имен - одно для классов и одно для протоколов (например, интерфейсы Java). Это не решает никаких конфликтов имен классов, но это означает, что вы можете иметь протокол и класс с одинаковым именем (например, и NSObject ), где последний обычно принимает («реализует») бывшее. Эта функция может предотвратить распространение шаблона «Foo / FooImpl» в Java, но, к сожалению, не помогает при конфликтах классов.
Вопрос 2: Как [назвать] и организовать классы Objective-C?
Нейминг
Следующие правила являются субъективными, но они являются достойным руководством для именования классов Objective-C.
- Если ваш код не может быть запущен другим кодом (это не платформа, плагин и т. Д., А приложение или инструмент конечного пользователя), вам нужно только избегать конфликтов с кодом, на который вы ссылаетесь. Часто это означает, что вы можете обойтись без префикса, если только используемые вами фреймворки / плагины / комплекты имеют правильные пространства имен.
- Если вы разрабатываете «компонентный» код (например, фреймворк, плагин и т. Д.), Вы должны выбрать префикс (надеюсь, тот, который уникален) и задокументировать его использование где-нибудь видимым, чтобы другие знали, чтобы избежать потенциальных конфликтов. Например, CocoaDev wiki "registry" является де-факто публичным форумом для вызова "dibs" для префикса. Однако, если ваш код является чем-то вроде внутренней структуры компании, вы можете использовать префикс, который уже используется кем-то другим, если вы ничего не используете с этим префиксом.
Организация
К сожалению, многие разработчики Cocoa упорядочивают исходные файлы на диске. Когда вы создаете новый файл в XCode, местоположением по умолчанию является каталог проекта, рядом с файлом вашего проекта и т. Д. Лично я помещаю исходный код приложения в source / , тестовый код (OCUnit и т. Д.) В test / , все ресурсы (файлы NIB / XIB, Info.plist, изображения и т. Д.) В resources / и т. Д. Если вы разрабатываете сложный проект, группировка исходного кода в иерархии каталогов на основе функциональности также может быть хорошим решением. В любом случае, хорошо организованный каталог проектов облегчает поиск того, что вам нужно.
Xcode действительно не волнует, где находятся ваши файлы. Организация на боковой панели проекта полностью независима от расположения диска - это логическая (а не физическая) группировка. Вы можете организовать все, что вам нравится, на боковой панели, не затрагивая расположение диска, что хорошо, когда ваш источник хранится в системе управления версиями. С другой стороны, если вы перемещаете файлы на диск, исправление ссылок на Xcode является ручным и утомительным, но может быть выполнено. Проще всего создать свою организацию с самого начала и создавать файлы в каталоге, к которому они принадлежат.
Мое мнение
Хотя было бы неплохо иметь механизм пакета / пространства имен, не ждите, чтобы это произошло. Классовые конфликты на практике встречаются довольно редко , и обычно они кажутся очевидными, когда они случаются. Пространства имен - это действительно решение проблемы в Objective-C. (Кроме того, добавление пространств имен устранит необходимость в обходных решениях, таких как префиксы, но может значительно усложнить вызов методов и т. Д.)
Более тонкие и коварные ошибки возникают из конфликтов методов , когда методы добавляются и / или переопределяются не только подклассами, но и категориями, что может привести к неприятным ошибкам, поскольку порядок загрузки категорий неопределенный (недетерминированный). Реализация категорий - один из самых острых аспектов Objective-C, и его следует использовать только в том случае, если вы знаете, что делаете, особенно для стороннего кода, и , особенно для классов инфраструктуры Какао.