代码之家  ›  专栏  ›  技术社区  ›  Arne Evertsson

Java包的ObjtoE-C等价物?

  •  15
  • Arne Evertsson  · 技术社区  · 17 年前

    Java包的Objto-C等价物是什么?你如何在目标C中分组和组织你的课程?

    6 回复  |  直到 12 年前
        1
  •  31
  •   Quinn Taylor    17 年前

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

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

    一个小的澄清(虽然它没有多少安慰)是Objto-C实际上有两个平坦的名字空间,一个用于类,一个用于协议(比如Java的接口)。这并不能解决任何类命名冲突,但它确实意味着可以有一个具有相同名称的协议和类(如 <NSObject> 和 NSObject )后者通常采用(“实施”)前者。这个特性可以防止Java中的“Foo/FoimIl”模式猖獗,但遗憾的是,它对类冲突没有帮助。

    问题2:如何[命名]和组织目标C课程?

    命名

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

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

    组织机构

    在磁盘上组织源文件是许多Cocoa开发人员不幸掩盖的事情。当您在Xcode中创建一个新文件时,默认位置是项目目录,就在您的项目文件旁边,等等。我个人将应用程序源放在 源/ ,中的测试代码(ocunit等) 试验/ ,中的所有资源(NIB/XIB文件、info.plist、图像等) 资源/ 等等。如果您正在开发一个复杂的项目,那么在基于功能的目录层次结构中对源代码进行分组也是一个很好的解决方案。在任何情况下,一个组织良好的项目目录都可以更容易地找到您需要的东西。

    Xcode真的不关心文件的位置。项目侧边栏中的组织完全独立于磁盘位置,它是一个逻辑(而非物理)分组。您可以在侧边栏中随意组织,而不影响磁盘位置,当源代码存储在版本控制中时,这很好。另一方面,如果您在磁盘上移动文件,那么修补xcode引用是手动的、繁琐的,但是可以做到。最简单的方法是从GET GO中创建组织,并在它们所属的目录中创建文件。

    我的意见

    虽然拥有一个包/名称空间机制可能会很好,但是不要屏住呼吸等待它发生。 阶级冲突在实践中很少见 当它们发生时,通常都是显而易见的。名称空间实际上是针对Objective-C中的一个非问题的解决方案(此外,添加名称空间可以避免对诸如前缀之类的解决方法的需要,但在方法调用等方面可能会带来更多的复杂性)。

    更微妙和更狡猾的虫子来自 方法冲突 当方法被添加和/或重写时,不仅是子类,而且是类别,这会导致严重的错误,因为类别的加载顺序是未定义的(不确定的)。实现类别是Objective-C最尖锐的边缘之一,只有在您知道自己在做什么的情况下,尤其是对于第三方代码,以及 尤其地 对于cocoa框架类。

        3
  •  3
  •   Community Mohan Dere    9 年前

    见 What is the best way to solve an Objective-C namespace collision? 为了讨论Objective-C如何没有名称空间,以及痛苦的黑客攻击,这是必要的。

        4
  •  1
  •   Durai Amuthan.H    13 年前

    不可原谅的目标C与Java、C++和Java包没有任何等价的命名空间。

    命名冲突可以通过给出上下文名称来解决,例如,如果要给方法命名,它应该暗示它所包含的类和模块,这样……就可以避免这些问题。

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

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

        5
  •  0
  •   Rakesh patanga onnoweb    12 年前

    像这样的东西(在目录里)怎么样?

     #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];
    
        6
  •  -1
  •   Qiulang    13 年前

    好吧,我认为这里的所有其他答案似乎都集中在命名冲突上,但至少错过了一个重要的特性, 包专用访问控制 Java包提供的。

    当我设计一个类时,我发现通常我只需要一些特定的类来调用它的方法,B/C它们一起工作来完成一个任务,但是我不希望所有其他不相关的类都调用这些方法。这就是Java包访问控制很方便的地方,因此我可以将相关的类分组到打包中,并使这些方法封装私有访问控制。但在目标C中没有办法做到这一点。

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

    更新:xcode 4.4引入了“一个objective-c类扩展头”,在我看来,这在某种程度上提供了“package private access control”,所以如果包含扩展头,可以调用我的“package private”方法;如果只包含我的public头,只能调用我的public api。