一、工程结构
1、Android Studio工程结构:
Project
|-- module
|-- src
|-- main
|-- java
|-- module
|-- activity
|-- view
|-- model
|-- res
AndroidManifest.xml
|-- projectTest
|-- test
|-- libs
|-- build
build.gradle
proguard-rules.pro
build.gradle
gradle.properties
local.properties
settings.gradle
LICENSE.txt
README.txt
2、Xcode 工程结构
Project
|-- project
|-- module
|-- controller
|-- view
|-- model
|-- bean
|-- delegate
|-- datasource
Contant
other files
|-- Pods
project.workspace
project.xcodeproj
LICENSE.txt
README.txt
二、命名规范
1、项目命名
以Company_项目名称缩写_平台名称命名,例如:XXX_MDW_iOS
2、文件命名
全部以大写字母开头,保持下划线与
ViewController 以"模块名称+ViewController"命名,例如:MainViewController
View以"模块名称+View类型"命名,例如:MainSeacherButton、MainCleanView
Delegate以"模块名称+功能描述+Delegate"命名,例如:MainImageListDelegate
3、包命名
均为小写字母,用作描述模块
4、变量命名
开头首字母小写,遵守驼峰式命名法
控件命名以“功能描述+View类型”命名,例如:submitButton
禁止使用中立词、表意不清词定义变量,例如:button1、button
5、方法命名
开头首字母小写,遵守驼峰式命名法,例如:initUserData()
参数命名规则同变量命名规则
6、接口命名
开头首字母大写,以“接口描述+Interface”命名,例如:MainInterface
接口方法命名应准确标识此方法的调用时机,例如:viewDidLoad()、viewWillDidLoad()
7、block命名
开头首字母大写,以“block描述+Block”命名,例如:MainBlock
8、协议命名
开头首字母大写,以"协议描述+Protocal"命名,例如:MainProtocal
9、存取方法命名
方法名应由以下规则组成
存方法:
setUser(User user);
取方法:
List<User> getUser();
10、缓存方法命名
开发中经常需要本地缓存数据,在此类关于缓存方法的增删改查数据的方法命名上,应遵循以下原则:
取方法:
List<User> getUser();
增方法:
addUser(User user)
删方法:
removeUser(int index)
改方法:
updateUser(int index,User user)
11、常量命名
对于常量应遵循能使用就使用枚举的原则,在合适的头文件中定义枚举类型,方便本类与其他类调用时查看。
三、作用域
1、静态方法
Java以static关键字修饰,Objective-C使用+字符声明
静态方法中不可调用非静态方法及变量,为保证静态方法内部线程安全;
但可通过传参给静态方法,静态方法的形参在方法内部是线程安全的
应在接口文件中暴露,使外部对其可见,在程序任何地方可以通过类名直接访问静态方法
2、静态变量
Java以static关键字修饰,Objective-C使用+字符声明
静态变量因为与函数调用无关,一旦生成生命周期会持续到程序结束,所以在多线程状态下,是线程不安全的
应在接口文件中暴露,使外部对其可见,在程序任何地方可以通过类名直接访问静态方法
因可能产生线程安全问题,所以在处理多线程状态下的静态变量使用时,应注意可能需要使用一些同步手段,锁定静态变量,应尽量减少使用
3、全局变量
Java以public关键字修饰,Objective-C一般声明为一个配置类的属性
指的是在程序运行时,需在不同位置频繁访问、随时更改的变量
全局变量因与函数调用有关,当没有对其产生引用时,此全局变量将可能被自动或手动回收,在调用其值的时候应注意,否则可能产生空指针问题
4、局部变量
局部变量应以最小作用域为限制,使之在使用完后立刻可以达到回收要求,否则将产生不确定问题
5、私有方法
私有方法不应在接口文件中暴露,使外部对其理论上不可见,其在当前类文件中才可被访问
6、公有方法
公有方法应在接口文件中暴露,是外部对其可见的,在程序任何地方可以通过类的实例化对象访问其公有方法
7、保护方法
保护方法应在接口文件中暴露,对外部部分类可见,包括子孙类、同包下类使用,用的不多,应尽量减少使用
8、私有变量
私有变量与局部变量一致,应控制在本类运行或本函数运行完后即可被手动或自动释放
9、公有变量(属性)
属性应在接口文件中暴露,任何外部类对其是可见的,应在主动暴露给其他类使用时声明,一般作为传递数据的接口
10、保护变量
保护变量应在接口文件中暴露,部分外部类对其是可见的,包括子孙类、同包下类使用,用的不多,应尽量减少使用
四、换行
1、方法括号换行
2、for循环换行
3、while循环换行
4、switch换行
5、if else换行
6、block换行
以上括号换行均应在首行末尾起{,在末行再换一行开头起}
五、注释
1、类注释
/** **************************************************************************************
* Copyright (c) [年份] [公司] All rights reserved.
* file name:[文件名称]
* author:[作者姓名]
* email:[作者公司邮箱地址]
* date:[年月日]
* description:[类功能描述]
*/ **************************************************************************************
2、方法注释
/** **************************************************************************************
* method name:[方法名称]
* throw [Exception名称] [抛出异常条件描述]
* param [paramname] [参数1中文释意]
* param [paramname] [参数2中文释意]
* return [paramname] [返回值中文释意]
* author:[作者姓名]
* email:[作者公司邮箱地址]
* date:[年月日]
*/ **************************************************************************************
3、变量注释
/**
* Parma Name:[变量名称][变量中文释意]
*/
4、单行注释
/** 注释内容 */
5、多行注释
/**
*
*
*/
六、其他
1、缩进
推荐使用4个空格,禁止使用Tab,需在Xcode配置中将Tab键设置为输入4个空格
2、不使用全局通知
尽量不要使用全局通知,若必须使用需单独抽取通知识别符到统一配置文件中,此文件命名应为NotifitionIdtifiers
3、黄金路径
a)禁止书写例如:
bool isTrue;
if(isTrue){
return true;
}else{
return false;
}
应写为
return isTrue;
b)在条件判断时应使用例如:
if(![someOther boolValue]){
return;
}
避免书写例如:
if([someOther boolValue]){
//TODO
}else{
//TODO
}
c)在条件判断时注意区分判断条件关联性。
在以下几种判断方式中做合理选择
if(条件一){
//TODO
}else if(条件二){
//TODO
}else{
//TODO
}
if(条件一){
//TODO
}
if(条件二){
//TODO
}
if(条件一||条件二){
//TODO
}
if(条件一&&条件二){
//TODO
}
d)尽量不使用多层if嵌套判断,并在多条件判断时应优先使用短路算法,提高计算效率。
4、英文拼写
推荐使用苹果推崇的全单词拼写命名,按苹果的说法“好的方法名应当可以以一个句子的形式朗读出来”。减少缩写,方便识别。
5、mark — 文档标记
iOS开发需在代码中增加 #param — mark 功能归类描述
以提高代码浏览效率。
6、switch break
在使用switch做条件判断时,需要写default分支,以免此处出现逻辑漏洞,导致后续处理异常。
7、单行字符限制
为保证正常代码浏览,一行代码不应超过120个字符。
8、Exception
低层代码抛出的异常务必在高层捕获并处理。
且尽量精准地抛出或捕获异常,不应直接处理所有异常的父类Exception。
9、Library
在使用任何Framework时,必须在第三方库与业务代码中增加封装层,保证不出现因第三方库变化导致频繁更改大量业务代码的问题。
在开发任何Framework时,应将所有需引用的头文件写到一个跟Framework同名的头文件中,用作其他工程直接引用,而不应该让其他工程分别引用所需的其他头文件
10、硬编码
关于项目中出现的既定字符串应抽取到共同文件中,而不应硬编码在业务代码中,可能造成后期版本迭代时,修改上出现很多漏改等问题。
禁止书写魔法数字,应按常量定义数字代表的判断条件。
七、小技巧
1、if else 单条件判断成功会直接跳出,不运行其他else判断
例:
int a=0;
int b=1;
if(a==0){
System.out.println(a);
}else if(b==1){
System.out.println(b);
}
运行结果:0