闲扯淡:对于代码规范的作用,其实并不只是所谓将代码风格统一,并不是为了美观而做这项工作。我觉得主要是两方面,一是美丽的代码的风格自然会代码的逼格升高,会让我们看起来是一个团结的团队;第二点也是最重要的一点,代码规范有助于形成良好的编码习惯,大家一起查漏补缺有助于代码质量的提升,如果你不想别人说你的代码是一坨屎,那么请注意代码规范。
代码规范我觉得有这么几个方面:
一、工程架构;
二、文件命名;
三、方法排序;
四、注释书写方式;
五、友好的约定。
一、工程架构:
架构的思想用不着我这种水平来说,应该是专业的架构师级别的大咖应该说的事情,所以我也不扯什么MVVM,MVP了。对于一般团队的项目,流行了许多年的,也是众多架构的鼻祖,就像C语言一样的MVC足以。
我建议的架构形式是这样的:
image.png
image.png
image.png
1、Application中放我们的AppDelegate,UITabBarController;
2、Business中是我们的所有业务,其中采用MVC的模式,每一个采取业务模块建立一个Controller,View,Model;
3、Support中是我们的工具类,第三方框架和SDK,category;
4、Network中是我们自己封装的网络工具类。
二、文件命名:
文件命名其实就是一句话,需要加上我们的公司前缀缩写。没什么建议是公司前缀呢,因为公司可能有多个项目,如果你们这个团队会涉及到多个项目,那么采用同一个前缀,可能将工具类共享,也算是公司的共有财产。当然反之,如果你们的项目永远不会有交集,那么可以以项目缩写成为文件前缀。
三、方法排序:
我们的方法注释可以用过mark的方式进行注释,这里以一个Controller的方法排序为例子:
//
// JYBaseViewController.m
// BAndR
//
// Created by JingGuo on 2017/11/9.
// Copyright © 2017年 com.JiangYun.BAndR. All rights reserved.
//
#import "JYBaseViewController.h"
@interface JYBaseViewController () <UITableViewDelegate,
UITableViewDataSource>
@property (nonatomic, strong) UITableView *tableView;
@end
@implementation JYBaseViewController
#pragma mark - LifeCycle
- (void)viewDidLoad {
[super viewDidLoad];
[self initializeUI];
[self initializeData];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
}
- (void)dealloc {
NSLog(@"%s", __func__);
}
#pragma mark - EventResponse
- (void)buttonAction:(UIButton *)button {
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return kZero;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
return nil;
}
#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return kZero;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
}
#pragma mark - PublicMethods
- (void)thisIsOnePublicMethod:(BOOL)good {
}
#pragma mark - PrivateMethods
- (void)initializeUI {
}
- (void)initializeData {
}
#pragma mark - SetterGetter
- (UITableView *)tableView {
if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;
}
return _tableView;
}
@end
上面是一个Controller的方法排列,生命周期--代理方法--公共方法--私有方法--SetterGetter方法。
四、注释书写方式:
1、方法注释:
方法在 .m 文件中基本可以不用使用特别的注释,如果你的方法名起得足够的闻名晓义。
image.png
对于 .m 中实在需要方法进行注释和 .h 中的方法我们最好都要注释,我们可以使用Xcode7之后自带的快捷注释方式:option+command+/
/**
公共方法
@param good 是否好
*/
- (void)thisIsOnePublicMethod:(BOOL)good;
2、属性注释:
也使用Xcode自带注释方法,我们可以在调用时看到这个属性的注释内容。
/**
表单
*/
@property (nonatomic, strong) UITableView *tableView;
image.png
3、方法中的注释采用:// 这是注释
[self.view addSubview:self.tableView];
// UI布局
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
}];
五、友好的约定:
其实对于代码的美观的实现完全要靠我们的代码的约定才能实现,如果你是用铅笔说话,我是用铅笔说话,写在一片文章中,必然不会让人认为这是浑然一体的东西。
1、常见方法命名:
// 初始化UI控件
[self initializeUI];
// 初始化基础数据
[self initializeData];
2、尤达表达式:
不使用 _tableView == nil。首先我们我们将nil放在前面,这样容易避免 == 写成 =
造成的错误;另外使用 ! 语法,语言识别度会更高。
- (UITableView *)tableView {
if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;
}
return _tableView;
}
3、if……else ……的写法:
第一种写法肯定不如第二种写法,我们的嵌套千万不要太多,否则不管你的 { } 怎么写都容易将人的眼睛看花的。
NSInteger test = kZero;
if (kZero == test) {
if (kZero == test) {
if (kZero == test) {
DLog(@"this is log");
} else {
}
} else {
}
}
NSInteger test = kZero;
// 将可以抽离的判断拿出来
if (kZero != test) {
return;
}
if (kZero == test) {
if (kZero == test) {
DLog(@"this is log");
} else {
}
} else {
}
4、枚举的写法:
我们遵循苹果的统一风格,前缀+名+具体类型
typedef NS_ENUM(NSUInteger, JYPersonType) {
JYPersonTypeFather = 0, // 父亲
JYPersonTypeMother, // 母亲
JYPersonTypeSon, // 儿子
};
5、静态字符串写法:
这里举一个cell复用ID的字符串写法。至于其中的关键字的作用可以自己去查。
static NSString * const JYChoiceRegionCellReuseIdentifier = @"JYChoiceRegionCellReuseIdentifier";
6、字典和数组的写法:
@{
@"1" : @"11",
@"2" : @"22",
@"3" : @"33"
};
@[
@"1",
@"2",
@"3"
];
7、空格的使用:
空格是一种语法,对于空格的合理使用会让我们的代码看起来更加清晰美观。
有空格和无空格会有不一样的感觉:
if (array.count==0) {
if (_page>1&&array.count==0) {
_page-=1;
}
}
if (!array.count) {
if (_page > 1 && !array.count) {
_page -= 1;
}
}
网友评论