工作中不知道你是否遇到过这种问题:你维护了一个基础库,在迭代过程中由于业务变化或代码优化,不得不对一些接口进行重构,这个过程中就可能会产生少量废弃接口。虽然你出于谨慎将这些接口标记为@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出场了,使用方法主要分为如下几步:

  1. 创建 java library 模块
compileOnly "com.android.tools.lint:lint-api:26.4.1"
compileOnly "com.android.tools.lint:lint-checks:26.4.1"
  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`");                }            }        };    }
}
  1. 注册 Detector
public class CustomIssueRegistry extends IssueRegistry {@NotNull@Overridepublic List<Issue> getIssues() {return Arrays.asList(SampleCodeDetector.ISSUE);}@Overridepublic int getApi() {return ApiKt.CURRENT_API;}
}
  1. 配置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") }
}
  1. 项目引入自定义 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:简介与使用

编码规范:依据和实施办法相关推荐

  1. 软件项目质量保证——编码规范

    目录 一 编码规范的作用 二 编码规范不是"物神" 三 编写编码规范的一些建议 四 编码规范参考 作为软件开发者,我们可以开发低等级的软件,但不能开发低质量的软件.所以,如何实施质 ...

  2. Discuz代码研究-编码规范

    来源:http://www.cnblogs.com/janas/archive/2013/08/20/3271408.html Discuz中的编码规范很值得PHP开发人员借鉴.里面既介绍了编码时代码 ...

  3. 【部门管理入门-3】编码规范

    [执行说明] 1.坦言之,编码规范是执行层面的规则,并不是贯穿项目过程始终的一条刚性原则,在执行的过程中,务必要实事求是.最求实际效果,千万不要教条的执行,僵化的执行.我在ThroughoutCMS的 ...

  4. JavaScript最全编码规范

    转载: JavaScript最全编码规范 类型 ●基本类型:访问基本类型时,应该直接操作类型值 ●string ●number ●boolean ●null ●undefined var foo = ...

  5. python编码规范简单总结

    编码规范方面 一.命名规范 变量名通常由字母,数字,下划线组成; 数字不能作为变量名开头; 不能以python中的关键字命名; 变量名要有意义; 不要用汉字和拼音去命名; 变量名要区分大小写; 推荐使 ...

  6. 【安全开发】IOS安全编码规范

    申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...

  7. Android安全编码规范

    1.目的 为使系统开发人员能够编写符合安全要求的代码,以降低代码安全漏洞,减少代码被利用的可能性,从而提升各系统安全水平,符合国家安全合规性要求,保障产品安全稳定运营以及信息安全,特制定本规范. 2. ...

  8. 公司让我编写一套自己的【Java 编码规范】作为员工季度考核标准?!参照Alibaba

    目录 一.编码规范 (一)命名风格 (二)常量定义 (三)代码格式 (四)OOP规范 (五)集合处理 (六)并发处理 (七)控制语句 (八)注释规范 (九)其它 二.SVN操作规范 三.异常日志 (一 ...

  9. .Net基础——程序集与CIL HttpClient封装方法 .Net Core 编码规范 C#中invoke和beginInvoke的使用 WebServeice 动态代理类...

    .Net基础--程序集与CIL 1. 程序集和CIL: 程序集是由.NET语言的编译器接受源代码文件产生的输出文件,通常分为 exe和dll两类,其中exe包含Main入口方法可以双击执行,dll则需 ...

最新文章

  1. Loader 入门【Webpack Book 翻译】
  2. 2.1 mac下多版本jdk的安装和管理
  3. localhost与127.0.0.1的概念和工作原理之不同
  4. 史上最严重的忘拿钥匙事件 | 今日最佳
  5. 马尔可夫Markov决策过程 MDP、马尔可夫奖励过程MRP
  6. 兼容门:先卸载腾讯QQ,再卸载360软件!
  7. MongoDB 资源、库、工具、应用程序精选列表中文版
  8. 实用分层模板,分分钟了解UI界面设计基本原则!
  9. [Ext JS6]工作区-Workspace
  10. CakePHP 2.x CookBook 中文版 第七章 模型 之 数据校验
  11. [Leetcode] Climbing Stairs
  12. 使用mutt和msmtp发送邮件
  13. 薛定谔的猫、量子纠缠、和量子计算机
  14. HBuilder升级失败,/HBuilder/plugins 被另—个程序占用,请退出占用程序或者重启计算机后重试
  15. 【强大知名的CAD绘图工具】AutoCAD 2019 for Mac
  16. 三态内容寻址存储器(TCAM)工作原理
  17. 初识dubbo(随笔)
  18. 中继协作传输的SWIPT——知识扫盲
  19. 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现
  20. 作为程序员创业者,来谈一下“老罗与王自如对战”

热门文章

  1. C语言程序设计课设——图书出入库管理系统
  2. excel 数据验证中序列长度超出限制处理
  3. 姿态的三种描述方式——欧拉角、轴角、四元数
  4. ​​2023年腾讯云轻量应用服务器和云服务器CVM区别
  5. echarts 实心圆环阶段图 配置
  6. 就真的一样!追吧,现在流行3D纹身了!图!
  7. 计算机组成原理往届的试题,【历年真题】全国2019年10月自考《计算机组成原理》试题真题与答案02318...
  8. Dgraph的基本使用经典教程(安装,数据导入,导出,删除,查询等)
  9. 企业编码生成系统智能批量生成带数据分析功能的防伪码
  10. 51单片机 Proteus仿真 测烟雾浓度显示 报警器 烟雾报警 PCF8591 MQ-4