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{
...
}
以 get、set 开头的方法有特殊的意义,不要随意定义。
- set 是属性默认的设置方法,如果函数不是为了设置类成员,则不要用
set开头,可用setup替代。 - 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都要委托出来。
控件布局使用相对坐标。
确定不使用的代码应该删除。
iOS团队代码规范的更多相关文章
- 中小型前端团队代码规范工程化最佳实践 - ESLint
前言 There are a thousand Hamlets in a thousand people's eyes. 一千个程序员,就有一千种代码风格.在前端开发中,有几个至今还在争论的代码风格差 ...
- IOS开发-代码规范
代码风格的重要性对于一个团队和项目来说不言而喻.网上有许多 Objective-C 的代码风格,但这份简洁而又最符合苹果的规范,同时有助于养成良好的代码习惯,也是我们团队一直遵循的代码风格. 写法没有 ...
- 腾讯Alloy团队代码规范
概述 我个人很看重代码规范,因为代码是写给别人看的,按规范写别人才更容易理解.之前苦于没有代码规范的资料,现在在github上面看到了腾讯Alloy团队的代码规范,于是学习了一下,并记录下我自己还没怎 ...
- iOS开发代码规范(通用)
1. 关于命名 1> 统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称,不适用缩写 2> 类的命名 大驼峰式命名:每个单词的首字母都采用大写字母 例子:M ...
- iOS开发代码规范
1.关于命名 1.1统一要求 含义清楚, 尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称不使用缩写 1.2类的命名 大驼峰式命名:每一个单词的首字母都采用大写字母例子: MFHomeP ...
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- 构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范
工程结构架构,减少耦合混乱以及防治需求大改造成结构重构,如何构建稳定可扩展可变换的工程结构的思考 我打算采用Information flow的方式自上而下,两大层分为基础层和展现层的结构.基础层分为多 ...
- (转)ios 代码规范
转自http://blog.csdn.net/pjk1129/article/details/45146955 引子 在看下面之前,大家自我检测一下自己写的代码是否规范,代码风格是否过于迥异阅读困难? ...
- 【转】iOS代码规范
原文地址: http://www.cocoachina.com/ios/20150908/13335.html 简介: 本 文整理自Apple文档<Coding Guidelines for C ...
随机推荐
- .net core集成使用consul
快速启动一个consul集群可以参考:使用docker快速部署一个consul集群 .net core集成使用consul是通过consul提供出来api接口来实现的,可以分成两个部分来说明:配置集成 ...
- WPF 使用 Silk.NET 进行 DirectX 渲染入门
本文告诉大家如何使用 dotnet 基金会新开源的 Silk.NET 库调用 DirectX 进行渲染的方法.此库是对 DirectX 的底层基础封装,用上了 dotnet 和 C# 的各个新特性,相 ...
- nginx配置指定域名访问,nginx禁止ip访问,配置空主机头 syscal
1.大家有过这方面的困扰,就是自己的网站给其他人恶意域名解析到自己的服务器ip上. 特别不爽,那大家可以用用空主机头的方法. 先给大家看下我的nginx.conf配置 http { log_forma ...
- c#多进程通讯,今天,它来了
引言 在c#中,可能大多数人针对于多线程之间的通讯,是熟能生巧,对于AsyncLocal 和ThreadLocal以及各个静态类中支持线程之间传递的GetData和SetData方法都是信手拈来,那多 ...
- icmpsh之icmp反弹shell
一,技术原理 向ping www.baidu.com时,本机会先向百度的服务器发送ICMP请求包,如果请求成功了,则百度服务器会回应ICMP的响应包 引用百度百科: ICMP(Internet Con ...
- flume安装及使用
最近在学习hadoop大数据平台,但是却感觉无从下手,于是看了一些专业的书籍,觉得还是先从下往上为学习也就是从源数据--数据抽取--存储--计算--展示这个路线来学习比较容易一些,所以就先从非结构化数 ...
- linux 安装mysql 可能遇到的小问题
问题一. ./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No ...
- Java将引入新的对象类型来解决内存利用问题
2022年Java将有什么新的特性和改进,我相信很多Java开发者都想知道.结合Java语言架构师布莱恩·格茨(Brian Goetz)最近的一些分享,胖哥给大家爆个料.老规矩,点赞走起. Valha ...
- Android 12(S) 图形显示系统 - 基本概念(一)
1 前言 Android图形系统是系统框架中一个非常重要的子系统,与其它子系统一样,Android 框架提供了各种用于 2D 和 3D 图形渲染的 API供开发者使用来创建绚丽多彩的应用APP.图形渲 ...
- Windows Server 2008 R2 数据离机备份与恢复操作手册
Windows Server 2008 R2 数据离机备份与恢复操作手册 实验环境 Windows server 2008 R2(服务器) IP地址:192.168.136.175 计算机名:CXH ...