Objective-C类命名约定与Uncle Bob

时间:2012-03-06 13:06:39

标签: objective-c coding-style

Chapter 2: Meaningful Names叔叔鲍勃写道:

  

不要添加免费上下文

     

在一个名为“加油站豪华版”的假想应用程序中,使用GDS为每个班级添加前缀是个坏主意。坦率地说,你正在反对你的工具。您键入G和新闻完成键,并获得系统中每个班级的一英里长的列表

实际上,这是我在一年多前使用Objective-C的第一天发现的。在Java之后它非常令人失望,但我认为我只是一个对此感到恼火的人:) 据我所知,“清洁代码”一书大部分时间都指Java,而Java与Objective-C不同,它具有命名空间(包)。

如果您正在构建应用程序而不是库,那么您是否在课程中使用2-3个字母前缀? 你觉得怎么样,语言设计不好,语言“功能”或鲍勃叔叔不在这里?

6 个答案:

答案 0 :(得分:13)

这里的关键词可能是 gratuitous 。在Objective-C中,前缀有助于减少名称冲突的可能性。在Java和C ++等其他语言中,对命名空间的支持的存在使得前缀无偿使用(并且违反了经常引用的DRY原则)。但是,在Objective-C中,前缀是有意义的,有用的,无偿。

答案 1 :(得分:3)

我很想解决这个问题,但我认为我之前没见过类似的问题,这是一个有效的问题。以下是我对此事的相当混乱的想法。

许多语言都有一个名为 namespaces 的功能,其中“完全限定”的类名称以一系列分层名称作为前缀。例如,Java中的String类正确地java.lang.String,并且自定义类正确com.whatever.foobar.MyClass

不幸的是,名称空间从未被添加到Objective-C,这意味着即使使用Objective-C ++(即使使用Objective-C ++),Objective-C符号(类名,协议名和一些其他类型)也不能放在命名空间中。具有函数,常量,结构等的命名空间功能。)

然后,防止共享代码中符号冲突的唯一解决方案是使用某种形式的名称修改来使您的符号名称唯一。在Objective-C中,惯例是为所有类使用两个字符的前缀(有时数字会有所不同)。

这位叔叔Bob的老兄告诉你不要这样做,因为虽然你最终会得到一个无法编译的程序,但你将失去前缀仍然提供的命名空间的任何好处。您的应用是否使用插件?你需要加前缀。您的应用是否有公共API?你需要加前缀。

理论上,单个应用程序中永远不会触及外部世界的代码可以不带前缀,但可以将其搞定 - 保持编码干净,并在此处添加前缀。它会在以后拯救你。

答案 2 :(得分:0)

就个人而言,我几乎从不使用前缀。唯一的例外是以某种方式彼此连接的类或它们都应该存在。

一个例子:

一些客户端应用聊天。我们称该聊天为ExampleChat

然后我会使用ECMessageECUserECRoom等来轻松查看应该有哪些课程。

或者,如果我为UITableView制作一些自定义单元格,我会使用前缀来保持它们彼此接近,并且不会在“长英里列表”中搜索它们。例如:

ECTextMessageCellECSoundMessageCellECUploadMessageCellECJoinOrLeaveMessageCell等。

这是我的个人意见,这不是最好的。但对我来说这仍然是最简单的。

希望有所帮助

答案 3 :(得分:0)

如果您没有命名空间,可能会发生名称冲突。您可以在很多C库中看到他们正在使用某种前缀。所以我想有充分的理由让这些前缀和其他原因不使用它。但是修改完成要么忽略输入三个字母而不是一个字母的前缀应该是什么大问题。

所以最后在我看来这是一个品味问题。我想拥有带有前缀的好结构类而不是没有前缀的类乱码会更重要....

它与糟糕的语言设计恕我直言。曾经有一段时间软件无处不在,为什么要浪费额外的命名空间?即便如今我们仍然可以看到没有名称空间的语言......

答案 4 :(得分:0)

我想说,世界不是黑人或白人。我在java中编程,使用包,是的,在每个类中都有一个前缀很烦人,以及启动与I的接口很烦人且有争议(就像.Net曾经这样做)。

有时候它在目标c中让我感到烦恼但是如果你没有用你的语言包装它会有一些合法性,因为你可以“建立”像'NS','UI','MK'和在objc和cocoa中等等。

答案 5 :(得分:0)

除了避免碰撞之外,命名前缀的好处之一是您可以立即意识到您正在处理的类型。假设您有以下代码:

Color c = ...;
MultiValueMap m = ...;

粗略地看一下代码,并根据您使用的库,这些类型可能来自许多不同的来源。您可能必须查找包含/ import语句的内容,以了解该类型可以执行的操作(例如,您想要修改它,但它缺少您确定存在的方法)。

在iOS世界中,您会立即知道它是UIColor还是CGColor并获得直接背景。

在过去的WWDC上,Apple将主持一个会话,他们解释了Cocoa / Objective-C编码约定。我相信他们提到名称前缀的这一方面,所以你可能想找到一个可用的录音。由于各种原因,其他C开发人员(例如Linux内核开发人员)似乎也没有高度评价C ++命名空间(以及其他C ++特性)。