每个大公司都有自己的代码规范,大如Google、GitHub、Apple都可以找到他们的相关规范文档,很多小公司或者团队也有自己的规范。规范对于开发者来说,不只是代码的样式更好看,更有逼格,其实最大的意义在于增加代码的可维护性:代码样式的统一、类中代码的顺序、命名规范等多方面的统一会让团队每个开发者在修复问题或者维护老代码时,更加快速的定位到指定代码,理解原有代码逻辑,减少维护成本。
本文不会讲这些规范或者我们的规范,主要讲一下如何更便捷地使自己的代码符合规范中格式(格式是指空行、空格、缩进、对齐等方面的规定)。
当开发者自己的代码习惯与代码规范存在较大冲突时,想要符合代码规范,一般的进化路线是这样的:
- 最笨的一定是写完代码,逐个去调整代码使其符合规范;
2. 使用code snippt
code snippt 就是内置在xcode中的代码样式模板库,xcode中已经有一些内置默认的样式,通常我们需要自定义一些符合我们规范的模板(例如if else 、init、getter方法)。制作模板很简单,只需要将需要制作模板的代码卸载xcode编辑器中,然后选中这段代码,按住command然后拖动到右侧红色方框中:
关于code snippt其实只要记住<#abc#>即可,其中abc就是要替换的地方显示的内容, <#abc#>是使用的命令,这里需要注意不能先输入<##>再插入abc。
具体可以参考:http://www.cocoachina.com/industry/20130604/6336.html
对于一个团队来说,可以针对团队代码规范,建议一些基本的code snippts, 然后分发给团队每个成员(创建好后,在路径~/Library/Developer/Xcode/UserData/CodeSnippets中),这样大家共享。
3. 工具化:
总有一些代码时我们无法通过code snippt覆盖的,这就需要我们使用一些工具,快速修改这些不符合规范的的代码,这时我们可以通过Alcatraz安装插件来解决(apple为了安全性,xcode8默认无法使用插件,使用参见请参考:https://www.ishuo.cn/doc/cbwrgnqf.html )。
1). ClangFomat-Xcode插件,使用方式参考 http://www.jianshu.com/p/80cfa7430467
2). Uncrustify插件,使用方式参考 https://github.com/benoitsan/BBUncrustifyPlugin-Xcode
Uncrustify包含了ClangFomat-Xcode插件的功能,可以对选定的代码或者文件操作,格式化为标准样式,推荐使用。
安装成功后,重启xcode,可以通过下图方式打开Uncrustify:
打开Uncrustify的perferences后如下图, 按照图示即可在指定路径建立一个Uncrustify.cfg文件,Uncrustify.cfg文件中是对代码格式的一些定义,我们需要根据自己的规范修改其中的定义,保存后。 对指定文件或者代码使用“format active file”或“format selected lines”即可格式化代码。(可以看到上图中的还有view log 按钮,可以查看在格式化过程中是否正常,出现问题在哪里)
例如我们的代码规范如果是这样的:
#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自动根据规范调整样式,每个开发者更新最新代码时,就是规范后的样式。这其实也依赖于已经完全确定配置项目可以正确格式化代码,使其符合代码规范。
为提供便捷性,建议将常用操作设置快捷键。我的xcode设置了对选定代码行格式化的快捷键 cmd shift e 。设置成功后,对应操作按钮边上会出现快捷键内容。
附录:
使用Uncrustify的知名开源代码:
apps-ios-wikipedia
CocoaLumberjack
inbox-ios
wonderful-objective-c-style-guide
一些可参考的代码规范:
GitHub
raywenderlich
Realm
Spotify
The New York Times