每个大公司都有自己的代码规范,大如Google、GitHub、Apple都可以找到他们的相关规范文档,很多小公司或者团队也有自己的规范。规范对于开发者来说,不只是代码的样式更好看,更有逼格,其实最大的意义在于增加代码的可维护性:代码样式的统一、类中代码的顺序、命名规范等多方面的统一会让团队每个开发者在修复问题或者维护老代码时,更加快速的定位到指定代码,理解原有代码逻辑,减少维护成本。
本文不会讲这些规范或者我们的规范,主要讲一下如何更便捷地使自己的代码符合规范中格式(格式是指空行、空格、缩进、对齐等方面的规定)。
当开发者自己的代码习惯与代码规范存在较大冲突时,想要符合代码规范,一般的进化路线是这样的:
- 最笨的一定是写完代码,逐个去调整代码使其符合规范;
2. 使用code snippt
code snippt 就是内置在xcode中的代码样式模板库,xcode中已经有一些内置默认的样式,通常我们需要自定义一些符合我们规范的模板(例如if else 、init、getter方法)。制作模板很简单,只需要将需要制作模板的代码卸载xcode编辑器中,然后选中这段代码,按住command然后拖动到右侧红色方框中:
创建code snippt对于一个团队来说,可以针对团队代码规范,建议一些基本的code snippts, 然后分发给团队每个成员(创建好后,在路径~/Library/Developer/Xcode/UserData/CodeSnippets中),这样大家共享。
3. 工具化:
打开Uncrustify方式打开Uncrustify的perferences后如下图, 按照图示即可在指定路径建立一个Uncrustify.cfg文件,Uncrustify.cfg文件中是对代码格式的一些定义,我们需要根据自己的规范修改其中的定义,保存后。 对指定文件或者代码使用“format active file”或“format selected lines”即可格式化代码。(可以看到上图中的还有view log 按钮,可以查看在格式化过程中是否正常,出现问题在哪里)
配置Uncrustify例如我们的代码规范如果是这样的:
#pragma mark 待审批label
- (UILabel *)toApproveLbl
{
if (_toApproveLbl == nil)
{
_toApproveLbl = [UILabel new];
_toApproveLbl.font = FONT_SYSTEM(Adapter_Zoom(14));
_toApproveLbl.textAlignment = NSTextAlignmentCenter;
_toApproveLbl.textColor = cor3;
}
return _toApproveLbl;
}
那么就需要对默认生成文件中的配置进行一定修改,需要修改以下项目:
# Add or remove newline between 'if' and '{'
nl_if_brace = add # ignore/add/remove/force
注意上图中的“perform format on save of a source code file”选项前面的勾需要谨慎勾选,这个选项将在你保存源文件或者关闭xcode(自动保存源文件)时自动格式化所有有改动的文件,相当于每个有所修改的文件进行整个文件的格式化。 因为目前.cfg中的配置项并不一定是每个项目最终规范的形式,我们可能暂时无法找到合适的配置项来解决规范要求的每个格式,如果选中了的话,可能导致源文件中某些代码样式被转为错误的,不符合规范的样式。
例如:默认配置项对于实例方法和block语法的缩进和换行的配置,格式化代码后是这样的:
[self.approveContentV
mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(_topImgV.bottom).offset(5);
make.left.equalTo(_topImgV.left);
make.width.mas_equalTo(ValidWidth);
make.height.mas_equalTo(_contentH + Adapter_Height(26));
}];
而我们实际想要的是这样的(目前仍未找到合适配置项解决此问题):
[self.approveContentV mas_makeConstraints:^(MASConstraintMaker *make)
{
make.top.equalTo(_topImgV.bottom).offset(5);
make.left.equalTo(_topImgV.left);
make.width.mas_equalTo(ValidWidth);
make.height.mas_equalTo(_contentH + Adapter_Height(26));
}];
所以建议在没有完全摸清这个配置文件各个项目的情况下,暂时不要勾选。 暂时采用对那些可以确定格式化正确的代码片段使用它格式化。
p.s. 如果大家看到一些开源代码的规范样式符合自己的团队或者接近的话,可以在其基础上修改.cfg文件,附录中列了几个使用了Uncrustify的开源代码,可以在其代码文件中找到.cfg文件。
4. 自动格式化
最便利的方式必然是开发者随意写代码,在保存或者提交代码时,IDE或者Git服务器或者Jenkins自动根据规范调整样式,每个开发者更新最新代码时,就是规范后的样式。这其实也依赖于已经完全确定配置项目可以正确格式化代码,使其符合代码规范。
设置快捷键后