Objective-C 之优雅的命名-看似简单,实际却很考验开发者的功力

There are only two hard things in Computer Science: cache invalidation and naming things.

在计算机科学中只有两件难事:缓存失效和命名。 

— Phil Karlton

计算机语言是人和计算机之间通讯的媒介。好的代码应该是就像人对计算机说话那样,自然而优雅。命名看上去是一件很简单的事,而往往越是简单的事越难做好,否则大师们也不会把命名看成是计算机界的难题了。如何把Objective-C这门计算机语言以优雅的方式“说”出,还是比较考验工程师对它的理解深度的。在苹果的SDK中有大量的API,我们可以从这些API中体会到一些命名的艺术。

 

减少缩写

命名缩写只用于通用专业术语,如 URL,不可自创命名缩写,如 Ctr、Msg。命名宁可长一些,也不要难于理解。

 

是否在看别人代码时各种缩写而不知其所以然?简短的名字确实比较好,但不可滥用缩写导致失去可读性。

 

过程化

动作发生之前用 Will,发生之后用 Did,询问是否发生用 Should。

 

每个处理都是有一定过程的,这个处理往往会产生一些通知和回调,好的命名必须要明确当前过程中的步骤。命名这些通知和回调时最好提供发生前后两个版本,如果发生前要回调确认,请用 Should 命名该回调,并返回一个 BOOL 值。

 

名字空间

各种全局作用范围的函数,常量,类,枚举,结构等命名必须加命名前缀。

 

Objective-C中没有C++那样的名字空间概念,也没有Java包名的概念,随着工程代码的增加,难免会出现名字冲突,因此全局作用范围的名字必须唯一。比较经典的做法就是加命名前缀。大多数人认为命名前缀只是在类的前面加几个大写字母,其实不仅仅如此。

 

•类型(类、枚举、结构)命名前要加相关模块前缀。


  1. UIView 
  2. NSString 
  3. CGRect 

 •常量命名要加相关类型名前缀。


  1. UIApplicationDidFinishLaunchingNotification 
  2. CGRectZero 

 •函数命名要加相关类型名前缀。


  1. CGRectMake 
  2. CGPointMake 

 •枚举类型命名要加相关类名前缀,并且枚举值命名要加枚举类型前缀。


  1. typedef NS_ENUM(NSInteger, UIViewAnimationTransition) { 
  2.     UIViewAnimationTransitionNone, 
  3.     UIViewAnimationTransitionFlipFromLeft, 
  4.     UIViewAnimationTransitionFlipFromRight, 
  5.     UIViewAnimationTransitionCurlUp, 
  6.     UIViewAnimationTransitionCurlDown, 
  7. }; 

做到以上几点几乎可以做到名字不会冲突。

 

参数提示

方法命名时,每个参数前要加参数的名称提示。


  1. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
  2. - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender 

 

对象命名

给一个带修饰的对象命名时要采用修饰+类型的方式,而不是先指定其类型。

 

很多人喜欢把对象的类型放在对象的命名前面,从而来标识一个对象是什么类型,这很不符合Objective-C语言的特点,容易引起歧义,比如一个 UILabel 对象:


  1. titleLabel      //表示标题的label,是UIlabel对象 
  2. labelTitle      //label的标题?似乎是一个NSString? 
  3.  
  4. confirmButton   //确认按钮 
  5. buttonConfirm   //不自然的命名,看上去像是按钮点击动作。 

 

方法命名符合语法

 

大部分方法可以分成下面两类,而这两类往往被乱用。它们是:

•要什么

•做什么

 

“要什么”表示取得某个对象,要以名词作为方法的开头;“做什么”表示执行某种操作,要以动词作为方法开头。看看下面这个命名方式:


  1. - (XXItem *)itemNamed:(NSString *)name           //Good. 意思清晰 
  2. - (XXItem *)findItemWithName:(NSString *)name    //更像是一种操作,而不是返回一个对象。 

 

findItemWithName 这个命名表示一种操作,而无需返回对象,比如它可以用于设置类的内部成员,比如:


  1. - (void)findItemWithName:(NSString *)name{ 
  2.     ... 
  3.     self.foundItem = xxx; 
  4.     ... 

 

get

“要什么”往往被胡乱命名为get开头的方法。首先get是一个动词,所以它还是“做什么”或者说“做的是要什么”。那么get方法不要用于返回对象,但它可用于参数中返回。


  1. - (XXItem *)getItemAtIndex:(NSUInteger)index                  //Bad!! 不规范的命名 
  2. - (XXItem *)itemAtIndex:(NSUInteger)index                     //Good, 命名清晰 
  3. - (void)getItem:(XXItem **)outItem atIndex:(NSUInteger)index  //比较符合规范,但第二种更好。 

 

可知性

 

回调时被调用者要知道其调用者

 

可以在回调方法中第一个参数中加上调用者:


  1. - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
  2. - (void)buttonTapped:(UIButton*)sender 

 

常量还是宏

 

全局常量不可使用宏定义

我们经常看到一些用宏定义的通知,关键字等。其实这么做是非常危险的,因为宏很可能被重定义,而且引用不同的文件可能会导致宏的不同,所以尽量使用const来定义常量。

 

一些思考

命名的好坏在开发中往往也不怎么重视,毕竟差的命名也不会影响程序逻辑。但是不好的命名在大项目中带来的隐形维护成本是相当高的,这些在项目开始时可能还很难察觉,而后来会陷入前仆后继的维护困境中。我们往往非常重视项目逻辑的复杂性,却不能好好的把“简单”的命名做好。其实,如果简单的东西都做不好,那么做出再复杂的东西那也是垃圾。

本文转载自cocoachina:http://www.cocoachina.com/applenews/devnews/2014/0816/9395.html

时间: 2024-10-24 06:53:50

Objective-C 之优雅的命名-看似简单,实际却很考验开发者的功力的相关文章

SEO看似简单但更应该拒绝浮躁的心理

SEO一提起嘛,不外乎就是原创加外链,我相信这个已经是被提烂了的说法了,所以好多人一来就觉得SEO太简单了,不就是写写文章嘛,发发外链嘛,这个谁不会啊,也就是好多人天天没命的写原创,网站为什么还是不收录;好多人疯狂的发外链,为什么排名还是没有上升,天天在QQ群里边这样的人太多了,简直是数不甚数,所以SEO也才被人为民工职业,也是好多人选择了退出的原因,其实真的是这样吗,或许好多人在说这句话之前都忽略了一个前提,而且是一个很重要的前提:那就是在做这些原创和外链之前就是网站已经完全搭建好了,而且也是

一个看似简单实则颇有些难度的go语言问题,关于密码输入

问题描述 一个看似简单实则颇有些难度的go语言问题,关于密码输入 RT. 具体要求:输入一串字符(中间可能有各种空格啊符号啊之类)作为密码,以回车键结束 由于是密码,所以输入时屏幕不能明文显示,当每输入一个字符则显示为一个*,最后密码由一个string型变量获取 好像用go语言不是那么好实现,尤其是考虑到退格键以及方向键改变输入顺序的问题(比如输入的时候用方向键将光标前移后插入内容),还有delete键带来的删除效果-- 各位大神有什么好的解决方案?期待最简洁的代码--

看似简单,思考了很久的编程题,大神求解???

问题描述 看似简单,思考了很久的编程题,大神求解??? 输入n(1-10之间数字),将数字分解显示,如6可以显示为6,5+1,4+2,4+1+1..... 解决方案 http://ideone.com/bhnyWO 1+1+1+1+1 1+1+1+2 1+1+3 1+2+2 1+4 2+3 5 解决方案二: using System; using System.Linq; using System.Collections.Generic; public class Test { static i

一个简单但是效果很好的“文字人物”效果

  一个简单但是效果很好的"文字人物"效果!实用粗暴,运用在海报更适合,值得借鉴学习 分类: PS入门教程

看似简单的sql排序问题!.........

问题描述 我现在t_pagetest这张表有20000条记录,其中id是从1~20000,我写的二分查找法分页存储过程.我按id倒序进行反向检索时怎么样让查询的结果倒过来.--我其实就是要Id倒序,查第1999页SELECTTOP10*FROMt_pagetestWHEREid>(SELECTMAX(id)FROM(SELECTTOP10idFROMt_pagetestorderbyidASC)ASTMP)11FirstName_XXXFirstName_YYY12FirstName_XXXFi

看似简单!解读C#程序员最易犯的7大错误

编程时犯错是必然的,即使是一个很小的错误也可能会导致昂贵的代价,聪明的人善于从错误中汲取教训,尽量不再重复犯错,在这篇文章中,我将重点介绍C#开发人员最容易犯的7个错误. 格式化字符串 在C#编程中,字符串类型是最容易处理出错的地方,其代价往往也很昂贵,在.NET Framework中,字符串是一个不可变的类型,当一个字符串被修改后,总是创建一个新的副本,不会改变源字符串,大多数开发人员总是喜欢使用下面这样的方法格式化字符串: string updateQueryText = "UPDATE E

视错觉:从一个看似简单的自定义控件说起

为什么要写今天这篇博客那就说来话长了,那是在一个大雪纷飞的冬天--然后--.好了,不扯淡了,直接进入今天的主题吧,这篇博客是关于iOS自定义组件的东西.一些UI效果看起来似乎是这个样子,其实本质不是这个样子.在做一些UI效果时我们可以利用视错觉的一些东西,让用户看到的是一个东西,其实你实现的又是一个东西.原则是想方设法骗过用户的眼睛.视错觉如果和UI实现结合起来,有时会产生意想不到的效果. 一.视错觉的概述 引用--"视错觉就是当人观察物体时,基于经验主义或不当的参照形成的错误的判断和感知.视错

一起谈.NET技术,看似简单!解读C#程序员最易犯的7大错误

编程时犯错是必然的,即使是一个很小的错误也可能会导致昂贵的代价,聪明的人善于从错误中汲取教训,尽量不再重复犯错,在这篇文章中,我将重点介绍C#开发人员最容易犯的7个错误. 格式化字符串 在C#编程中,字符串类型是最容易处理出错的地方,其代价往往也很昂贵,在.NET Framework中,字符串是一个不可变的类型,当一个字符串被修改后,总是创建一个新的副本,不会改变源字符串,大多数开发人员总是喜欢使用下面这样的方法格式化字符串: string updateQueryText = "UPDATE E

关于开机看似简单却复杂的问题讨论

问题描述 背景:要实现以下功能:将自己编写的程序放在光盘或USB启动介质中,开机引导时加载自己编写的程序,然后正常引导操作系统.问题一:操作系统引导成功(如WINDOWS)进入桌面后,自己写的程序是否依然驻留运行?问题二:如果能保证操作系统启动过程中,自己写的程序驻留运行,有没有办法监控系统的启动行为(如磁盘访问)?