1.命名git
1 |
extern ushort APIDefaultPageSize; // 还行,能明白意思了 |
为了举例,咱们假定有 User
、Tag
、Category
这几种 model 类型。github
对象展现通常分列表和单个详情,其 view controller 分别使用 ModelListController 和 ModelDetailController,推荐的语素顺序是:Model名 + 限定与修饰 + ListController|DetailController
。举例说明:json
1 |
// OK |
常常为了便于多个界面复用,咱们会把 model 的显示统一在一个 view controller 中,在其余界面嵌入这个 view controller。咱们把这类专门管理显示的 view controller 叫作 displayer
。如:多线程
1 |
UserListDisplayer |
UIView 级别的组件不要以 Controller 或 Displayer 结尾,若是起到管理做用可使用 control 结尾。函数
动机工具
把 model 名放在首位(如 TagUserLikedListController 而不是 UserLikedTagListController)的主要考量是便于搜索。由于 Xcode 不支持乱序搜索,关键词只能从前日后才会有结果。性能
若是限定词在前,由于不一样人理解差别,本身也会遗忘,这个限定词常常是输入不能的,只能搜 TagList 再从列表中查找,等于第一位的查找语素就废掉了。当 model 类型在第一位时,基本上熟悉这个项目的人都清楚要查找的视图显示的是什么类型,第一位正确了,后面添加/修改限定就很方便了。ui
另外一个便利的场景是参考以前界面实现另外一个界面时,查找的大都是相同类型的界面,如实现 UserFollowerListController 参考 UserFollowingListController;而相同限定的场景比较少见,像 UserLikedTagListController 参考 UserLikedCategoryListController 的可能性就较少。编码
PS: 务必常用 Xcode 的 Open Quickly(默认快捷键 Command+Shift+O)spa
alloc
、copy
、init
、mutableCopy
、new
开头的方法要注意,它们会改变ARC的行为。[^1]get
、set
开头的方法有特殊的意义,不要随意定义。
set
开头,可用 setup
替代。userInfomation
,而不是 getUserInfomation
。例:
1 |
Objective-C |
1 |
Objective-C |
好的协议名应能马上让人分辨出这不是一个类名,除了以经常使用的 delegate、dateSource 作结尾外,还可使用 …ing 这种形式,如:NSCoding
、NSCopying
、NSLocking
。
基本命名格式是:[与通知相关的类名] + [Did | Will] + [UniquePartOfName] + Notification
,例:
1 |
Objective-C |
1 |
// OK |
推荐的前缀:
前缀 | 含义 |
---|---|
ix | 序号,起始为0 |
in | 序号(天然数范围),起始为1 |
if | 类型为浮点的“序号” |
x | 坐标 |
y | 坐标 |
w | 宽度 |
h | 高度 |
vc | 视图控制器 |
v | 视图 |
除以上规则约定外,其余常量约定了如下前缀:
前缀 | 含义 |
---|---|
k | 宏常量 |
CDEN | Core Data entity name |
UDk | User Default key |
KCk | Key Chain key |
APIURL | 接口地址 |
另见:常量管理
图片资源在放入xcassets中相应视图控制器文件夹的基础上,根据[相应的功能] + [Btn | BtnClick | Icon]
,例:
1 |
UserAvatarDefaultIcon |
UpperCamelCase
)lowerCamelCase
)snake_case
)可使用普遍使用的缩写,如 URL
、JSON
,而且缩写要大写。但像将download
简写为dl
这种是不能够的。
1 |
Objective-C |
i,j专用于循环标号
为私有方法命名不要直接以“”开头,而应以“命名空间”开头。
类方法声明在方法类型与返回类型之间要有空格。
1 |
Objective-C |
条件判断的括号内侧不该有空格。
1 |
// 糟糕 |
关系运算符(如 >=
、!=
)和逻辑运算符(如 &&
、||
)两边要有空格。
1 |
// OK |
二元算数运算符两侧是否加空格不肯定,根据状况本身定。一元运算符与操做数以前没有空格。
多个参数逗号后留一个空格(这也符合正常的西文语法)。
方法的花括号推荐另起一行。方法内部须要写在一行。
1 |
- (void)methodName:(NSString *)string { |
动机
Xcode 默认的花括号位置是这样的:方法内部的各类补全都是在同一行的;方法定义的比较混乱,默认模版另起一行,但从 Interface Builder 中连线生成的方法在同一行的。
考虑到 Xcode 的默认行为,方法内部要另起一行,方法所在行不强制定死。另外,模版能够定制,而 IB 生成的代码不可定制,因此不另起一行的写法优先。
另起一行的写法在代码折叠后很是难看。
相对独立的程序块之间、变量说明以后必须加空行。
与多数其余规范不一样,不建议手动折行。
动机
手动折行的效果严重宽度依赖于窗口宽度——窗口过宽浪费宝贵的屏幕空间,较窄时可能没法阅读。并且 Xcode 自动折行的效果仍是不错的。
尽早返回错误:
1 |
// 为了简化示例,没有错误处理,并使用了伪代码 |
禁止在类的 interface 中定义任何 iVar 成员,只容许使用属性,但能够在特定情形中使用属性生成的 iVar。
尽可能老是使用点操做符访问属性,而不是属性生成的 iVar 变量。如下情形除外:
动机
若是使用 iVar,不少状况要特殊处理,容易出错。老是使用成员,规则简单,不易出问题。
直接访问 iVar 的 block 会 retain iVar 所属的对象,这点很容易被忽略
定义和使用 iVar 都会产生编译警告,只不过默认设置没启用这两个警告
何时使用 copy?
相关 Demo 可在 https://github.com/BB9z/PropertyTest 得到。
除非调试用的、控制不一样编译模式行为的常量可用宏外,其余常量不得用宏定义。
常量定义示例:
1 |
// 头文件 |
使用Xcode插件VVDocumenter-Xcode能够有效的进行编写注释的需求
全部的.h文件中对外的接口方法定义中必须进行注释,而.m文件中除非已经在.h中已经注释的方法或者是get/set方法能够不注释外,其他函数必须进行注释。
修改代码同时修改相应的注释,以保证注释与代码的一致性。再也不有用的注释要删除。
最后一点,尽可能让代码能够自表述,而不是依赖注释。
注释应该表达那些代码没有表达以及没法表达的东西。若是一段注释被用于解释一些本应该由这段代码本身表达的东西,咱们就应该将这段注释当作一个改变代码结构或编码惯例直至代码能够自我表达的信号。咱们重命名那些糟糕的方法和类名,而不是去修补。咱们选择将长函数中的一些代码段抽取出来造成一些小函数,这些小函数的名字能够表述原代码段的意图,而不是对这些代码段进行注释。尽量的经过代码进行表达。你经过代码所能表达的和你想要表达的全部事情之间的差额将为注释提供了一个合理的候选使用场合。对那些代码没法表达的东西进行注释,而不要仅简单地注释那些代码没有表达的东西。”[^2]
方法内部禁止使用块注释。除非要临时注释大段代码,通常状况总应使用行注释。
动机
由于块注释不能正确嵌套。