编码规范:依据和实施办法
工作中不知道你是否遇到过这种问题:你维护了一个基础库,在迭代过程中由于业务变化或代码优化,不得不对一些接口进行重构,这个过程中就可能会产生少量废弃接口。虽然你出于谨慎将这些接口标记为@Deprecated,但是仍然会有开发者不注意,使用被废弃的接口,造成后期维护上的一些问题。我们可以通过编码规范来处理此类问题,本文主要来谈谈编码规范及其实施办法。
有规可依
谈到编码规范,首先要解决的是有法可依的问题。代码改怎么写才算规范,这个问题在任何大厂都是有丰富的实践经验和血泪教训的,在网上找到了一份《Google 开源项目风格指南——中文版》,包含了下述语言的编码规范:
- C++ 风格指南
- Objective-C 风格指南
- Python 风格指南
- JavaScript 风格指南
- Shell 风格指南
- JSON 风格指南
- TypeScript 风格指南
上述文档github地址:https://github.com/zh-google-styleguide/zh-google-styleguide
执规必严
有了规范下一步就是如何实施的问题了。
Lint
IDE内置Lint工具可以帮助我们静态分析代码中存在的不规范的地方,并通过标记色和warn日志进行提示。
其支持检出:
- xml文件中是否存在hardcode硬编码
- unused resources没有使用到的资源
- spelling拼写问题
- probable bug等
gradle选项:
android {lintOptions {checkReleaseBuilds false// Or, if you prefer, you can continue to check for errors in release builds,// but continue the build even when errors are found:abortOnError false}.....
}
Lint检查可以提示可能存在的问题,但是默认不会造成编译失败,对于error级别的隐患,可配置
abortOnError true
达到强制修改的作用
基本使用
- Analyze>Inspect Code:
- 选择检查范围,通常为whole project
- 查看检查结果
Inspections配置
IDE支持我们配置Lint的检查项和提示等级,在Setings>Inspections中:
同样,检查结果只能起到提醒作用
Lint API
从上一节可以看到Inspections支持我们自定义Lint检查项,那如果我们需要进一步的增加自己的检查项呢?比如:
- 检查是否使用了系统的Toast,提示使用统一的toast;
- 检测文本表达式中是否包含特定的字符串;
- 检测所有 layout 或 java 文件中引用的 png 资源,提示使用 webp;
- 检测使用 Log 类的 i、d、e 等日志输出的方法,提示使用统一的日志工具类;
- 检测直接通过 new Thread 创建线程,提示应该使用统一线程池;
这时候需要Lint API出场了,使用方法主要分为如下几步:
- 创建 java library 模块
compileOnly "com.android.tools.lint:lint-api:26.4.1"
compileOnly "com.android.tools.lint:lint-checks:26.4.1"
- 创建 Detector
public class SampleDetector extends Detector implements Detector.UastScanner { //第一步:定义 ISSUE public static final Issue ISSUE = Issue.create( "ShortUniqueId", //唯一 ID "Lint Mentions", //简单描述 "Blah blah blah.", //详细描述 Category.CORRECTNESS, //问题种类(正确性、安全性等) 6, //权重 Severity.WARNING, //问题严重程度(忽略、警告、错误) new Implementation( //实现,包括处理实例和作用域 SampleCodeDetector.class, Scope.JAVA_FILE_SCOPE)); //第二步:定义检测类型以及处理逻辑 // 检测类型包括文本表达式、调用相关表达式等 @Override public List<Class<? extends UElement>> getApplicableUastTypes() { return Collections.singletonList(ULiteralExpression.class); } @Override public UElementHandler createUastHandler(@NotNull JavaContext context) { return new UElementHandler() { @Override public void visitLiteralExpression(@NotNull ULiteralExpression expression) { String string = UastLiteralUtils.getValueIfStringLiteral(expression); if (string == null) { return; } if (string.contains("Omooo") && string.matches(".*\\bOmooo\\b.*")) { //第三步:符合条件,上报 ISSUE context.report(ISSUE, expression, context.getLocation(expression), "This code mentions `Omooo`"); } } }; }
}
- 注册 Detector
public class CustomIssueRegistry extends IssueRegistry {@NotNull@Overridepublic List<Issue> getIssues() {return Arrays.asList(SampleCodeDetector.ISSUE);}@Overridepublic int getApi() {return ApiKt.CURRENT_API;}
}
- 配置Lint编译选项
apply plugin: 'java-library'
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) compileOnly "com.android.tools.lint:lint-api:26.4.1" compileOnly "com.android.tools.lint:lint-checks:26.4.1"
}
sourceCompatibility = "1.8"
targetCompatibility = "1.8" jar { manifest { attributes("Lint-Registry-v2": "top.omooo.lint_library.CustomIssueRegistry") }
}
- 项目引入自定义 Lint
// 在需要检查的module gradle中引入
dependencies { lintChecks project(":lint_library")
}
详细使用方法参见:你必须要了解的 AndroidStudio 3.x Lint API
Alibaba Java Coding Guidelines
该IDE插件由阿里巴巴 P3C 项目组研发。代码已经开源https://github.com/alibaba/p3c,以及官方宣传文章《阿里巴巴Java开发规约》插件全球首发!。
特性:
- 支持静态检测,和基于 Inspection 机制的实时检测功能;
- 检测结果分为三个等级(Blocker崩溃/Critical严重/Major重要),其中前两级必须要处理掉;
- 支持批量一键修复的功能;
插件安装和使用比较简单可以参考网上的博客,目前没有找到自定义检测项或规则的拓展功能,
CheckStyle
CheckStyle作为检验代码规范的插件,除了可以使用配置默认给定的开发规范(Sun/Google开发规范),也可以导入像阿里的开发规范的插件。每一个公司都存在不同的开发规范要求,所以大部分公司会给定自己的check规范,一般导入给定的checkstyle.xml文件即可实现。
特性:
- 支持源码/jar检测;
- 自带Sun/Google开发规范;
- 支持配置自己的编码规范,导入即可;
使用方法参考:CheckStyle使用
FindBugs
FindBugs也是一款IDE插件,用法跟其他工具也差不多,使用方法可以查找网上的资料。
使用方法参考:FindBugs:简介与使用
参考资料
- Android Studio使用Lint进行代码检查
- 你必须要了解的 AndroidStudio 3.x Lint API
- 《阿里巴巴Java开发规约》插件全球首发!
- CheckStyle使用
- FindBugs:简介与使用
编码规范:依据和实施办法相关推荐
- 软件项目质量保证——编码规范
目录 一 编码规范的作用 二 编码规范不是"物神" 三 编写编码规范的一些建议 四 编码规范参考 作为软件开发者,我们可以开发低等级的软件,但不能开发低质量的软件.所以,如何实施质 ...
- Discuz代码研究-编码规范
来源:http://www.cnblogs.com/janas/archive/2013/08/20/3271408.html Discuz中的编码规范很值得PHP开发人员借鉴.里面既介绍了编码时代码 ...
- 【部门管理入门-3】编码规范
[执行说明] 1.坦言之,编码规范是执行层面的规则,并不是贯穿项目过程始终的一条刚性原则,在执行的过程中,务必要实事求是.最求实际效果,千万不要教条的执行,僵化的执行.我在ThroughoutCMS的 ...
- JavaScript最全编码规范
转载: JavaScript最全编码规范 类型 ●基本类型:访问基本类型时,应该直接操作类型值 ●string ●number ●boolean ●null ●undefined var foo = ...
- python编码规范简单总结
编码规范方面 一.命名规范 变量名通常由字母,数字,下划线组成; 数字不能作为变量名开头; 不能以python中的关键字命名; 变量名要有意义; 不要用汉字和拼音去命名; 变量名要区分大小写; 推荐使 ...
- 【安全开发】IOS安全编码规范
申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...
- Android安全编码规范
1.目的 为使系统开发人员能够编写符合安全要求的代码,以降低代码安全漏洞,减少代码被利用的可能性,从而提升各系统安全水平,符合国家安全合规性要求,保障产品安全稳定运营以及信息安全,特制定本规范. 2. ...
- 公司让我编写一套自己的【Java 编码规范】作为员工季度考核标准?!参照Alibaba
目录 一.编码规范 (一)命名风格 (二)常量定义 (三)代码格式 (四)OOP规范 (五)集合处理 (六)并发处理 (七)控制语句 (八)注释规范 (九)其它 二.SVN操作规范 三.异常日志 (一 ...
- .Net基础——程序集与CIL HttpClient封装方法 .Net Core 编码规范 C#中invoke和beginInvoke的使用 WebServeice 动态代理类...
.Net基础--程序集与CIL 1. 程序集和CIL: 程序集是由.NET语言的编译器接受源代码文件产生的输出文件,通常分为 exe和dll两类,其中exe包含Main入口方法可以双击执行,dll则需 ...
最新文章
- Loader 入门【Webpack Book 翻译】
- 2.1 mac下多版本jdk的安装和管理
- localhost与127.0.0.1的概念和工作原理之不同
- 史上最严重的忘拿钥匙事件 | 今日最佳
- 马尔可夫Markov决策过程 MDP、马尔可夫奖励过程MRP
- 兼容门:先卸载腾讯QQ,再卸载360软件!
- MongoDB 资源、库、工具、应用程序精选列表中文版
- 实用分层模板,分分钟了解UI界面设计基本原则!
- [Ext JS6]工作区-Workspace
- CakePHP 2.x CookBook 中文版 第七章 模型 之 数据校验
- [Leetcode] Climbing Stairs
- 使用mutt和msmtp发送邮件
- 薛定谔的猫、量子纠缠、和量子计算机
- HBuilder升级失败,/HBuilder/plugins 被另—个程序占用,请退出占用程序或者重启计算机后重试
- 【强大知名的CAD绘图工具】AutoCAD 2019 for Mac
- 三态内容寻址存储器(TCAM)工作原理
- 初识dubbo(随笔)
- 中继协作传输的SWIPT——知识扫盲
- 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现
- 作为程序员创业者,来谈一下“老罗与王自如对战”
热门文章
- C语言程序设计课设——图书出入库管理系统
- excel 数据验证中序列长度超出限制处理
- 姿态的三种描述方式——欧拉角、轴角、四元数
- ​​2023年腾讯云轻量应用服务器和云服务器CVM区别
- echarts 实心圆环阶段图 配置
- 就真的一样!追吧,现在流行3D纹身了!图!
- 计算机组成原理往届的试题,【历年真题】全国2019年10月自考《计算机组成原理》试题真题与答案02318...
- Dgraph的基本使用经典教程(安装,数据导入,导出,删除,查询等)
- 企业编码生成系统智能批量生成带数据分析功能的防伪码
- 51单片机 Proteus仿真 测烟雾浓度显示 报警器 烟雾报警 PCF8591 MQ-4