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