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部分编程.系统继承的其它资源中的源程序也应按此规 ...
随机推荐
- MAC 升级到10.10(OS X Yosemite)下apache+php的配置问题
MAC升级到最新系统后 本地测试的站点不能正常运行,其原因是mac系统升级后 他的apache的版本也随之升级了版本 Server version: Apache/2.4.9 (Unix) Serve ...
- ASP.NET MVC 学习第三天
今天来简单说一下Razor视图引擎语法相关的和视图类. 添加一个MvcTest项目,继续添加一个Home控制器,完成index的视图添加.我们就在index这里分析razor视图引擎.下面是home控 ...
- 非常实用的10个PHP高级应用技巧
PHP 独特的语法混合了 C.Java.Perl 以及 PHP 自创新的语法.它可以比 CGI或者Perl更快速的执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML ...
- windows环境下MySQL重启的命令行说明
ctrl+r 弹出运行框,输入cmd,然后再控制太输入命令: 1.点击“开始”->“运行”(快捷键Win+R). 2.停止:输入 net stop mysql 3.启动:输入 net start ...
- LoadRunner 学习笔记(2)VuGen运行时设置Run-Time Setting
定义:在Vugen中Run-Time Setting是用来设置脚本运行时所需要的相关选项
- Ubuntu重启网络/etc/init.d/networking restart报错
Linux版本:Ubuntu 12.04 配置网口后重启网络,提示/etc/init.d/networking restart is deprecated. $ sudo /etc/init.d/ne ...
- 树形dp求树的重心
Balancing Act http://poj.org/problem?id=1655 #include<cstdio> #include<cstring> #include ...
- ios开发之网络数据的下载与上传
要实现网络数据的下载与上传,主要有三种方式 > NSURLConnection 针对少量数据,使用“GET”或“POST”方法从服务器获取数据,使用“POST”方法向服务器传输数据; > ...
- 前端学习笔记汇总(之merge方法)
学习笔记 关于Jquery的merge方法 话不多说,先上图 使用jquery时,其智能提示如上,大概意思就是合并first和second两个数组,得到的结果是first+(second去重后的结果) ...
- SPOJ LCS 后缀自动机
用后缀自动机求两个长串的最长公共子串,效果拔群.多样例的时候memset要去掉. 解题思路就是跟CLJ的一模一样啦. #pragma warning(disable:4996) #include< ...