美文网首页
规范文档

规范文档

作者: 宙斯YY | 来源:发表于2019-11-22 09:54 被阅读0次

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)

相关文章

  • 来学习了解下Flutter及Dart 编码规范?

    dart官方文档中的 【Effective Dart】 规范主要分为四个部分: 样式规范 文档规范 使用规范 设计...

  • 来学习了解下Flutter及Dart 编码规范?

    dart官方文档中的 【Effective Dart】 规范主要分为四个部分: 样式规范 文档规范 使用规范 设计...

  • 文档规范

    文档不注重形式,重点在于可以清晰表达自己的意思,想别人展示清晰的表达, 分为两步 先思考(总分总),再表达(总分)...

  • 学习Flutter,你需要了解的Dart编码规范

    本文来自dart官方文档中的 【Effective Dart】 规范主要分为四个部分: 样式规范 文档规范 使用规...

  • Swift开发代码规范

    Swift开发规范 此文档与Apple官方Swift代码规范文档不冲突,只是在官方文档的基础上增加了的部分规范。 ...

  • promise实现

    Promises/A+规范文档Promises/A+规范文档中文翻译 Promise标准: 拥有一个then方法 ...

  • 微信小程序开发规范文档

    石墨文档:微信小程序开发规范文档

  • Web前端工程化

    规范化 工程结构规范 编码格式规范 前后端接口规范 文档书写规范 Git分支管理规范 Commit描述规范 交互设...

  • 文档撰写规范

    一、命名规范 1. 文件命名规范 项目命名词(或项目编号)_文件命名词_日期_V版本号.文件后缀 项目_文件描述_...

  • 需求文档规范

    本文章转载于搜狗测试 引言 流程和规范,是控制软件质量不可或缺的一种手段。在现在复杂的软件开发流程中,任何一个环节...

网友评论

      本文标题:规范文档

      本文链接:https://www.haomeiwen.com/subject/akjfwctx.html