iOS 代码规范

299 阅读4分钟

iOS 代码规范

核心原则

写优雅的代码, 就像整理房间一样, 让代码大体结构上来看, 是枝丫分明的树状结构(tree) , 程序所做的一切事情, 都是信息的传递和分支.

代码应简洁易懂, 逻辑清晰, 写模块化的代码

  1. 简洁的代码很容易看出bug, 需要写出明显没有bug的代码, 而不是bug不明显的代码

  2. 避免写太长的函数, 函数的长度一般不要超过40行, 大概就是屏幕所能看到的视角高度, 按逻辑拆分多个小函数

  3. 制造小的工具函数, 将重复的代码提出去做成函数, 虽然有的重复代码虽然只有2行, 提取出来做函数却能简化主要函数里的逻辑

  4. 每一个函数只做一件简单的事情,

举例子:我们有时候可能会写出一些 "通用" 函数,根据内部依据条件来选择这个函数做可以做的事情


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();
}

写可读的代码

  1. 增加程序语言的表达能力, 使用有意义的函数和变量名词, 能够切实的描述他们的逻辑

put(elephant1,fridge2) 显而易见

  1. 局部变量尽量接近使用它的地方, 做到简短且不重用, 反复赋值容易混淆,

例子 :


int index = ... 
...
...
...
bar(index) 可能中间都没有用到index,  也没有改变过依赖的数据,  这样读起来就容易认为是否是保存了某种变化的数据,  或者是其间被修改过,  如果放在下面读者就明白index 就清楚index并没有保存可变的值, 算出来后并没有进行任何的改变


...
...
...
int index = ... 
bar(index) 

  1. 去除复杂逻辑, 做成帮助函数

  2. 将复杂的表达式提取出去, 做成中间变量, 禁忌深度嵌套


make.left.equalTo(view.snp.left).offset(10) 

面向变化编程, 而不是面向需求

需求只是暂时的, 代码不便于针对需求, 写出拓展性强易于修改的程序, 对代码也就是你的情人负责

代码规范

  1. 类的布局

布局分类时, 可以具体的写出功能点是哪些

#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方面, 每一处接口的警告处理及报错处理都需要考虑, 不单单是出现空数据, 以防出现不必要的问题

变量

  1. 变量名使用驼峰命名

类、协议使用大驼峰 对象等局部变量使用小驼峰


HomePageViewController.h
<HeaderViewDelegate>

NSString *personName = @"";
NSUInteger totalCount = 0;

  1. 变量名包含功能与类型

UIButton *addBtn //添加按钮
UILabel *nameLbl //名字标签
NSString *addressStr//地址字符串

  1. 系统常用类作实例变量声明时加入后缀
类型/后缀

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

属性

  1. 属性的命名使用小驼峰

  2. 实例化一个对象需要耗费资源, 如果这个对象中的某个属性需要调用"很多配置和计算", 我们可以使用懒加载, 在使用它的前一刻进行加载

- (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之前做非空判断, 取下标判断是否越界, 获取数据之前可以采用懒加载来初始化数组

运算符

  1. 一元运算符与变量之间没有空格

!isTop

  1. 二元预算符号之间空格

3 + 1

注释

  1. 特殊逻辑处理

  2. api分部处理时, 需要的情况下, 标明调取的ipa

  3. 使用运行时方法交换, 需要注明