规范文档
2019-11-22 本文已影响0人
宙斯YY
1.命名规范
2.注释规范
3.代码规范
4.目录规范
1.命名规范
通用规范
通用规范是在整个项目中,所有的命名都需要遵循的规范
清晰
所有的命名要清晰且简洁,以清晰为主。要做到见名知意。命名最好以英文为主,除专有名词外,不许使用单词缩写。严禁使用中文或拼音以及拼音与英文混合的方式。
//个人中心页面
正例:PersonnalCenterViewController
反例:gerenzhongxinViewController
驼峰原则
分为大驼峰和小驼峰,每个类型需要遵循大驼峰或小驼峰中的一种
大驼峰:首字母大写。
小驼峰:首字母小写
大驼峰:PersonnalCenterViewController
小驼峰:personalCenterName
1.0文件夹命名规范
文件夹名需要遵循大驼峰原则,文件命名需要与模块的功能相对应。
1.1变量命名规范
- 私有变量 .m 文件中声明 _somePrivateVariable
- property变量 .h.m文件中声明 somePrivateVariable
1.2类命名规范
类名需要遵循大驼峰原则。类名最好加上模块的前缀缩写,如PersonalCenter+类名或者(首字母简写)PC+类名。当需要在其他项目使用的类,可以不加或添加规定的统一前缀。
个人中心模块:PersonalCenter
文件名:PersonalCenter
类名:PersonnalCenterMainViewController 或者 PCMainViewController
1.3方法命名规范
方法名的命名需要遵循小驼峰原则。规范的方法名应该看起来像一个完整的句子。尽量做到读方法名便可以知道函数的作用。
//跳转到淘宝详情详情页面
-(void)pushToTaoBaoDetailViewController:(id)data;
1.4Delegate和Block命名规范
需要遵从大驼峰原则,且开始必须要遵循当前代理对象 + Delegate的命名规范。例如:LoginViewDelegate,LoginViewBlock
1.5常量命名规范
常量名规范分为3种:
- 1、局部类型常量 :需要遵循小驼峰原则。
static const NSTimeInterval kAnimationDuration = 0.3;
- 2、宏定义:需要全大写。
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
- 3、外部可见类型常量
//.h
extern const NSTimeInterval EOCViewClassAnimationDuration;
//.m
const NSTimeInterval EOCViewClassAnimationDuration = 0.3;
- 4、枚举:需要遵循前缀 + 大驼峰的命名方式。
Enum中枚举内容的命名需要以该Enum类型名称开头
NS_ENUM定义通用枚举,NS_OPTIONS定义位移枚举
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
};
typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
UISwipeGestureRecognizerDirectionNone = 0, //值为0
UISwipeGestureRecognizerDirectionRight = 1 << 0, //值为2的0次方
UISwipeGestureRecognizerDirectionLeft = 1 << 1, //值为2的1次方
UISwipeGestureRecognizerDirectionUp = 1 << 2, //值为2的2次方
UISwipeGestureRecognizerDirectionDown = 1 << 3 //值为2的3次方
};
1.5图片命名
UI版本号+图片命名 例如:V1.5_loginButton
或者
模块+图片命名 例如:Login_weixinButton
2.注释规范
2.1公共属性方法
.h文件中,所有的属性和方法的注释:command + Option + /
/// 路由URL
@property(nonatomic,copy)NSString * ttg_url;
WX20191122-105025.png
/// URL跳转页面
/// @param routerUrl TTG开头的URL
-(void)pushToRouterView:(NSString*)routerUrl;
方法上点击Option
WX20191122-105356.png
2.2私有属性方法
.m中的,所有属性在结尾处使用// 注释进行注释。
@property(nonatomic, strong) StoreContainerModel * tbmodel; // 淘宝模块数据模型
函数和方法最好用序号+有意义的解释语言注释。单行的用//+空格开头,多行的采用/* */注释
-(void)saveSearchKeyandPush:(NSString*)keyStr
{
//1.保存搜索关键词到手机外存
StoreSearchHotList * list=(StoreSearchHotList*)[JSXLocalStorageTool getInfo:StoreSearchHotList.class];
if(list==nil)
{
NSMutableArray * history=[NSMutableArray array];
[history addObject:keyStr];
list=[[StoreSearchHotList alloc]init];
list.histories=history;
}else
{
if(![list.histories containsObject:keyStr])
{
[list.histories addObject:keyStr];
}
}
[JSXLocalStorageTool saveInfo:list];
//2.跳转到对应的搜索模块(TB,PDD,JD)
[self pushToSubjectViewController:keyStr andSearchType:self.seachType andTypeId:@""];
}
2.3代码组织
.m文件中尽量使用#pragma mark -进行方法分组。
WX20191122-110537.png
3代码规范
3.1空行规范
- 所有方法与方法之间空1行
- 所有独立逻辑的代码块之间空1行
3.2删除多余的方法
- 如果方法没有使用到,请删除它
- 如果方法没有执行任何业务逻辑,请删除它或者给出一定注释
3.3删除未被使用的资源文件
3.4添加必要的注释
- 所有 .h 文件中的property 需要给出注释
- 所有自定义的方法需要给出注释
- 比较大的代码块需要给出注释
- 所有代码中出现的阿拉伯数字需要给出注释
- 程序中出现加密/解密 逻辑的操作地方,需要给出注释说明过程(无论是系统还是自定义)
3.5格式规范
- 指针*位置
NSString *userName;
- 方法的声明和定义
在 - 、+和 返回值之间留一个空格,方法名和第一个参数之间不留空格
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
- 一元运算符与变量之间没有空格、二元运算符与变量之间必须有空格
!bValue
fLength = fWidth * 2;
- 大括号写法
对于类的方法:左括号另起一行写
对于其他使用场景(if,for,while,switch等): 左括号跟在第一行后边
- (void)sampleMethod
{
BOOL someCondition = YES;
if(someCondition) {
// do something here
}
}
3.6 if
- 逻辑尽可能的覆盖所有情况
if(type==0)
{
//逻辑处理
}else if(type==1)
{
//逻辑处理
}else
{
//异常逻辑处理
}
- 不要使用过多的分支
//推荐
if (!user.UserName) return NO;
if (!user.Password) return NO;
if (!user.Email) return NO;
return YES;
//不推荐
BOOL isValid = NO;
if (user.UserName)
{
if (user.Password)
{
if (user.Email) isValid = YES;
}
}
return isValid;
- 条件过多,过长的时候应该换行。条件表达式如果很长,则需要将他们提取出来赋给一个BOOL值,或者抽取出一个方法
//推荐
if (condition1 &&
condition2 &&
condition3 &&
condition4) {
// Do something
}
BOOL finalCondition = condition1 && condition2 && condition3 && condition4
if (finalCondition) {
// Do something
}
//不推荐
if (condition1 && condition2 && condition3 && condition4) {
// Do something
}
3.7 for
- 不可在for循环内修改循环变量,防止for循环失去控制。
for (int index = 0; index < 10; index++){
...
logicToChange(index)
}
- 避免使用continue和break。
var filteredProducts = Array()
for level in products {
if level.hasPrefix("bad") {
continue
}
filteredProducts.append(level)
}
//等价于
for level in products {
if !level.hasPrefix("bad") {
filteredProducts.append(level)
}
}
- 在while里的break其实就相当于“不存在”,既然是不存在的东西就完全可以在最开始的条件语句中将其排除
while (condition1) {
...
if (condition2) {
break;
}
}
//等价于
while (condition1 && !condition2) {
...
}
3.8 switch
- 使用枚举类型时,不能有default分支, 除了使用枚举类型以外,都必须有default分支。
RWTLeftMenuTopItemType menuType = RWTLeftMenuTopItemMain;
switch (menuType) {
case RWTLeftMenuTopItemMain: {
// ...
break;
}
case RWTLeftMenuTopItemShows: {
// ...
break;
}
case RWTLeftMenuTopItemSchedule: {
// ...
break;
}
}
3.9 函数
- 一个函数只做一件事(单一原则)
//推荐
dataConfiguration()
viewConfiguration()
//不推荐
void dataConfiguration()
{
...
viewConfiguration()
}
- 对于有返回值的函数(方法),每一个分支都必须有返回值
int function()
{
if(condition1){
return count1
}else if(condition2){
return count2
}else{
return defaultCount
}
}
- 对输入参数的正确性和有效性进行检查,参数错误立即返回
void function(param1,param2)
{
if(param1 is unavailable){
return;
}
if(param2 is unavailable){
return;
}
//Do some right thing
}
3.10数据越界的地方添加判断
if(indexPath.row<dataSource.count)
{
id data=dataSource[indexPath.row];
}
3.11空数据处理,Json数据以及结构异常,异常数据类型转换等场景下的处理。
3.12封装思想
- 同一个文件的中有重复代码(3行以上),尽量封装成一个方法。
- 不同文件中有重复代码,根据代码用途封装到基类,分类,工具类或者抽成独立模块。
4.目录规范
4.1通用目录
- 第三方库可以使用cocosPods进行管理,不支持cocosPods放到Sdks/Vendors文件夹分类管理。
- 静态图片使用Assets.xcassets进行管理,动态图片或者音视频,字体库放到Resources资源文件夹管理。
- 整个项目文件夹按照功能模块进行划分,子模块使用子文件夹的方式进行管理。
- Categorys:分类文件
- Tools/Utils:工具类文件
- NetWorks(HttpTools,SocketsTools) 网络相关
- Encryptions 加密相关
- Routers:路由类相关
- Caches:缓存类相关
- Bases:基类相关
- SystemAuthority:系统权限相关(拍照,通知,定位...)
- Animations:动画相关
- Hooks:Hooks相关
...
4.2模块目录
- Models:模型类文件
- Controllers:控制器类文件
- Views:视图页面类文件
- ViewModels:视图模型类文件(MVVM)
- Presenters:业务逻辑类文件(MVP)