分享好友 最新动态首页 最新动态分类 切换频道
落地 Kotlin 代码规范,DeteKt 了解一下~
2024-12-24 02:25

各个团队多少都有一些自己的代码规范,但制定代码规范简单,困难的是如何落地。如果完全依赖人力难免有所遗漏。

这个时候就需要通过静态代码检查工具在每次提交代码时自动检查,本文主要介绍如何使用落地代码规范,主要包括以下内容

  1. 为什么使用?
  2. 接入插件
  3. 命令行方式接入
  4. 方式接入
  5. 自定义检测规则
  6. 集成检测

说起静态代码检查,大家首先想起来的可能是,相比只支持代码,不仅支持,代码,也支持资源文件规范检查,那么我们为什么不使用呢

在我看来,在使用上主要有两个问题

  1. 与集成不够好,自定义规则的警告只有在运行后才会在上展示出来,在之后又会消失
  2. 检查速度较慢,尤其是大型项目,只对增量代码进行检查的逻辑需要自定义

而提供了插件,开启后可直接在中查看警告,这样可以在第一时间发现问题,避免后续检查发现问题后再修改流程过长的问题

同时支持命令行方式接入与方式接入,支持只检查新增代码,在检查速度上比起也有一定的优势

如果能在中提示代码中存在的问题,应该是最快发现问题的方式,也贴心的为我们准备了插件,如下所示

主要可以配置以下内容

  1. 开关
  2. 格式化开关,直接使用了的规则
  3. :规则配置文件,可以在其中配置各种规则的开关与参数,默认配置可见:default-detekt-config.yml
  4. :基线文件,跳过旧代码问题,有了这个基线文件,下次扫描时,就会绕过文件中列出的基线问题,而只提示新增问题。
  5. : 自定义规则包,在自定义规则后打出包,在扫描时就可以使用自定义规则了

插件可以实时提示问题(包括自定义规则),如下图所示,我们添加了自定义禁止使用的规则

对于一些支持自动修复的格式问题,插件支持自动格式化,同时也可以配置快捷键,一键自动格式化,如下所示

支持通过命令行方式接入,支持只检测几个文件,比如本次提交的文件

我们可以通过如下方式,下载的然后使用

 

支持很多参数,下面列出一些常用的,其他可以参见:Run detekt using Command Line Interface

 

在命令行可以直接通过如下方式检查

 

通过如上方式进行代码检查速度是非常快的,根据经验来说一般就是几秒之内可以完成,因此我们完成可以将与结合起来,在每次提交的时候进行检测,而如果是一些比较耗时的工具比如,应该是做不到这一点的

类型解析

上面我们提到了,的参数与参数,这些是用于类型解析的。

类型解析是的一项功能,它允许 对您的 源代码执行更高级的静态分析。

通常, 在编译期间无法访问编译器语义分析的结果,我们只能获取源代码的抽象语法树,却无法知道语法树上符号的语义,这限制了我们的检查能力,比如我们无法判断符号的类型,两个符号究竟是不是同一个对象等

通过启用类型解析, 可以获取编译器语义分析的结果,这让我们可以自定义一些更高级的检查。

而要获取类型与语义,当然要传入依赖的,也就是,比如项目中常常需要传入与

方式检测虽然快,但是需要手动传入,比较麻烦,尤其是有时候自定义规则需要解析我们自己的类而不是中的类时,那么就需要将项目中的代码的编译结果传入作为了,这样就更麻烦了

同样支持插件方式接入,这种方式不需要我们另外再配置,我们可以将命令行方式与方式结合起来,在本地通过方式快速检测,在上通过插件进行完整的检测

接入步骤

 

如上所示,接入主要需要做这么几件事

  1. 引入插件
  2. 配置插件,主要是配置与,即规则开关与老代码过滤
  3. 引入与自定义规则的依赖
  4. 配置,用于类型解析,但不用再配置了。
  5. 除了之外,也可以通过与的方式指定只扫描指定文件的方式来实现增量检测

通过以上方式就接入成功了,运行就可以开始检测了,扫描结果可在终端直接查看,并可以直接定位到问题代码处,也可以在路径下查看输出的报告文件

要落地自己制定的代码规范,不可避免的需要自定义规则,当然我们首先要看下自带的规则,是否已经有我们需要的,只需把开关打开即可.

自带规则

自带的规则都可以通过开关配置,如果没有在 闭包中指定 属性, 会使用默认的规则。这些规则采用 文件描述,运行 会生成 文件,我们可以在这个文件的基础上制定代码规范准则。

中的每条规则形如

 

更多关于配置文件的修改方式,请参考官方文档-配置文件

的规则集划分为 9 个大类,每个大类下有具体的规则

规则大类说明comments与注释、文档有关的规范检查complexity检查代码复杂度,复杂度过高的代码不利于维护coroutines与协程有关的规范检查empty-blocks空代码块检查,空代码应该尽量避免exceptions与异常抛出和捕获有关的规范检查formatting格式化问题,detekt直接引用的 ktlint 的格式化规则集naming类名、变量命名相关的规范检查performance检查潜在的性能问题potentail-bugs检查潜在的BUGstyle统一团队的代码风格,也包括一些由 Detekt 定义的格式化问题

更细节的规则说明,请参考:官方文档-规则集说明

自定义规则

接下来我们自定义一个检测使用的规则,如下所示

 

代码其实并不复杂,主要做了这么几件事

  1. 添加作为自定义规则的入口,并将添加进去
  2. 实现类,主要包括与各种方法
  3. 属性用于定义在控制台或任何其他输出格式上打印的、严重性和提示信息
  4. 即通过访问者模式访问语法树的回调,当访问到时会回调,我们在这里检测有没有添加,发现存在则报告异常

支持类型解析的自定义规则

上面的规则没有用到类型解析,也就是说不传入也能使用,我们现在来看一个需要使用类型解析的自定义规则

比如我们需要在项目中禁止直接使用,而是使用我们统一封装的工具类,那么我们可以自定义如下规则

 

可以看出,我们在回调中检测表达式,我们不仅需要判断是否存在表达式,因为可能存在同名类,更需要判断类的具体类型,而这就需要获取语义信息

我们这里通过来获取表达式的语义,这里的其实就是编译器存储语义信息的表,详细的可以参阅:K2 编译器是什么?世界第二高峰又是哪座

当我们获取了语义信息之后,就可以获取的具体类型,就可以判断出这个是不是,也就可以完成检测了

在完成了接入与自定义规则之后,接下来就是每次提交代码时在上进行检测了

一些大的开源项目每次提交都会进行一系列的检测,我们也用来实现一个

我们在目录添加如下代码

 

这样在每次提交的时候,就都会自动调用该进行检测了,检测不通过则不允许合并,如下所示

点进去也可以看到详细的报错,具体是哪一行代码检测不通过,如图所示

本文主要介绍了的接入与如何自定义规则,通过集成,命令行方式与插件方式接入,以及自动检测,可以保证代码规范,提示,检测三者的统一,方便提前暴露问题,提高代码质量。

如果本文对你有所帮助,欢迎点赞~

示例代码

本文所有代码可见:github.com/RicardoJian…

参考资料

detekt.dev/docs/intro
代码质量堪忧?用 detekt 呀,拿捏得死死的~

作者:程序员江同学
链接:https://juejin.cn/post/7152886037746827277

  • 使用 Kotlin 进行服务器端开发
  • 使用 Kotlin 进行 Android 开发
  • Kotlin JavaScript 概述
  • Kotlin/Native 用于原生开发
  • 用于异步编程等场景的协程
  • Kotlin 1.1 的新特性
  • Kotlin 1.2 的新特性
  • Kotlin 1.3 的新特性
  • 基本语法
  • 习惯用法
  • 编码规范
  • 基本类型
  • 控制流:if、when、for、while
  • 返回和跳转
  • 类与继承
  • 属性与字段
  • 接口
  • 可见性修饰符
  • 扩展
  • 数据类
  • 密封类
  • 泛型
  • 嵌套类与内部类
  • 枚举类
  • 对象表达式与对象声明
  • Inline classes
  • 委托
  • 函数
  • 高阶函数与 lambda 表达式
  • 内联函数
  • 解构声明
  • 集合:List、Set、Map
  • 区间
  • 类型的检查与转换“is”与“as”
  • This 表达式
  • 相等性
  • 操作符重载
  • 空安全
  • 异常
  • 注解
  • 反射
  • 类型安全的构建器
  • 类型别名
  • 多平台程序设计
  • 关键字与操作符
  • 在 Kotlin 中调用 Java 代码
  • Java 中调用 Kotlin
  • JavaScript 动态类型
  • Kotlin 中调用 JavaScript
  • JavaScript 中调用 Kotlin
  • JavaScript 模块
  • JavaScript 反射
  • JavaScript DCE
  • 协程基础
  • 取消与超时
  • 通道 (实验性的)
  • 组合挂起函数
  • 协程上下文与调度器
  • 异常处理
  • select 表达式(实验性的
  • 共享的可变状态与并发
  • 编写 Kotlin 代码文档
  • Kotlin 注解处理
  • 使用 Gradle
  • 使用 Maven
  • 使用 Ant
  • Kotlin 与 OSGi
  • 编译器插件
  • 不同组件的稳定性
  • FAQ
  • 与 Java 语言比较
  • 与 Scala 比较【官方已删除】

  • Kotlin 概述
  • Kotlin 与 Java 比较
  • 巧用 Android Studio
  • 认识 Kotlin 基本类型
  • 走进 Kotlin 的数组
  • 走进 Kotlin 的集合
  • 完整代码
  • 基础语法
  • 方法入参是常量,不可修改
  • 不要 Companion、INSTANCE
  • Java 重载,在 Kotlin 中怎么巧妙过渡一下
  • Kotlin 中的判空姿势
  • Kotlin 复写 Java 父类中的方法
  • Kotlin “狠”起来,连TODO都不放过
  • is、as` 中的坑
  • Kotlin 中的 Property 的理解
  • also 关键字
  • takeIf 关键字
  • 单例模式的写法
  • 从一个膜拜大神的 Demo 开始
  • Kotlin 写 Gradle 脚本是一种什么体验
  • Kotlin 编程的三重境界
  • Kotlin 高阶函数
  • Kotlin 泛型
  • Kotlin 扩展
  • Kotlin 委托
  • 协程“不为人知”的调试技巧
  • 图解协程:suspend
最新文章
邯郸移动获中型城市网络质量综合排名前十
近日,第三届移动网络高质量发展论坛会议发布了“2023年度全国重点区域移动网络质量评测现场路测结果”,邯郸移动在中型城市中网络质量综合得分排名全国前十。据悉,2023年工信部委托中国信通院组织开展了全国重点区域移动网络质量“百城”
焦虑还是效率?独立站卖家的AI效率之争
在数字化的巨浪中,人工智能(AI)技术的兴起为独立站注入了创新的动力。或是智能客服即时反馈,或是通过个性化推荐系统精准地满足用户搜索需求。借助其卓越的数据处理能力和自我学习能力,AI正在帮助独立站卖家实现更加智能化、高效的运营
谷歌SEO公司效果如何,如何选择优质服务?
在当下这个数字化时代,企业要想在激烈的市场竞争中脱颖而出,提升在线可见度至关重要。而谷歌SEO,作为提升网站在谷歌搜索引擎结果页(SERPs)排名的有效手段,无疑成为了众多企业的首选。作为一名拥有多年谷歌SEO实战经验的专业人士,我
文化这一年·艺术︱缤纷展览绘出京城艺术画卷
岁末的京城,接踵而至的新展令观众目不暇接:嘉德艺术中心的澄凝琼英故宫博物院藏玻璃精品展荟萃了中西方玻璃文物,来自英国利物浦国家博物馆近百件艺术原作与珍贵器物亮相国家大剧院,北京画院美术馆展出建筑大师童寯笔下百年前的欧洲风光
调用小红书API接口,实现关键词采集笔记正文、转评赞藏等,并封装exe软件!
熟悉我的小伙伴都了解,我之前发布过2款软件: 【GUI软件】小红书搜索结果批量采集,支持多个关键词同时抓取!【GUI软件】小红书详情数据批量采集,含笔记内容、转评赞藏等,支持多笔记同时采集࿰
杭州网站优化公司,专业提升企业网站效益
本文将对杭州网站优化公司如何提升企业网站效益进行详细阐述。首先,我们将从网站内容优化、页面优化、用户体验优化和搜索引擎优化这四个方面展开讨论,为您全面解析专业的网站优化服务如何提升企业的线上效益。专业的网站内容优化不仅可以
浩瀚深度发布AI大模型与AIGC伪造检测系统,加速全面人工智能化
在人工智能飞速发展的当下,国内众多科技公司争相把握“数字中国建设”的重大战略机遇,力求在这一领域取得突破性进展。近日,浩瀚深度正式发布了两款重要的人工智能产品:浩瀚AI大模型和AIGC伪造检测系统。这一举措不仅代表了公司在技术上
信息安全基础(习题卷14).pdfVIP
试卷科目:信息安全基础(习题卷14)第1部分:单项选择题,共152题,每题只有一个正确答案,多选或少选均不得分。1.[单选题]目前用户局域网内部区域划分通常通过实现()A)物理隔离B)Vlan划分C)防火墙防范答案:B解析:2.[单选题]黑客造成的主要安
移动端seo如何优化,需要做单独的m域名移动端googleseo优化吗?
【e6zzseo】专注seo搜索引擎优化技术8年以上,更新关于seo优化技术、seo推广、分享SEO优化工具、最新前沿seo套路技术研究开发。  今天有谷歌seo问了个问题:现在还有必要做m移动端优化?会不会显得多余了。​看看网友们
楼阳生在超硬材料产业高质量发展座谈会上强调 抢占前沿赛道 强化聚链成群 加快打造超硬材料产业新高地
  12月6日,省委书记楼阳生主持召开超硬材料产业高质量发展座谈会,听取我省超硬材料产业发展情况汇报,并与相关企业负责人和高校、科研院所专家一起,研究推动我省超硬材料产业高质量发展。  省工业和信息化厅、郑州市分别作了汇报。
相关文章
推荐文章
发表评论
0评