zoukankan      html  css  js  c++  java
  • iOS团队代码规范

    iOS团队代码规范

    工程之始可能需要的工具:

    1、使用CocoaPods类库管理工具。CocoaPods安装和使用教程。

    2、下载安装注释插件VVDocumenter-Xcode

    一、项目结构管理

    1、建立Resouces文件夹,将所有图片,语音,视频等资源放入其中。图片资源以程序功能模块建立相应的实体文件夹进行管理,若多个功能块共用的,建立Common文件夹,放入其中。

    2、所有需手动拖入工程中的第三方库应放入ThirdLibs文件夹中,使用CocoaPods类库管理工具的无须此操作。

    
3、建立Utilities文件夹,将封装的工具类放入其中。

    
4、建立CatororyExs文件夹,将类别及类扩展放入以类名命名的文件夹中。

    
5、建立Constants.h头文件,所有的常量定义于其中。Constants.h文件放入Main文件组里面。

    
6、每个功能模块放入一个Group。用Xcode创建的Group是虚拟的文件夹,为了便于维护,应创建物理文件夹,然后再手动引入。

    二、命名规范

    关于命名的一般性的原则

    1.最少字符,就是要尽量的减少命名对象的长度,尽量选择字符少的名词
    2.名符其实,命名应该能直观的描述被命名对象是什么或者做什么
    3.避免歧义,尽量不要采用多义词,也不要使用命名组合之后产生多义的方式
    4.上下文一致,比如谓词的统一性,如果都是集合类,那么使用Remove表示删除操作,那么所有上下文就应该都用这个Remove,而不要再用Delete
    5.少用缩写,除非是很常见的缩写或者项目中定义好的缩写,否则不要使用缩写
    6.优先使用全局常量而非宏,应使用static方式声明常量;

    类命名

    1、首字母大写,之后每个单词首字母都大写。

    2、使用能够反映类功能的名词短语。

    3、文件名应包含描述继承的类,如:文件名:BaseViewController   类:UIViewController

    所有类名,接口名(Protocol)均以大写字母开头,多单词组合时,后面的单词首写字母大写。

    如:@interface LoginViewCotroller : UIViewController
    
    View--所有扩展自UIView的类以View结尾,如: GridView,StarView,OpenGLView,EmojiPageView。
    ViewController-所有扩展自UIViewController的类以ViewController结尾,
    Model--所有数据Model以Model结尾
    
    如 HomePageViewControler, LoginViewController。
    如果名称太长则以VC结尾:如 AllPicturePreviewVC
    


    4、自定义控件命名,以相应类名为后缀命名。
    对于UI相关的变量,命名时要后缀以特定的控件名,如UILabel的变量命名为xxxLabel,xxxCell,其他的如xxxButton,xxxTableView,xxxImageView等;

    特殊类命名

    举例:BaseClient、ImageStore


    分类(类别)命名

    与类命名相同,此外需添加要扩展的类名和“+”
    举例:NSString+URLEncoding

    协议(委托)命名

    与类命名相同,此外需添加“Delegate”后缀
    举例:UITableViewDelegate,MBProgressHUDDelegate

    方法及参数命名

    方法:

    首字母小写,之后每个单词首字母都大写
    方法名使用动词短语,能具体表达出该方法的功能

    参数:

    首字母小写,之后每个单词首字母都大写
    具有足够的说明性

    举例:

    - (void)viewWillAppear:(BOOL)animated
    - (void)setupPostValue:(int)value
    - (void)adjustFontWithMaxSize:(CGSize)maxSize
    


    参数要用描述该参数的标签命名

    - (void) sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;  //对
    - (void) sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;               //错
    


    ▪ 当参数过长时,每个参数占用一行,以冒号对齐。如:

    -(void)saveUserInfo:(NSMutableDictionary *)dict
               userName:(NSString *)name
               passWord:(NSString *)pwd{
        ...
    }
    

    getset 开头的方法有特殊的意义,不要随意定义。

    1. set 是属性默认的设置方法,如果函数不是为了设置类成员,则不要用 set 开头,可用 setup 替代。
    2. get 和属性方法无关,但在 Cocoa 中,其标准行为是通过引用传值,而不是直接返回结果的。欲获取变量,直接以变量名为名,如:userInfomation,而不是 getUserInfomation


    5、属性和变量

    数据成员保持最小公开原则。
    在需要公开一个数据成员时将其声明为属性,反之声明为实例变量。
    在不需要改变一个属性时,添加@readonly,需要时添加@readwrite。
    属性采用Camel命名方式。
    实例变量的命名方式同属性,不过首尾都加下划线,加尾部下划线可区分属性对应的实例变量。
    局部变量的命名方式同属性,禁用下划线。
    定义NSString时,如果不是明确的想要引用,则应该添加@copy,大多数情况下我们是把NSString当成值类型使用的。
    @public,@protected,@private缩进一个空格。
    如果为BOOL属性的名称最好以“is”开头。

    三、编码规范

    1、导入.h文件可使用
    #import xxxxxxxx ,需要的时候可以加@class xxxxxxxx

    2、代码模块划分及标注

    类中单个个功能模块以 #pragma mark - (功能描述) 分隔。与方法相隔一空行,如:

    - (void)method1
    {
        // code...
    }
    
    #pragma mark - xxxx
    
    - (void)method2
    {
        // code...
    }
    

    方法与方法之间应相隔一空行,“///”注释插件描述方法的具体功能,如:

    - (void)method1
    {
        // code...
    }
    
    /**
     *  function
     */
    - (void)method2
    {
        // code...
    }
    

    3、对象初始化的书写。如:

    // 应该这样书写
    UILabel *label = [[UILabel alloc] init]; 
    
    而不是
    UILabel *label=[[UILabel alloc]init];
    UILabel *label = [[UILabel  alloc] init ];
    UILabel*label=[[UILabel alloc]init];
    。。。

     4、有oc对象初始化的地方应空一行,若有需要应给相应对象加//注释描述。如:

    - (void)method1
    {
    // 标题 UILabel *titleLabel = [[UILabel alloc] init]; label.text = @"title"; NSString *string = [[NSString alloc] init]; }

    5、格式问题
    指针*与前面的数据类型留1个空格,紧贴后面的变量名;

    例如:
    NSString *password;
    
    而不是
    NSString* password;
    
    或者
    NSString * password;
    

    与运算符之间的空格,如:

    for (int i = 0; i < 5; i++) 
    {
            // code...
    }

    注释问题
    在需要的时候,注释可对代码做必要的解释。应保证每个变量每个重要的函数有注释,更新代码时一定要更新注释,防止对代码造成误解。

     

    四、其他

    性能优化
    用  DLOG(<#...#>)代替 NSLog(...)

    关于布尔值

    1,不要用if(obj==nil){},而用if(!obj){}

    2,比较时把常量放前面可以避免错误

    不要用if(aIntValue==255){},而用if(255==aIntValue){},避免漏掉一个“=”,而变成赋值

    3,不要用if(aBool==YES){},直接用if(aBool){}或if(!!aBool){}

    空指针nil传值问题
    在创建NSString,NSDictionary,NSArray和NSNumber等对象实例时,应使用Literals字面量。需要注意的是,不应将nil传给NSArray和NSDictionary字面量,否则会引起程序崩溃。

    例如:
    NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve"];
    NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal"};
    NSNumber *shouldUseLiterals = @YES;
    NSNumber *buildingZIPCode = @10018;
    
    而不是
    NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", nil];
    NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys:@"Kate", @"iPhone", @"Kamal", @"iPad", nil];
    NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];
    NSNumber *buildingZIPCode = [NSNumber numberWithInteger:10018];
    

     
    其他规范
    避免相同的代码段在多个地方出现,尽量编写可复用的代码。
    语句嵌套层次不得超过3层,对性能等消耗大。
    每个实现文件建议在500行以内,不能超过1000行,超过之后应考虑通过抽象类对代码进行重构。
    及时删除或注释掉无用的代码。
    UITableViewCell里面的network client都要委托出来。
    控件布局使用相对坐标。
    确定不使用的代码应该删除。

    参考规范文档:
     
     
     
     
    作者:SIBU iOS DEV
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    发现程序bug思路
    streambase log(log4j和logback)
    streambase service 变为 window service启动
    机器学习-chapter1机器学习的生态系统
    eoe推荐的优秀博客
    Android Service 服务(一)—— Service .
    android startActivityForResult(Intent intent, int requestCode) 整理与总结! .
    Android Intent详解
    隐式Intent实例
    Android中的距离单位
  • 原文地址:https://www.cnblogs.com/sixindev/p/4398941.html
Copyright © 2011-2022 走看看