Mogo iOS代码规范

通过建立代码编写规范,形成iOS开发团队编码约定,提高程序的可靠性、可读性、一致性、可维护、可扩展,保证程序代码的质量。提高程序的重用性,使开发人员之间的工作成果可以共享。

参与整理:李朝阳

一、命名规则

官方规则:Cocoa代码指南

1、总则
  • 简洁
    简单明了,尽量使用全拼
应该: setBackgroundColor
不应该:setBkgdColor

当然,我们也会有一些常用的缩略词,比如 info 代表 Information等(待补充)

  • 一致性
    作用相同,或者在表达同一件事时,统一命名。
    比如位置存储信息 location,不要再出来place表示位置的情况。

  • 无自引用

应该:nameString
不应该:nameStringObject
2、一般类、属性、方法命名

遵守驼峰命名法,类名首字母大写,方法名和属性首字母小写(首字母为缩略词,如WWDC时除外)

  • 类名需要加前缀,前缀一般为:“项目关键词”+“模块关键词”
    如短信需求,前缀应该为“MGSMS”(现在是FB,因为之前项目名为5Ber)
    以类型为结尾,如:
MWBaseViewController、MWOrderListCell、MWSuggestTextView...
  • 方法命名:参数前要加描述词
应该:- (void)updateListData:(NSDictionary *)data;
不应该:- (void)update:(NSDictionary *)data;
  • 私有变量应该尽可能代替实例变量的使用。尽管使用实例变量是一种有效的方式,但更偏向于使用属性来保持代码一致性。
    属性get忽略 is前缀,建议如下写法:
@property (assign, getter=isEditable) BOOL editable;
3、枚举命名规则

枚举名同类名规则,加前缀,大驼峰命名
枚举值去掉前缀,大驼峰命名

    typedef NS_ENUM(NSInteger, FBSMSControllerSelectType) {
        ControllerSelectTypeOne,
        ControllerSelectType..,
    };

多用枚举控制多态,减少bool值等去判断的情况,增加可读性

4、常量命名规则
  • 以const修饰一个常量,一般是写在.h文件中,然后将.h的头文件加入预编译pch文件中,以小写字母k开头,后面单词遵循"驼峰原则"命名。例如:
      const float kMaxHeigh = 100.f;
      const int kNumberCount = 100;
  • 如果是特殊含义的常量,声明形式为"各APP前缀+名称",形式如下:
const NSString *FB*** = @"xx"

宏定义
宏定义在很多方面都会使用,例如定义高度、工具类,还有诸如文件路径。宏定义的命名,需要传参数的时候使用前缀,比如"FB":

#define FB***
二、代码格式化
  • 文件夹规范
Mogo
- Main:主流程页面代码
   - Home:
      - subModule
         Controller
         server
         - Model
         - View
   - iVoice:
   - ...
- Common:通用代码(自己封装的一些UI库之类的)
   - Customer
   - Tool
   - FBAnalytics
   ...
- Vender:拉进来的代码库
- Resource:资源文件
- Other:全局文件

Products:应用程序
Pods:pod管理
Frameworks:手动拉入的代码库
  • 常用规范
- 运算符前后前后各一个空格
- *号紧贴属性名,和类名之间隔一个空格
NSString *text = @"hello world";

- 括号前后各一个空格
- 属性修饰符和前面的,隔一个空格
@property (nonatomic, strong) UITableView *tableView;

- 当参数过长的时候,没个参数占用一行,且按照冒号对齐。
- 在声明类方法或者实例方法的时候,“+”或者“-”和返回值之间保留一个空格,
且返回值和方法名的第一个字母之间不要留空格。
-(void)doSomethingWithName:(NSString *)name
                      rect:(CGRect)rect;

- 注释一般放在.h,.m文件尽量减少注释
单行的用//+空格开头,多行的采用/* */注释
//TODO:  用来注释没有完成的功能
#warning 用来标记自己的debug修改,以免遗漏

哪里需要注释:
1. 在某个变量、属性、或者方法不能够直接从名字得知其用途时。 
2. 区分代码区时(在常量文件和控制器类的.h文件和.m文件里)。 
3. 在不相关的业务处理交叉点。
4. 文件的基本信息
5. 有疑惑的地方(FIXME)
6. 未完成或者待优化的地方。(#waring //TODO:) 
7. 声明枚举时应该对每个值说明。
8. 修改别人代码的时候。
9. 编写API时,一般需要对所有的接口和属性带上注释
注释需要注意:
1. 不要为了注释而注释,请只在关键点注释
2. 划分代码块最好的方式不一定是注释,有时候使用空行也可以达到很好的效果。

-  初始化
在初始化方法中,不要将变量初始化为“0”或“nil”,那是多余的,
 内存中所有的新创建的对象(isa除外)都是0,所以不需要重复初始化 为 “0”或“nil”;
对nil的检查
仅在有业务逻辑需求时检查nil,而非为了防止崩溃。

- 组件的创建,应该使用代码块或者懒加载的方式(我习惯用代码块)

- 建议项目统一使用Masonry的方式布局。不允许出现直接设置frame的情况。
xib的使用,尽量减少拉约束的情况
  • controller代码结构
#pragma mark lifeCycle

- (instancetype)init {}
- (void)viewDidLoad {}
- (void)viewWillAppear:(BOOL)animated {}
- (void)dealloc {}
- (void)didReceiveMemoryWarning {}

#pragma mark public-method

#pragma mark private-method

#pragma mark event-response

#pragma mark - Protocol conformance
#pragma mark - UITextFieldDelegate
#pragma mark - UITableViewDataSource
#pragma mark - UITableViewDelegate

#pragma mark set/get
- (NSMutableArray *)dataSectionArr{}
  • 排版格式
- 尽量使用.语法
应该:array.count      
不应该:[array count]

多使用黄金路径
- (void)someMethod {
    if(error) {
        return;
    }
    doSomething
}

而不是:
- (void)someMethod {
    if(!error) {
        doSomething
    }
}

多使用三目运算符:
result = a > b ? x : y;

三、git版本控制
1、分支管理
  • 只允许从dev分支拉出新的分支
  • 其他分支只和dev分支做合并
  • 提交代码时,确保本地build success
  • 项目测试结束之后,即定档之后,才合并到master分支
  • 项目提测需要打tag
2、项目内环境配置(APPInfo管理)

三种项目渠道,主要是为了在统计和crash收集时作区分,以便更好地定位

  • fir:即平时我们打包到fir的环境,测试证书,release环境
  • beta:testflight版本,正式证书,release环境
  • appstore:testflight版本,正式证书,release环境

APPIsDev():当且仅当域名为"ifreeapi.ifreegroup.co"返回false

其他

1、尽量减少IO的操作,优先使用内存保存
不要出现存储传值的情况
2、数据量较大的操作,放到子线程处理
3、数据处理从代码中抽离出来,我一般的习惯是一个控制器一个server,数据处理放到server中
4、如何封装代码??

分享总结

MOGO项目中亟需解决的问题:
1、类名命名,添加前缀 "FB"+"模块名"
2、减少不必要的注释,命名尽量见名知意
3、xib使用限制:不建议使用,或者只在简单的静态view使用
4、frame使用限制:优先使用autolayout,禁止类似frame.size.width这样的更新布局的做法
5、项目文件夹的规范
6、数据转model的规范(从data层开始转换)

有争议的点:
1、frame的使用场景
2、注释的场景

需要完善的点:
1、代码封装
2、数据统一管理

下次分享:
日期:8.23
分享者:浩滨
主题:蓝牙的原理及在iOS的使用

你可能感兴趣的:(Mogo iOS代码规范)