Objective-C相当于Java包?

时间:2009-06-16 10:35:32

标签: objective-c

Java包的Objective-C等价物是什么?如何在Objective-C中对课程进行分组和组织?

6 个答案:

答案 0 :(得分:31)

问题1:Java-C的Objective-C等价物?

Objective-C没有Java包或C ++命名空间的等价物。部分原因是Objective-C最初是在C之上的非常薄的运行时层,并且以最小的麻烦添加对象到C。对我们来说不幸的是,在使用Objective-C时我们必须处理命名冲突。你赢了一些,你输了一些......

一个小小的澄清(尽管安慰并不多)是Objective-C实际上有两个平面命名空间 - 一个用于类,一个用于协议(如Java的接口)。这并不能解决任何类命名冲突,但它确实意味着您可以拥有一个具有相同名称的协议和类(如<NSObject>NSObject),后者通常采用(“实现”)前任的。此功能可以防止Java中的“Foo / FooImpl”模式泛滥,但遗憾的是无法解决类冲突。

问题2:如何[命名]和组织Objective-C类?

<强>命名

以下规则是主观的,但它们是命名Objective-C类的合适指南。

  1. 如果您的代码不能由其他代码运行(它不是框架,插件等,而是最终用户应用程序或工具),您只需要避免与链接的代码发生冲突。通常,这意味着你可以完全没有前缀,只要你使用的框架/插件/包具有适当的命名空间。
  2. 如果您正在开发“组件化”代码(如框架,插件等),您应该选择一个前缀(希望是一个独特的前缀),并在可见的位置记录您对它的使用,以便其他人知道以避免潜在的冲突。例如,CocoaDev wiki "registry"是一个事实上的公共论坛,用于在前缀上调用“dibs”。但是,如果您的代码类似于公司内部框架,那么您可以使用其他人已经执行的前缀,只要您没有使用具有该前缀的任何内容。
  3. <强>组织

    在磁盘上组织源文件是许多Cocoa开发人员不幸忽视的问题。在Xcode中创建新文件时,默认位置是项目目录,位于项目文件旁边,等等。我个人将应用程序源放在 source / ,测试代码(OCUnit等)中在 test / 中,资源/ 中的所有资源(NIB / XIB文件,Info.plist,图像等),依此类推。如果您正在开发一个复杂的项目,那么基于功能对目录层次结构中的源代码进行分组也是一个很好的解决方案。无论如何,组织良好的项目目录可以更容易地找到您需要的内容。

    Xcode实际上并不关心文件的位置。项目侧栏中的组织完全独立于磁盘位置 - 它是一个逻辑(非物理)分组。您可以在侧边栏中组织您喜欢的而不影响磁盘位置,这在您的源存储在版本控制中时很好。另一方面,如果你在磁盘上移动文件,修补Xcode引用是手动和乏味的,但可以完成。最简单的方法是从一开始就创建组织,并在它们所属的目录中创建文件。

    我的意见

    尽管拥有一个包/命名空间机制可能会很好,但请不要屏住呼吸。 课堂冲突在实践中非常罕见,并且在发生时通常会非常明显。命名空间实际上是Objective-C中非问题的解决方案。 (此外,添加名称空间可以避免对前缀等变通方法的需求,但可能会在方法调用等方面引入更多的复杂性。)

    当添加和/或覆盖方法时,更强烈和狡猾的错误来自方法冲突,不仅是子类,还有类别,这可能会导致令人讨厌的错误,因为加载顺序是类别未定义(不确定)。实现类别是Objective-C最尖锐的边缘之一,只有在你知道自己在做什么时才会尝试,尤其是对于第三方代码,以及尤其是对于Cocoa框架类。

答案 1 :(得分:4)

答案 2 :(得分:3)

有关Objective-C如何没有命名空间的讨论,请参阅 What is the best way to solve an Objective-C namespace collision? ,以及需要这些痛苦的黑客攻击。

答案 3 :(得分:1)

不幸的是,目标c没有任何等同于C#,c ++和java包的命名空间....

命名冲突可以通过给出上下文名称来解决,例如,如果你要为方法命名它应该暗示它所引入的类和模块,以便......可以避免这些问题。

通过以下网址了解有关苹果建议的命名约定的更多信息

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/Conventions/Conventions.html

答案 4 :(得分:0)

这样的事情(在目录中)?

 #define PruebaPaquete ar_com_oxenstudio_paq1_PruebaPaquete
@interface ar_com_oxenstudio_paq1_PruebaPaquete : NSObject {

并像这样导入:

 #import "ar/com/oxenstudio/paq1/PruebaPaquete.h"
 PruebaPaquete *p = [[PruebaPaquete alloc] init];

当你有名字冲突时:

 #import "ar/com/oxenstudio/paq1/PruebaPaquete.h"
 #import "ar/com/oxenstudio/paq2/PruebaPaquete.h"


ar_com_oxenstudio_paq1_PruebaPaquete *p = [[ar_com_oxenstudio_paq1_PruebaPaquete alloc] init];
ar_com_oxenstudio_paq2_PruebaPaquete *p2 = [[ar_com_oxenstudio_paq2_PruebaPaquete alloc] init];

答案 5 :(得分:-1)

嗯,我认为这里的所有其他答案似乎都集中在命名冲突上,但至少错过了java包提供的一个重要功能包私有访问控制

当我设计一个类时,我发现很多时候我只想要一些特定的类来调用它的方法,b / c它们一起工作来完成一个任务,但我不希望所有其他的不相关的类来调用这些方法。这就是java包访问控制派上用场的地方,所以我可以将相关的类组合成一个打包并使这些方法包成为私有访问控制。但是在目标c中没有办法做到这一点。

如果没有软件包私有访问控制,我发现很难避免人们编写这样的代码[[[[[a m1] m2] m3] m4] m5] or [a.b.c.d m1]

更新:Xcode 4.4引入了“一个Objective-C类扩展头”,在我看来,这是以某种方式提供“包私有访问控制”,所以如果你包含扩展头,你可以调用我的“包私人“方法;如果您只包含我的公共标题,则只能调用我的公共API。