Version:1.0.0
Objective-C工程及代码规范
一、工程总述
1.工程名称为英文
工程名称必须为英文,不能使用中文、特殊符号、其他语言,不推荐使用汉语拼音、阿拉伯数字、下划线(特殊情况除外:客户特别要求的情况、使用英文过于繁琐的情况、工程名存在版本号的情况)。
2.上传SVN服务器要求
上传到SVN服务器之前要新建一个文件夹,并将工程文件夹放入到新建的文件夹中。上传到SVN服务器时,应当把新建的文件夹上传而非工程文件夹。
例如:
图1.1上传工程到SVN服务示例
图1.1中当需要上传testForStandard这个工程到SVN服务器时,需要将工程的根目录testForStandard单独放在一个新的文件夹testForStandardsvn中,将testForStandardsvn上传到SVN服务器。
图1.2文件压缩示例
当从svn上单独下载某一个工程后,如需压缩源码,只需要将工程文件夹压缩,而不要将与工程文件夹平行的.svn文件夹一起压缩。如图1.2所示(显示Mac隐藏文件的命令:defaults write com.apple.finder
AppleShowAllFiles YES隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles NO)
二、工程目录规范
1.目录总述
1)所有文件夹为真实文件夹
所有新创建的目录必须为真实文件夹(即在Finder中创建,而非在Xcode工程中直接New Group)。
2)文件夹需要彻底删除
当在Xcode中删除某一个文件夹以及文件夹中的文件时,必须要在Finder中将残留的空文件夹删除。防止出现文件夹重名和文件夹残留。
2.目录要求
1)总体要求(举例)
图2.1工程主目录示例
在工程根目录中需要存在Class、Image、Libs、Share这几个文件夹。.h和.pch文件需要放在AppDelegate文件的下边。工程自动生成的文件不需要改变位置。
2)class文件夹要求
图2.2 class目录示例
建议在class下面存在两层子模块。在最子模块中进行model、view、controller分类,如有必要可以添加一个other目录。
3)image、Libs、目录要求
image目录中存放图片,每个模块添加一个子文件件进行分类。
Libs目录中只能存放文件夹,不允许存放单独文件,为后续维护提供便利,另外,所有第三方之间不能横向耦合(除几个最常用的外),即A第三引用B第三方的东西,如有相互引用,需要进行解耦。
4)share目录要求
图2.3 share目录示例
只允许存在文件夹。几乎所有的公共类或者模块都需要放在该目录中。如有必要可以在某个子目录中进行mvc的划分。
三、命名规范
1.类命名要求
①所有类名使用JY开头(个人封装除外)。
②除非万不得已或者客户要求的情况下,使用英文命名。
③除了非常常见且比较长的单词之外,不得使用英文缩写。
④杜绝使用纯粹的first、second这类单词命名。
⑤尽可能不适用myCell、myView这种模式。
⑥model以及model的子类应当以Model结尾
⑦UIViewController及其子类应当以ViewController结尾
⑧UITableViewCell及其子类应当以Cell结尾
⑨封装的view及其封装的子类应当以View结尾
2.宏定义命名要求
1)接口
所有接口必须以URL_开头
网络请求的域名需要使用宏定义,宏名称为URL_REQUEST。这里的域名不包括任何参数,所有参数都进行单独拼接。例如:
#define URL_REQUEST @”http://www.baidu.com”
如有图片的相对路径需要进行拼接,需要将拼接的公共部分进行宏定义,宏名为URL_IMAGE。例如:
#define URL_IMAGE @”http://www.baidu.com/image”
如有必要可以单独添加其他公共接口。
2)Key
将所有的与整个app相关的key和秘钥都进行宏定义。所有的key的定义必须以KEY_开头。例如:
#define KEY_RONGCLOUD @”xxxxxxxxx”
#define KEY_BAIDUMAP @”xxxxxxxxx”
#define KEY_UMENG @”xxxxxxxxx”
3)颜色
app中公共使用或者多处使用到颜色需要使用宏定义。例如:
#define RGBA(r,g,b,a) [UIColor colorWithRed:r/255.0f green:g/255.0fblue:b/255.0f alpha:a]
#define colorOfNav xxxxxx
#define colorOfTabBar xxxxxx
4)版本判定
可以根据需要定义版本
5)UI界面尺寸
#define HOfScreen [UIScreen mainScreen].bounds.size.height
#define WOfScreen [UIScreen mainScreen].bounds.size.width
#define HOfNavBar self.navigationController.navigationBar.frame.size.height
#define HOfTabBar self.tabBarController.tabBar.frame.size.height
6)其他常量的宏定义
建议使用extern和const修饰的常量替代宏定义。
3.变量命名要求
①变量名必须有意义。
②全局变量必须以_开头。
③全局变量和属性名称建议使用控件名的缩写和功能的组合。例如:
@property (nonatomic, strong)UILabel *lbTitle;
UILabel *_lbTitle;
@property (nonatomic, strong)UIButton *btnSubmit;
UIButton *_btnSubmit
@property (nonatomic, strong)UIImageView *imgvPortrait;
UIImageView *_imgvPortrait;
@property (nonatomic, strong)UITextField *tfUserName;
UITextField *_tfUserNamel;
@property (nonatomic, strong)UITextView *tvDetail;
UITextView *_tvDetail;
④对于一些特殊类型的变量,命名时要带上类型,如NSArray的变量命名为xxxArray,其他的如xxxDictionary,xxxSize等。这样就可以从名称上知道是什么类型的变量。千万不能将NSArray的变量命名为xxxDictionary。(这里的类型的单词可以适当缩写)
4.方法命名要求
①所有方法使用英文名,遵守驼峰命名规则。开头小写。
②所有方法名必须有实际意义。
5.图片命名要求
图3.1美工图片命名
图片命名基本按照图3.1规则来。使用缩写和下划线组合。必须在文件名后加上合适的后缀(@2x、@3x)。
四、代码实现要求
1.总体规划
尽可能少的将变量函数做为共有的。
对网络请求需要进行进一步的高度封装,达到只需要执行一个方法就能够实现网络请求的发送,可以基于代理也可以基于block,建议使用block。
用户信息需要在一个单例中存储便于读取。如果有必要需要将用户信息存储到本地,并且在每次程序运行时讲本地存储的用户信息以及其他相关数据读取到单例中,在需要时从单例中读取。
视图中小控件集中分布的或者相对于其他控件是独立的模块的区域建议进行单独封装,便于管理和查找。
2.用于给多人使用的公有方法的声明
/**
*POST请求
*@param urlString请求网址
*@param parameters请求参数
*@param tag请求的标识
*@param stop是否停止其他请求队列
*@param serializer是否取消自动解析
*@param success请求成功回调方法
*@param failure请求失败回调方法
*/
- (void)POST_withUrlString:(NSString *)urlString
parameters:(id)parameters
stopOtherRequest:(BOOL)stop
withSerializer:(BOOL)serializer
success:(void(^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError*error))failure;
3.类中方法的实现的分类
每个类的.m文件都需要对文件内所有的方法进行合理的分类,并将每一类方法使用#param mark – xxxxxx分割。示例分类:
准备:一些数据的初始化(包括属性和全局变量)
UI创建和初始化:UI视图的第一次创建和初始化配置
UI逻辑:视图的现实隐藏操作、视图的大小变化、视图的offset或者其他视图逻辑
事件处理方法:一些button的各种事件的处理方法、各种手势的处理方法
回调方法:代理方法,非主动调用的方法,建议再对回调方法根据协议或者作用使用#param mark xxxx分割。例如:tableview的所有方法都写在#param mark tableViewDelegate的下边。
五、代码细节要求
1.除常见方法外都需要写注释说明方法的作用,有返回值的需要说明返回值的作用。
2.写方法时当参数过长、过多时,每个参数占用一行,以冒号对齐。如:
- (void)writeFisrtNumber:(NSString *)firstStr
withNextNumber:(NSString *)nextStr
withLastNumber:(NSString *)lastStr
{}
如果方法名比参数名短,每个参数占用一行,至少缩进4个字符,且为垂直对齐(而非使用冒号
对齐)。如:
//实际上是对齐的,copy过来后有些变形
- (void)writeA:(NSString *)firstStr
withBBBBBBBBBBB:(NSString *)nextStr
withCCCCCC:(NSString *)lastStr
{}
3.Model基类需要命名为LXBaseModel,在这个类中需要实现防止键值不匹配的方法
4.用户信息的存储:
使用单例进行存储。单例名称统一为LXSingleInfo,单例的获取方法名为shareInfo。使用GCD写单例获取方法。
5.协议的遵守建议在.m文件中遵守。非公开属性建议在.m文件中声明。
6.通知需要注销。如有必要将delegate置nil。防止通知错乱和野指针错误出现。
7.代码中多次出现的常量建议使用宏定义或者定义成const修饰的常量。便于多处一起修改。
8.长字符串(超过10行)的打印测试过之后建议注释掉。解决因打印引起的运行速度慢问题。