规范文档

2019-11-22  本文已影响0人  宙斯YY

1.命名规范
2.注释规范
3.代码规范
4.目录规范

1.命名规范

通用规范
通用规范是在整个项目中,所有的命名都需要遵循的规范
清晰
所有的命名要清晰且简洁,以清晰为主。要做到见名知意。命名最好以英文为主,除专有名词外,不许使用单词缩写。严禁使用中文或拼音以及拼音与英文混合的方式。

//个人中心页面
正例:PersonnalCenterViewController
反例:gerenzhongxinViewController

驼峰原则
分为大驼峰和小驼峰,每个类型需要遵循大驼峰或小驼峰中的一种
大驼峰:首字母大写。
小驼峰:首字母小写

大驼峰:PersonnalCenterViewController
小驼峰:personalCenterName

1.0文件夹命名规范

文件夹名需要遵循大驼峰原则,文件命名需要与模块的功能相对应。

1.1变量命名规范

1.2类命名规范

类名需要遵循大驼峰原则。类名最好加上模块的前缀缩写,如PersonalCenter+类名或者(首字母简写)PC+类名。当需要在其他项目使用的类,可以不加或添加规定的统一前缀。

个人中心模块:PersonalCenter
文件名:PersonalCenter
类名:PersonnalCenterMainViewController 或者 PCMainViewController

1.3方法命名规范

方法名的命名需要遵循小驼峰原则。规范的方法名应该看起来像一个完整的句子。尽量做到读方法名便可以知道函数的作用。

//跳转到淘宝详情详情页面
-(void)pushToTaoBaoDetailViewController:(id)data;

1.4Delegate和Block命名规范

需要遵从大驼峰原则,且开始必须要遵循当前代理对象 + Delegate的命名规范。例如:LoginViewDelegate,LoginViewBlock

1.5常量命名规范

常量名规范分为3种:

static const NSTimeInterval kAnimationDuration = 0.3; 
#define SCREEN_WIDTH    ([[UIScreen mainScreen] bounds].size.width) 
//.h
extern const NSTimeInterval EOCViewClassAnimationDuration; 
//.m
const NSTimeInterval EOCViewClassAnimationDuration = 0.3; 
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空行规范

3.2删除多余的方法

3.3删除未被使用的资源文件

3.4添加必要的注释

3.5格式规范

NSString *userName;
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index; 
!bValue 
fLength = fWidth * 2;   
- (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; 
//推荐
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 (int index = 0; index < 10; index++){ 
   ... 
   logicToChange(index) 
}  

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 (condition1) { 
  ... 
  if (condition2) { 
    break; 
  } 
}  
//等价于
while (condition1 && !condition2) { 
... 
}  

3.8 switch

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封装思想

4.目录规范

4.1通用目录

4.2模块目录

上一篇 下一篇

猜你喜欢

热点阅读