iOS 代码规范
核心原则
写优雅的代码, 就像整理房间一样, 让代码大体结构上来看, 是枝丫分明的树状结构(tree) , 程序所做的一切事情, 都是信息的传递和分支.
代码应简洁易懂, 逻辑清晰, 写模块化的代码
-
简洁的代码很容易看出bug, 需要写出明显没有bug的代码, 而不是bug不明显的代码
-
避免写太长的函数, 函数的长度一般不要超过40行, 大概就是屏幕所能看到的视角高度, 按逻辑拆分多个小函数
-
制造小的工具函数, 将重复的代码提出去做成函数, 虽然有的重复代码虽然只有2行, 提取出来做函数却能简化主要函数里的逻辑
-
每一个函数只做一件简单的事情,
举例子:我们有时候可能会写出一些 "通用" 函数,根据内部依据条件来选择这个函数做可以做的事情
func foo() {
if getOS().equals("MacOS") {
a();
} else {
b();
}
c();//此处c方法是共有的 然而abde都属于不同的分支
if getOS().equals("MacOS") {
d();
} else {
e();
}
}
func fooMacOS() {
a();
c();
d();
}
func fooOther() {
b();
c();
e();
}
写可读的代码
- 增加程序语言的表达能力, 使用有意义的函数和变量名词, 能够切实的描述他们的逻辑
put(elephant1,fridge2) 显而易见
- 局部变量尽量接近使用它的地方, 做到简短且不重用, 反复赋值容易混淆,
例子 :
int index = ...
...
...
...
bar(index) 可能中间都没有用到index, 也没有改变过依赖的数据, 这样读起来就容易认为是否是保存了某种变化的数据, 或者是其间被修改过, 如果放在下面读者就明白index 就清楚index并没有保存可变的值, 算出来后并没有进行任何的改变
...
...
...
int index = ...
bar(index)
-
去除复杂逻辑, 做成帮助函数
-
将复杂的表达式提取出去, 做成中间变量, 禁忌深度嵌套
make.left.equalTo(view.snp.left).offset(10)
面向变化编程, 而不是面向需求
需求只是暂时的, 代码不便于针对需求, 写出拓展性强易于修改的程序, 对代码也就是你的情人负责
代码规范
类
- 类的布局
布局分类时, 可以具体的写出功能点是哪些
#pragma mark - Life Cycle Methods
- (instancetype)init
- (void)dealloc
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
#pragma mark - Override Methods
#pragma mark - Intial Methods
#pragma mark - Network Methods
#pragma mark - Target Methods
#pragma mark - Public Methods
#pragma mark - Private Methods
#pragma mark - UITableViewDataSource
#pragma mark - UITableViewDelegate
#pragma mark - Lazy Loads
#pragma mark - NSCopying
#pragma mark - NSObject Methods
调取接口异常处理
关于UI方面, 每一处接口的警告处理及报错处理都需要考虑, 不单单是出现空数据, 以防出现不必要的问题
变量
- 变量名使用驼峰命名
类、协议使用大驼峰 对象等局部变量使用小驼峰
HomePageViewController.h
<HeaderViewDelegate>
NSString *personName = @"";
NSUInteger totalCount = 0;
- 变量名包含功能与类型
UIButton *addBtn //添加按钮
UILabel *nameLbl //名字标签
NSString *addressStr//地址字符串
- 系统常用类作实例变量声明时加入后缀
类型/后缀
UIViewController
VC
UIView
View
UILabel
Lbl
UIButton
Btn
UIImage
Img
UIImageView
ImagView
NSArray
Array
NSMutableArray
Marray
NSDictionary
Dict
NSMutableDictionary
Mdict
NSString
Str
NSMutableString
Mstr
NSSet
Set
NSMutableSet
Mset
属性
-
属性的命名使用小驼峰
-
实例化一个对象需要耗费资源, 如果这个对象中的某个属性需要调用"很多配置和计算", 我们可以使用懒加载, 在使用它的前一刻进行加载
- (NSDateFormatter *)dateFormatter
{
if (!_dateFormatter) {
_dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[_dateFormatter setLocale:enUSPOSIXLocale];
[_dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS"];
}
return _dateFormatter;
}
NSArray&NSMutableArray
addObject之前做非空判断, 取下标判断是否越界, 获取数据之前可以采用懒加载来初始化数组
运算符
- 一元运算符与变量之间没有空格
!isTop
- 二元预算符号之间空格
3 + 1
注释
-
特殊逻辑处理
-
api分部处理时, 需要的情况下, 标明调取的ipa
-
使用运行时方法交换, 需要注明