iOS团队代码规范
阅读原文时间:2023年07月13日阅读:3

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都要委托出来。
控件布局使用相对坐标。
确定不使用的代码应该删除。

参考规范文档:

https://github.com/troyharris/Complete-iOS-StyleGuide