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包名的概念,随着工程代码的增加,难免会出现名字冲突,因此全局作用范围的名字必须唯一。比较经典的做法就是加命名前缀。大多数人认为命名前缀只是在类的前面加几个大写字母,其实不仅仅如此。
类型(类、枚举、结构)命名前要加相关模块前缀。
UIView
NSString
CGRect
常量命名要加相关类型名前缀。
UIApplicationDidFinishLaunchingNotification
CGRectZero
函数命名要加相关类型名前缀。
CGRectMake
CGPointMake
枚举类型命名要加相关类名前缀,并且枚举值命名要加枚举类型前缀。
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
};
做到以上几点几乎可以做到名字不会冲突。
参数提示
方法命名时,每个参数前要加参数的名称提示。
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
对象命名
给一个带修饰的对象命名时要采用修饰+类型的方式,而不是先指定其类型。
很多人喜欢把对象的类型放在对象的命名前面,从而来标识一个对象是什么类型,这很不符合Objective-C语言的特点,容易引起歧义,比如一个UILabel对象:
titleLabel //表示标题的label,是UIlabel对象
labelTitle //label的标题?似乎是一个NSString?
confirmButton //确认按钮
buttonConfirm //不自然的命名,看上去像是按钮点击动作。
方法命名符合语法
大部分方法可以分成下面两类,而这两类往往被乱用。它们是:
- 要什么
- 做什么
“要什么”表示取得某个对象,要以名词作为方法的开头;“做什么”表示执行某种操作,要以动词作为方法开头。看看下面这个命名方式:
- (XXItem *)itemNamed:(NSString *)name //Good. 意思清晰
- (XXItem *)findItemWithName:(NSString *)name //更像是一种操作,而不是返回一个对象。
findItemWithName
这个命名表示一种操作,而无需返回对象,比如它可以用于设置类的内部成员,比如:
- (void)findItemWithName:(NSString *)name{
...
self.foundItem = xxx;
...
}
get
“要什么”往往被胡乱命名为get
开头的方法。首先get是一个动词,所以它还是“做什么”或者说“做的是要什么”。那么get方法不要用于返回对象,但它可用于参数中返回。
- (XXItem *)getItemAtIndex:(NSUInteger)index //Bad!! 不规范的命名
- (XXItem *)itemAtIndex:(NSUInteger)index //Good, 命名清晰
- (void)getItem:(XXItem **)outItem atIndex:(NSUInteger)index //比较符合规范,但第二种更好。
可知性
回调时被调用者要知道其调用者
可以在回调方法中第一个参数中加上调用者:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- (void)buttonTapped:(UIButton*)sender
常量还是宏
全局常量不可使用宏定义
我们经常看到一些用宏定义的通知,关键字等。其实这么做是非常危险的,因为宏很可能被重定义,而且引用不同的文件可能会导致宏的不同,所以尽量使用const
来定义常量。
一些思考
命名的好坏在开发中往往也不怎么重视,毕竟差的命名也不会影响程序逻辑。
但是不好的命名在大项目中带来的隐形维护成本是相当高的,这些在项目开始时 可能还很难察觉,而后来会陷入前仆后继的维护困境中。
我们往往非常重视项目逻辑的复杂性,却不能好好的把“简单”的命名做好。
其实,如果简单的东西都做不好,那么做出再复杂的东西那也是垃圾。
Objective-C命名编写规范的更多相关文章
- 20151009 C# 第一篇 程序编写规范
20151009 程序编写规范 1. 代码书写规则: 1).尽量使用接口,然后使用类实现接口. 2).关键语句写注释 3).避免写超过5个参数的方法,如果要传递多个参数,则使用结构 4).避免代码量过 ...
- .NET代码编写规范 整理
.NET代码编写规范 整理 .NET代码编写规范 - [ASP.NET] 2009-02-26 | Tag: 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://lensp ...
- 代码编写规范说明书(c#.net与asp.net)
代码编写规范说明书(c#.net与asp.net) 目 录1 目的2 范围3 注释规范3.1 概述3.2 自建代码文件注释3.3 模块(类)注释3.4 类属性注释3.5 方法注释3.6 代码间注释4 ...
- Python代码编写规范
Python代码编写规范 编码: a) 如无特殊情况,文件一律使用UTF-8编码 b) 如无需特殊情况,文件头部必须加入#-*-coding:utf-8-*- 缩进 a) 统一 ...
- 【转】python编写规范——中标软件有限公司测试中心
[转]python编写规范 一.说明 二.内容 1. 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行... 1.5 编码... 2. 语句... 2.1 标准 ...
- 个人css编写规范
前言:最近在做微信小程序,因为公司小,就我一个人弄前端的东西,js和页面都是我来弄,结果那天后台的人看到我的js代码,说我的代码写得不规范,函数什么的都很乱,弄得我羞愧难当,幸亏没看我的css,其实我 ...
- Android的硬件抽象层模块编写规范
硬件抽象层模块编写规范 Android系统的硬件抽象层以模块的形式来管理各个硬件訪问接口.每个硬件模块都相应有一个动态链接库文件.这些动态链接库文件的命令须要符合一定的规范.同一时候,在系统内部. ...
- css编写规范最佳实践
最初,在编写CSS的时候,我们往往想到哪儿就写到哪儿,它们之间的关联性和有序性并不在考虑之中.但随着代码量的增加,亦或是多人共同开发,CSS的编写规范变得重要起来了.本文通过三个方面,总结出CSS编写 ...
- Java学习---Java代码编写规范
编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规 ...
随机推荐
- plateform_driver_register和plateform_device_register区别
设备与驱动的两种绑定方式:在设备注册时进行绑定及在驱动注册时进行绑定. 以一个USB设备为例,有两种情形: (1)先插上USB设备并挂到总线中,然后在安装USB驱动程序过程中从总线上遍历各个设备,看驱 ...
- makefile教程网址
http://www.cnblogs.com/wang_yb/p/3990952.html
- Linux命令练级初级
Linux命令练级初级 http://ke.qq.com/video/index.html?course_id=6815 ls -a 所有文件 -l 类型,连接数,所属用户,工作组, ...
- 构件图 Component Diagram
构件图是显示代码自身结构的实现级别的图表.构件图由诸如源代码文件.二进制代码文件.可执行文件或动态链接库 (DLL) 这样的构件构成,并通过依赖关系相连接 下面这张图介绍了构件图的基本内容: 下面这张 ...
- ADT通过svn进行团队开发,svn插件不好使的解决方案
在使用ADT的svn插件的时候老是会出现各种异常,所以就干脆不用svn插件了,直接将adt的工作空间建在svn上面,以保证团队成员共用一套代码,节约宝贵的整合时间. 使用步骤: 1.首先需要安装好sv ...
- android开发 java与c# 兼容AES加密
由于android客户端采用的是AES加密,服务器用的是asp.net(c#),所以就造成了不一致的加密与解密问题,下面就贴出代码,已经试验过. using System; using System. ...
- 所有的代码生成器都是浮云,如果可以用aspx文件作为模板
首先申明:标题中的如果是可以去掉的. 想写这篇文章很长时间了,一来是跟大家分享一下,别浪费时间在写代码生成器上面了,什么CodeSmith,XXCodeGenerator等等,都是浮云:二来想跟大家交 ...
- php中的性能挖掘
搞php以后,感觉总是很别扭,因为我觉得php会很慢,因为array普遍,在Key的循环查找不是很浪费性能么!因为我以前搞.net和java,他们是用的大多是寻址和索引方式,而php中太多是使用Key ...
- .NET 轻松实现HTML的绝对过滤之SafeHelper
当今网页中经常使用到网页编辑器,因为人们需要在网页中插入图片,视频,样式等html代码内容,这使得网页的信息更加丰富.随之而来的,也给程序开发者带来了不少麻烦,因为提交的html中难免会出现不安全标记 ...
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads
题目链接: http://www.codeforces.com/contest/629/problem/E 题解: 树形dp. siz[x]为x这颗子树的节点个数(包括x自己) dep[x]表示x这个 ...