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部分编程.系统继承的其它资源中的源程序也应按此规 ...
随机推荐
- springboot pom 引用集合
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</arti ...
- ubuntu: 环境搭建
1.修改更新源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo gedit /etc/apt/sources.li ...
- STL学习二:Vector容器
1.Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). vector尾部添 ...
- GDAL编译(转)
一.简单的编译 1.使用VisualStudio IDE编译 首先进入GDAL的源代码目录,可以看到有几个sln为后缀的文件名,比如makegdal10.sln,makegdal80.sln,make ...
- 为什么使用long声明和double声明得到的结果不一样呢?
为什么使用long声明和double声明得到的结果不一样呢? 程序如下: public class P376{ public static void main(String[] atgs){ long ...
- 【BZOJ】【3759】Hungergame饥饿游戏
博弈论/高斯消元 如果没有打开箱子这个操作,那么就是一个很裸的Nim游戏…… 但是有了打开箱子这个操作,就变得蛋疼了T_T 首先我们可以想到一种直接的做法:打开所有箱子,当然如果此时所有a[i]的xo ...
- specular map normal map gloss map
http://www.marmoset.co/toolbag/learn/materials http://digitalerr0r.wordpress.com/2009/03/26/xna-shad ...
- 在线最优化求解(Online Optimization)之四:RDA
在线最优化求解(Online Optimization)之四:RDA 不论怎样,简单截断.TG.FOBOS都还是建立在SGD的基础之上的,属于梯度下降类型的方法,这类型方法的优点就是精度比较高,并且T ...
- 安装 NoMachine(NX) client and server
(1)Windows上直接安装nxclient-3.5.0-9.exe即可 (2)Linux上 准备linux rpms nxclient-3.5.0-7.x86_64.rpmnxnode-3.5.0 ...
- centos telnet --xinetd 服务
telnet由于是明文传输,所以安全起见最好不要用telnet服务.但是由于telnet是一个比较方便的远程工具,在windows上是自带 的不需要安装客户端即可使用.如果telnet设置的比较复杂, ...