FCon7折倒计时最后一周:日程已上线70%!查看详情>>> 了解详情
写点什么

静态分析工具可以突出更深层次的问题

  • 2007-12-15
  • 本文字数:1028 字

    阅读完需:约 3 分钟

FindBugs PMD CheckStyle 以及 IntelliJ IDEA 等等提供的静态代码分析(Static code analysis,SCA)工具可以帮助开发团队捕捉到代码中的问题,来保证程序的高质量。但是当 SCA 工具标记了一个问题之后,团队应该如何作出反应呢?Vikas Hazrati 在“静态代码分析仅仅是冰山一角”一文中建议:深入探索。

如果团队对 SCA 标记的问题达成了共识,那么他们会修复这个问题。然而,在很多情况下,被标记的问题可以突出一些更深层次的问题,而且这些问题隐藏较深,也不容易被代码分析工具侦测到:

当我对一个有数百万在线用户的大型系统进行审计的时候,我第一次深入洞察到更深层次的问题。在分析的过程中,我的审计助手(co-auditor)提议检查一下 SCA 工具高亮提示的热点。然后,我们深入到那块代码中并发现了更大的问题。

Vikas 列举了五个由静态分析标记的问题发现代码中更深层次问题的例子。如,当发现一些 servlet 有 3500 行之巨,还包含长达 800 行的方法时:

一种快速的修改方式就是分离方法体来减小方法大小,将一些方法迁移到助手类(helper class)中减小类的大小,这样就解决了类大小和方法大小的违规。

但是,当我们尝试回答“为什么这些 servlet 包含了如此多的代码和巨大的方法?”来深入探索原因的时候,我们意识到所有的业务逻辑都放在了这些 servlet 中。将所有的逻辑放入一个类中严重的违反了单一职责原则。表现逻辑、业务逻辑和数据访问逻辑掺杂在一起导致脆弱的设计,这样很难在不破坏原 有设计的基础上做出变动。各种关系之间没有任何分层和分离。

同样,当发现带有大量参数的方法时:

解决这个问题并让 SCA 工具不再警告的快捷方式就是引入一个对象,将所需的参数封装起来。

但是,当我们深入研究时就发现,这个系统中没有任何抽象。系统中也没有领域对象。当需要在方法调用之间传递数据时,所有的数据都是简单数据,大多是字符 串。这说明系统并没有采用领域驱动设计。在不同的场景下,需要根据需求来重载(overload)这些方法加入额外的参数,这暗示着这个系统对修改开放, 对扩展关闭。每一个小的修改都需要增加新的方法。这违反了开闭原则。

查看英文原文 Static Code Analysis can Highlight Deeper Flaws


译者简介:苑永凯,软件设计师,毕业于山东大学。主要关注领域为 Java EE 企业应用、Java EE 中间件技术以及敏捷开发方法实践,微有心得。他的 Blog 为 http://blog.csdn.net/ai92 ,您也可以通过 yuanyk@gmail.com 与他联系。参与 InfoQ 中文站内容建设,请邮件至 china-editorial@infoq.com

2007-12-15 02:14853

评论

发布
暂无评论
发现更多内容

【LeetCode】主要元素Java题解

Albert

算法 LeetCode 7月日更

【Flutter 专题】92 图解 Dart 单线程实现异步处理之 Isolate (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

WorkPlus房地产行业数字化解决方案—富力地产

WorkPlus

开源 远程办公 即时通讯 IM

在线base64加密解密工具

入门小站

工具

一个完整的项目管理流程包括什么?

万事ONES

项目管理 ONES

WICC 2021召开在即 清华大学教授将分享AI+网络音视频服务研究

融云 RongCloud

互斥锁Mutex:鸿蒙轻内核中处理临界资源独占的“法官”

华为云开发者联盟

鸿蒙 OpenHarmony 鸿蒙轻内核 互斥锁Mutex 临界资源

Vue3 + TypeScript 开发实践总结

程序员海军

typescript 大前端 Vue3 框架

图的应用——关键路径

若尘

数据结构

与微软、IBM同台 斯图飞腾Stratifyd入选G2文本分析Grid报告

见康乘拼团软件开发|见康乘拼团系统APP开发

多项目同时进行如何做好项目管理?

万事ONES

小白也能看懂的Java内存模型

程序猿阿星

JMM Java内存模型 原子性 有序性 可见性;

Rust从0到1-智能指针-Drop trait

rust smart pointer drop trait

pha挖矿/phala挖矿APP系统开发内容

毕业季offer怎么拿?收下这份非典型求职面试指南

华为云开发者联盟

面试 职业规划 求职 毕业季 大学生

Fil和BTC有什么区别?Filecoin挖矿的行情如何?

IPFS BTC fil fil币

如何对开发团队的人员进行绩效管理?

万事ONES

研发效能 ONES 绩效管理

智汇华云|华云数据ArSDN:自主可控的SDN

华云数据

就在今天,浪潮云说第二期来啦

浪潮云

云计算

原来这就是Java IO啊····

华为云开发者联盟

Java 操作系统 进程 IO流 Java IO

FIL矿机多少钱一台 ?FIL挖矿成本是多少?

架构实战营模块8 课后作业

En wei

架构实战营

测试开发之网络篇-常用命令

禅道项目管理

Linux 命令行

pha分币APP系统开发资料

腾讯一面 Java Phaser 并发编程的理解与应用

陈皮的JavaLib

Java 面试 多线程

Spring到底应该学哪些内容?

冰河

spring aop ioc 注解驱动 依赖反转

深入理解搜索引擎——初识query理解

药老算法

搜索引擎 中文分词 query理解 query纠错 query分析

Redisson 分布式锁源码 07:公平锁释放

程序员小航

Java redis 源码 分布式锁 redisson

手写链表之LinkedList源码分析

Ayue、

数据结构

永续合约交易所搭建,合约平台开发

  • 扫码添加小助手
    领取最新资料包
静态分析工具可以突出更深层次的问题_研发效能_Geoffrey Wiseman_InfoQ精选文章