52个有效方法(19) - 使用清晰而协调的命名方式
2018-09-04 本文已影响14人
SkyMing一C
Objective-C的命名方式
-
名称中一般都带有"in"、"for"、"with"等介词。
-
方法与变量名使用了"驼峰式大小写命名法"(camel casing)--以小写字母开头,其后每个单词首字母大写。
-
类名也用驼峰命名法,不过其首字母要大写,而且前面通常还有两三个前缀字母。
方法命名
- 如果方法的返回值是新创建的,那么方法名的首个词应是返回值的类型,除非前面有修饰语,例如localizedString。
//工厂方法(factory method),用于创建新的空字符串。方法名清晰地描述了返回值的类型。
+ (instancetype)string;
//工厂方法,根据某字符串创建出与之内容相同的新字符串。与创建空字符串所用的那个工厂方法一样,方法名的第一个单词也指明了返回类型。
+ (instancetype)stringWithString:(NSString *)string;
//工厂方法,根据特定格式创建出新的"本地化字符串"(localized string)。返回值类型是方法名的第二个单词(string),因为其前面还有个修饰语(localized)用来描述其逻辑含义。此方法的返回值依然是"字符串"(string),只不过是一种经过本地化处理的特殊字符串。
+ (instancetype)localizedStringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
- 属性的存取方法不遵循这种命名方式,因为一般认为这些方法不会创建新对象,即便有时返回内部对象的一份拷贝,我们也认为那相当于原有的对象。这些存取方法应该按照其所对应的属性来命名。
//获取字符串长度(也就是其字符个数)。这个方法只有一个词,因为实际上length也是字符串的一个属性。这个属性可能不是由实例变量来实现的,然而即便如此,它也依然是字符串中的属性。此方法若是命名为stringLength就不好了。string一词多余,因为该方法的接收者肯定是个字符串。
- (NSUInteger)length;
- 应该把表示参数类型的名词放在参数前面。
//首个参数buffer应该指向一个足够大的数组,以便容纳所请求范围内的那些字符。此方法要通过其参数来返回(这种参数通常称为"输出参数'(out-parameter)), 而不通过返回值来返回,从内存管理的角度看,这样做更好。所有内存管理事宜均由方法调用者处理,而不是先在此方法中创建一个数组,然后再又调用者释放。第二个参数前有个描述其类型的名词(range),如果还有其他参数,也应该在方法名中提到其类型。有时参数名前面还会加介词,例如,此方法可以命名为"getCharacters:inRange:"。当需要特别强调众参数中的某一个时,通常会这样命名。
- (void)getCharacters:(uinichar*)buffer range:(NSRange)aRange;
- 如果方法要在当前对象上执行操作,那么就应该包含动词;若执行操作时还需要参数,则应该在动词后面加上一个或多个名称。
//NSMutableString
- (void)appendString:(NSString *)aString;
-
不要使用str这种简称,应该用string这样的全程。
-
Boolean属性应加is前缀。如果某方法返回非属性的Boolean值,那么应该根据其功能,选用has或is当前缀。
//判断两字符串是否相等。其返回值和"hasPrefix:"一样,都是Boolean型,为了便于述说,方法名用is开头。还有个地方也会用到is这个前缀词,那就是Boolean型的属性。比方说,有个属性叫做enabled,则其两个存取方法应该分别起名为"setEnabled:"与isEnabled。
- (BOOL)isEqualToString:(NSString *)aString;
//判断本字符串是否以另一个字符串开头。由于返回值是Boolean类型,所以为了读起来像个句子,这种方法的名称中通常都包括has("是否有")一词。
- (BOOL)hasPrefix:(NSString *)str;
- 将get这个前缀留给那些借由“输出参数”来保存返回值的方法,比如说,把返回值填充到“C语言式数组”里的那种方法就可以使用这个词做前缀。
//首个参数buffer应该指向一个足够大的数组,以便容纳所请求范围内的那些字符。此方法要通过其参数来返回(这种参数通常称为"输出参数'(out-parameter)), 而不通过返回值来返回,从内存管理的角度看,这样做更好。所有内存管理事宜均由方法调用者处理,而不是先在此方法中创建一个数组,然后再又调用者释放。第二个参数前有个描述其类型的名词(range),如果还有其他参数,也应该在方法名中提到其类型。有时参数名前面还会加介词,例如,此方法可以命名为"getCharacters:inRange:"。当需要特别强调众参数中的某一个时,通常会这样命名。
- (void)getCharacters:(uinichar*)buffer range:(NSRange)aRange;
类与协议的命名
- 应该为类与协议的名称加上前缀
UIView
//所有"视图"(View)均继承于此类。视图是构造用户界面的基本单元,它们负责绘制按钮、文本框(text field)、表格等控件。这个类的名字无须解释即可自明题意(self-explanatory)、开头的两个字母"UI"是UIKit框架的通用前缀。
- 如果是继承,子类的末尾应该和父类保持一致
UITableView
//这是一种特殊类型的视图,可以显示表格中的一系列条目。所以,它在超类(UIView)名称中的View一词前面加了Table这个修饰词,用以和其他类型的视图相区隔。在超类名称前加修饰语是一种常用的命名惯例。本类也可以叫做UITableView,不过这个名字无法完整传达出"视图"这个概念。开发者必须查看接口声明方能确定这一点。比方说,想创建一个专门用来显示图像的表格视图,那么就可以将这个继承自UITableView的子类命名为EOCImageTableView。不过这时要加上自己的前缀EOC,而不是沿用超类的前缀UI(UIKit框架中的类以UI为前缀)。这么做的原因在于,你不应该把自己的类放到其他框架的命名空间里面,那些框架以后也许会新建同名的类。
- 委托协议应该包含委托方的名称
UITableViewDelegate
//此协议定义了表格视图与其他对象之间的通信接口,命名时,把定义"委托接口"(delegate interface)的那个类名(UITableView)放在前面,后面加上Delegate一词,这样读起来顺口。
要点
-
起名时应遵从标准的Objective-C命名规范,这样创建出来的接口更容易为开发者所理解。
-
方法名要言简意赅,从左至右读起来要像个日常用语中的句子才好。
-
方法名里不要使用缩略后的类型名称。
-
给方法起名时的第一要务就是确保其风格与你自己的代码或所要继承的框架相符。