第15条:用前缀避免命名空间冲突

  我们在构建应用程序时,可能想将其中部分代码用于后续项目,也可能想把某些代码发布出来,供他人使用。即便现在还不想这么做,将来也总会有用到的时候。如果决定重用代码,那么我们在编写接口时就会将其设计成易于复用的形式。这需要用到 Objective-C 语言中常见的编程范式(paradigm),同时还需了解各种可能碰到的陷阱。

  近年来,开源社区与开源组件随着iOS 开发而流行起来,所以我们经常会在开发自己的应用程序时使用他人所写的代码。与此同时,别人也会用到你的代码,所以,要把代码写得清晰一些,以便其他开发者能够迅速而方便地将其集成到他们的项目里。

  本条要点:(作者总结)

  

  Objective-C 没有其他语言那种内置的命名空间(namespace)机制。鉴于此,我们在起名时要设法避免潜在的命名冲突,否则很容易就重名了。如果发生命名冲突(naming clash),那么应用程序的链接过程就会出错,因为其中出现了重复符号:

1 duplicate symbol _OBJC_METACLASS_$_EOCTheClass in:
2         build/something.o
3         build/something_else.o
4 duplicate symbol _OBJC_CLASS_$_EOCTheClass in:
5         build/something.o
6         build/something_else.o

  错误原因在于,应用程序中的两份代码都各自实现了名为 EOCTheClass 的类,这导致 EOCTheClass 所对应的类符号和 “元类”符号各定义了两次。你也许是把两个相互独立的程序库都引入到当前项目中,而它们又恰好有重名的类,所以产生了这一问题。

  比无法链接更糟糕的情况是,在运行期载入了含有重名类的程序库。此时,“动态加载器”(dynamic loader)就遭遇了 “重名符号错误”(duplicate symbol error),就可能会令整个应用程序崩溃。

  避免此问题的唯一办法就是变相实现命名空间:为所有名称都加上适当前缀。所选前缀可以与公司、应用程序或二者皆有关联之名。比方说,假设你所在的公司叫做 Effective Widgets,那么就可以在所有应用程序都会用到的那部分代码中使用 EWS 作前缀,如果有些代码只用于名为 Effective Browser 的浏览器项目中,那就在这部分代码中使用 EWB 作前缀。即便加了前缀,也难保不出现命名冲突,但是其几率会小很多。

  使用 Cocoa 创建应用程序时一定要注意,Apple 宣称其保留使用所有 “两字母前缀”(two-letter prefix)的权利,所以你自己选用的前缀应该是三个字母的。举个例子,加入开发者不遵循这条守则,使用 TW 这两个字母作前缀,那么就会出问题。iOS 5.0 SDK 发布时,包含了 Twitter 框架,此框架就使用 TW 作前缀,其中有个类叫做 TWRequest,它可以发送 HTTP 请求以调用 Twitter API。如果你所在的公司叫做 Tiny Widgets,那么很有可能把访问本公司 API 所用的那个类也命名为 TWRequest。

  不仅是类名,应用程序中的所有名称都应加前缀。如果要为既有类新增 “分类”(category),那么一定要给 “分类”及“分类”中的方法加上前缀,

时间: 2024-12-21 19:37:30

第15条:用前缀避免命名空间冲突的相关文章

《Effective Objective-C 2.0》—(第1-5条)—熟悉Objective-C

Objective-C通过一套全新的语法,在C语言基础上添加了面向对象特性.OC的语法中频繁使用中括号([  ]),而且不吝于写出极长的方法名,这通常令许多人觉得此语言较为冗长.这是这样写出来的代码非常易读,只是C++和Java程序员不太适应. OC语言学起来很快,但有很多微妙细节需要注意,而且还有许多容易为人所忽略的特性.另一方面,有些开发者并未完全理解或是容易滥用某些特性,导致写出来的代码难以维护,难以调试.本章讲解基础知识,后续各章语言及其相关架构的各个特定话题. 第1条:了解OC语言的起

Web开发者不可不知的15条编码原则

HTML已经走过了近20的发展历程.从HTML4到XHTML,再到最近十分火热的HTML5,它几乎见证了整个互联网的发展.但是,即便到现在,有很多基础的概念和原则依然需要开发者高度注意.下面,向大家介绍这些应该遵循的开发原则. 1.善用DIV来布局 当开发一个Web页面时,要考虑第一件事就是区分页面重点.将这些内容用DIV标签包含起来,页面的代码会呈现出整洁.缩进良好的风格. <div id="header"></div> <div id="bo

#4【转】Google推荐的15条军规:HTML5代码规范

这篇文章是转载的,很久之前收录在电脑里面的.  忘记是哪里搞来的了,大家知道是转载的就好了... 这里的图片要点击打开才能看到,因为复制过来的,图片有点问题...因此想要图片的辛苦了... Google推荐的15条军规:HTML5代码规范 1.协议头: 建议在指向图片或其他媒体文件.样式表和脚本的URL地址中省略HTTP:协议部分,除非已知相应文件不能同时兼容2个协议. 2.缩进:每次缩进使用双空格 不要使用tab制表符或制表符加空格的混合方式缩进 3.大小写:只使用小写 所有的代码都应是小写的

15条初学者必看的JavaScript快速小贴士

(本图为:15条初学者必看的JavaScript快速小贴士) 今天小编为了我们的初学JavaScript的小伙伴们简单介绍下这门编程语言,更好的帮助你们来深入的学习它,使用它: JavaScript 是属于网络的脚本语言! JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用. JavaScript 是因特网上最流行的脚本语言. JavaScript 很容易使用!你一定会喜欢它的! 为了能够帮助那些刚开始接触 JavaScript 的人,我

Android开发中15条小经验

Android开发中15条小经验 1. TextView中的getTextSize返回值是以像素(px)为单位的,而setTextSize()是以sp为单位的. 所以如果直接用返回的值来设置会出错,解决办法是用setTextSize()的另外一种形式,可以指定单位: setTextSize(intunit,intsize) TypedValue.COMPLEX_UNIT_PX:Pixels TypedValue.COMPLEX_UNIT_SP:ScaledPixels TypedValue.CO

优化SpriteKit游戏性能的15条建议

本文翻译自 15 tips to optimize your SpriteKit game SpriteKit是一个简单快速的二维游戏框架,由苹果自己的媒体库支持,可以直接访问GPU. 但是随着游戏的编写,可能会发现帧率开始下降,而且对于iPad Pro这样拥有120Hz刷新率显示屏的设备,需要努力将每一帧更新时间控制在8毫秒之内. 如果遇到帧率低.动画不稳定或类似的性能问题,可以通过一下15个优化方法来识别和解决问题,而且有少量代码示意. 使用纹理图集时要谨慎 纹理地图集将多个单独的资源放置在

源码管理的新15条建议

作者:张克强    作者微博:张克强-敏捷307 建议之1:使用好的配置管理工具,也称为版本号控制工具(Version Control), 比方Git,SVN. 请彻底抛弃 VSS.假设是新採用配置管理工具,CVS已经不再是选项. 配置管理工具与版本号控制工具能够理解为指的是同样工具. 建议之2:抛弃古老的配置管理三库做法,常说的三库是指开发库(动态库).受控库和产品库(静态库).做法是开发库->受控库->产品库. 在当年没有强大版本号控制工具的"古代",三库做法是不得不的

从零开始学 iOS 开发的15条建议

事情困难是事实,再困难的事还是要每天努力去做是更大的事实. 因为我是一路自学过来的,并且公认没什么天赋的前提下,进步得不算太慢,所以有很多打算从零开始的朋友会问我,该怎么学iOS开发.跟粉丝群的朋友交流了一下,决定把之前的<18条建议>修改一下,这里统一回答一次. 分三部分: 第一部分:态度和电脑 1.不要关注别人的学习经历,不要关注别人加薪经历. 因为人各不同,别人的经历极有可能并不适合你.而因为每一天的市场状况都不一样,企业的用人需求每天都在变,别人的加薪经历再传奇或惨淡,你都无法复制.别

15条规则解析JavaScript对象布局(__proto__、prototype、constructor)

大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人当时是怎么做的?设计完之后又变成了什么? 我们来看一张图: 相信大家对这张图都不陌生了,构造函数有一个prototype属性指向其原型.相反原型也有一个constructor指向构造函数.与此同时实例也有一个constructor指向构造函数,这简直就是互相捆绑生怕找不到啊不是吗? 还有一个我们称之