大家好,欢迎来到IT知识分享网。
一、目的
为了利于项目维护以及规范开发,促进成员之间代码评审的效率,故提出以下开发规范,如有更好的建议,欢迎提出。
本文档的预期读者包括:iOS开发人员。
二、命名规范
代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。正确的英文拼写和语法可以让阅读者易于理解,避免歧义。
*注意:即使纯拼音命名方式也要避免采用。但alibab、taobao、youku、hangzhou等国际通用的名称,可视同英文.
大驼峰规则:每个单词的首字母大写。例:NameTextField。
小驼峰原则:第一个单词首字母小写,其余都大写。例:nameTextField。
2.1 项目命名
项目名都遵循大驼峰命名。例如:AoRiseProject
2.2 Bundle Identifier 命名
Bundle Identifier
:采用反域名命名规范,全部采用小写字母,以域名后缀+公司顶级域名+应用名形式命名。
例如:com.公司名称( kangqiao ).service.guanjia
2.3 类名
类的命名都遵循大驼峰命名。一般是:前缀 + 功能 + 类型。
例如:KQ + Login + ViewController
。
常用控件类命名类型对照表(下表中前缀为:KQ,如果用到下表中没有列举出来,请去掉UI首字母,遵循实际规则即可。)
| 控件名 | 类型 | 示例 |
| ---- | ---- | ---- |
| UIViewController|ViewController|KQBaseViewController |
| UView |View |KQBaseView|
| UITableView |TableView |KQOrderTableView|
| UITableViewCell |Cell |KQOrderListCell|
| UIButton |Button |KQSuccessButton|
| UILabel |Label |KQSuccessLabel|
| UIImageView |ImgView |KQGoodsImgView|
| UITextField |TextField |KQNameTextField|
| UITextView |TextView |KQSuggestTextView|
其它类相关对照表
| 功能 | 类型 | 示例|
| ---- | ---- | ---- |
| 工具类| Tool| KQOrderTool|
| 管理类| Manager| KQOrderManager|
| 模型类| Model| KQOrderListModel|
| 数据库类| DataBase、表名+DBHelper |KQFriendDataBase、KQUserTableDBHelper|
| 类目| XXX+(范围,例如Extension, Additions 或者功能,例如Frame,Nib,Block)| KQUIButton+Additions、KQUIButton+Block|
2.4 UIViewController请按照如下分类
// 外部传入参数+@IBOutlet
// MARK: - life cycle
// MARK: - UI
// MARK: - events
// MARK: - private methods
// MARK: - UITableViewDataSource
// MARK: - UITableViewDelegate
(代理顺序往下排列)
// MARK: - network
// MARK: - getters & setters
*注意:所有视图或者对象的创建请尽量使用懒加载,调用的时候全部使用self.testButton这样的方式。
import UIKit
class KQTestViewController: UIViewController {
/// 用户Id
public var userId: String?
/// 头像
@IBOutlet weak var headerImageView: UIImageView!
// MARK: - life cycle
override func viewDidLoad() {
super.viewDidLoad()
// 创建UI
self.buildUI()
}
// MARK: - UI
/// 创建UI
func buildUI() {
// 添加testButton
self.view.addSubview(self.testButton)
self.testButton.mas_makeConstraints { (make) in
make?.top.mas_equalTo()(0)
make?.left.mas_equalTo()(0)
make?.right.mas_equalTo()(0)
make?.bottom.mas_equalTo()(0)
}
}
// MARK: - events
/// test按钮点击
/// - Parameter sender: 按钮
@objc func testButtonClick(_ *sender: UIButton) {
// 自我介绍
let _ = self.introduction("jack")
}
// MARK: - private methods
/// 自我介绍
/// - Parameter name: 姓名
/// - Returns: 结果
func introduction(_ name: String?) -> Bool {
if (name ?? "").count > 0 {
print("my name is \(name!)!")
return true
} else {return false}
}
// MARK: - UITableViewDataSource
// MARK: - UITableViewDelegate
// MARK: - network
// MARK: - getters & setters
private lazy var testButton: UIButton = {
let testButton = UIButton(type: .custom)
testButton.backgroundColor = .red
testButton.setTitle("测试", for: .normal)
testButton.addTarget(self, action: #selector(testButtonClick(_ *:)), for: .touchUpInside)*
return testButton
}()
}
2.5 变量和方法
变量和方法的命名都遵循小驼峰命名。 例如:
testButton
func testButtonClick(_ *sender: UIButton)响应事件。
2.6 常量
全局常量:工程前缀+全大写,下划线隔开 例如:
let KQ_SCREEN_WIDTH
2.7 参数名
参数名以小驼峰命名,尽量参考苹果原生方法风格编写。尽量可读性好,看到方法名就知道这个方法是用来干什么的。例如:
func setData(_ *imageUrl: String?,* _ name: String?, content: String?)
三、资源文件规范
3.1 资源文件命名
全部小写,采用下划线命名法,加前缀区分。所有的资源文件都需要加上工程前缀(小写形式) 命名模式:可加后缀 _smal
表示小图, _big
表示大图,逻辑名称可由多个单词加下划线组成,采用以下规则:
- 模块名\_用途_*逻辑名称*
- 模块名\_用途_*颜色*
- 用途_*逻辑名称*
- 用途_*颜色*
|说明|前缀(工程前缀示例KQ)|示例|
| ---- | ---- | ---- |
|按钮相关|kq_btn_ | 如下:
kq_home_btn_normal、kq_home_btn_red、kq_btn_normal、kq_btn_red_big|
|背景相关|kq_bg_| 如下:
kq_home_bg_header、kq_bg_main|
3.2 文件夹命名
创建文件夹最好创建实体文件夹,找到工程目录,创建相应文件夹并拖入工程。文件夹命名使用相应模块结构分层的英文,首字母要大写。例:Model, View, Controller, Tool, Other, Service等等。
四、第三方库规范
用时下较新的技术,对开源库的选取,一般都需要选择比较稳定的版本,作者在维护的项目,要考虑作者对issue的解决,以及开发者的知名度等各方面。选取之后,一定的封装是必要的。
项目使用cocoapods统一管理开源第三库文件,不需要手动导入和手动添加依赖库。如果第三方不支持cocoapods,可手动导入工程。
如第三方库需要修改,统一放在TheThirdLiabrary文件夹中。
五、注释规范
为了减少他人阅读你代码的痛苦值,请在关键地方做好注释。
5.1 类注释
//
// KQTestViewController.swift
// KangYunYouJia
//
// Created by zhouxiang on 2020/12/1.
// Copyright © 2020 zhoux@zzkqdc.com. All rights reserved.
//
该注释是自动生成的,在Xcode中设置即可。Created by电脑用户名on创建该文件的时间。Copyright 2020后面的名字和邮箱是自己填写和设置的。具体可在Xcode工程,Project Document中设置。这样便可在每次新建类的时候自动加上该头注释。
5.2 方法注释
方法注释,方法外部统一用option + command + /,方法内部统一用//注释。
/// 自我介绍
/// - Parameter name: 姓名
/// - Returns: 结果
func introduction(_ name: String?) -> Bool {
if (name ?? "").count > 0 {
print("my name is \(name!)!")
return true
} else {
return false
}
}
5.3 模型注释
每个model中的,包含的每个属性,都必须要写上相对应的注释,用///注释。阅读者一看这个model,就清楚知道model中的每个字段代表的意思,用来做什么事情的。
@interface KQUnitModel : NSObject
/// 小区名称
@property (strong, nonatomic, nullable) NSString *communityName;
/// 小区code
@property (strong, nonatomic, nullable) NSString *communityCode;
/// 区域id
@property (strong, nonatomic, nullable) NSString *cellId;
/// 区域名称
@property (strong, nonatomic, nullable) NSString *cellName;
/// 楼层列表
@property (strong, nonatomic, nullable) NSArray <KQFloorModel*> *floorList;
@end
class KQUnitModel: NSObject {
/// 小区名称
var communityName: String?
/// 小区code
var communityCode: String?
/// 区域id
var cellId: String?
/// 区域名称
var cellName: String?
/// 楼层列表
var floorList: [KQFloorModel]?
}
*注意:如果不是model的属性,是其它类属性,需要注释,请按照model属性注释方式。
六、编码规范
-
所有的方法之间空一行。
-
所有的代码块之间空一行,删除多余的注释。
-
所有自定义的方法需要给出注释。
-
尽量使用懒加载(在控制器分类时有提及和要求,其它自定义类按照控制器格式分类,没有的分类不写即可。)
-
代码后的’{‘不需要独占一行,包括方法之后,if,switch等。
-
必须要统一的要求,属性的定义请按照property之后,空一格,括号之后空一格,写上类名,空一格之后跟上**和属性名。例如:*
/// 小区名
@property (strong, nonatomic, nullable) NSString *communityName;
-
遵循一般代码规范,多模仿苹果API。
-
删除不用的代码。
-
如果有方法一直不会用到,请删除(除工具类)。
-
没有执行任何业务逻辑的方法,请删除或给予注释,删除多余的资源或文件,添加必要的注释。
-
比较大的代码块需要给出注释。
七、其它规范
-
建议项目统一使用Masonry和xib结合的方式布局。不允许出现直接设置frame的情况。不建议使用纯storyboard开发。
-
提取方法,去除重复代码。对于必要的工具类抽取也很重要,这在以后的项目中是可以重用的。
-
尽可能的使用局部变量
-
尽量减少对变量的重复计算。
-
尽量在合适的场合使用单例。使用单例可以减轻加载的负担,缩短加载的时间,提高加载效率。但并不是所有的地方都适用于单例,简单来说单例主要适用于以下三个方面:
– 控制资源的使用,通过线程同步来控制资源的并发访问。
– 控制实例的产生,以达到节约资源的目的。
– 控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。
- 最后不要忘了检测内存泄漏。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/13785.html