前言

在Java面向对象课程的学习过程中,我们需要使用度量工具来分析自己程序的代码结构。受OO课程组以及前辈们博客提醒,笔者找到了DesigniteJava这款软件,现对此软件进行简单的说明。

一、DesigniteJava的下载与使用

Designite是一款程序设计的质量评估工具。这款工具可以用于分析Java的代码,并且识别其中存在的质量问题。Designite会检测程序的架构(architecture),设计(design)和代码异味(code smell)并且给出详细的度量分析(metrics analysis)。

Designite for Java:http://www.designite-tools.com/DesigniteJava/

最近刚和IDEA互动:https://plugins.jetbrains.com/plugin/13380-designitejava/versions

进入官网Designite for Java,下载会得到一个jar包,默认名为DesigniteJava.jar。将其放在方便使用的位置,打开命令行窗口,输入以下代码即可运行:

java -jar DesigniteJava.jar -i <源码路径> -o <分析数据输出路径>

image

输出之后,会得到以下文件。

image

二、度量指标介绍

以下截取自这里

许多翻译十分抽象,笔者没有找到好的解释,欢迎作注。

  • Detects 20 design smells 能检测20种设计异味命令抽象

    • Duplicate Abstraction:

      重复抽象,This smell arises when two or more abstractions have identical names or identical implementation or both.

    • Feature Envy:

      This smell occurs when a method seems more interested in an abstraction other than the one it actually is in.

    • Imperative Abstraction

      命令抽象,This smell arises when an operation is turned into a class.

    • Multifaceted Abstraction

      多方面抽象,This smell arises when an abstraction has more than one responsibility assigned to it.

    • Unnecessary Abstraction

      不必要的抽象,This smell occurs when an abstraction that is actually not needed (and thus could have been avoided) gets introduced in a software design.

    • Unutilized Abstraction

      未使用的抽象,This smell arises when an abstraction is left unused (either not directly used or not reachable).

    • Deficient Encapsulation

      封装不足,This smell occurs when the declared accessibility of one or more members of an abstraction is more permissive than actually required.

    • Unexploited Encapsulation

      未开发封装,This smell arises when client code uses explicit type checks (using chained if-else or switch statements that check for the type of the object) instead of exploiting the variation in types already encapsulated within a hierarchy.

    • Broken Modularization

      模块化中断,This smell arises when data and/or methods that ideally should have been localized into a single abstraction are separated and spread across multiple abstractions.

    • Cyclic-Dependent Modularization

      循环相关模块化, This smell arises when two or more abstractions depend on each other directly or indirectly (creating a tight coupling between the abstractions).

    • Insufficient Modularization

      模块化不足 ,This smell arises when an abstraction exists that has not been completely decomposed, and a further decomposition could reduce its size, implementation complexity, or both.

    • Hub-like Modularization

      轮毂式模块化,This smell arises when an abstraction has dependencies (both incoming and outgoing) with a large number of other abstractions.

    • Broken Hierarchy

      断裂的层次结构,This smell arises when a supertype and its subtype conceptually do not share an “IS-A” relationship resulting in broken substitutability.

    • Cyclic Hierarchy

      循环层次结构,This smell arises when a supertype in a hierarchy depends on any of its subtypes.

    • Deep Hierarchy

      层次过深,This smell arises when an inheritance hierarchy is “excessively” deep.

    • Missing Hierarchy

      缺少层次结构,This smell arises when a code segment uses conditional logic (typically in conjunction with “tagged types”) to explicitly manage variation in behavior where a hierarchy could have been created and used to encapsulate those variations.

    • Multipath Hierarchy

      多路径层次结构,This smell arises when a subtype inherits both directly as well as indirectly from a supertype leading to unnecessary inheritance paths in the hierarchy.

    • Rebellious Hierarchy

      叛逆性层次结构,This smell arises when a subtype rejects the methods provided by its supertype(s).

    • Wide Hierarchy

      层次过宽,This smell arises when an inheritance hierarchy is “too” wide indicating that intermediate types may be missing.

    • Unfactored Hierarchy:

      This smell arises when there is unnecessary duplication among types in a hierarchy.

  • Detects 10 implementation smells 检测10种实现异味

    • Abstract Function Call From Constructor

      构造函数调用抽象函数

    • Complex Conditional

      复杂条件

    • Complex Method

      复杂的方法

    • Empty catch clause

      空catch子句

    • Long Identifier

      长标识符

    • Long Method

      长方法

    • Long Parameter List

      长参数列表

    • Long Statement

      长语句

    • Magic Number

      魔法数字,在编程领域指的是莫名其妙出现的数字。数字的意义必须通过详细阅读才能推断出来。

      一般魔法数字都是需要使用枚举变量来替换的。

    • Missing default

      缺少默认值

  • Computes following object-oriented metrics 能计算以下面向对象的度量

    • LOC (Lines Of Code - at method and class granularity)

      代码行数

    • CC (Cyclomatic Complexity - Method)

      圈复杂度,用于衡量一个模块判定结构的复杂程度,圈复杂度越大说明程序代码质量低,且难以测试和维护。

    • PC (Parameter Count - Method)

      方法中传入的参数个数。

    • NOF (Number of Fields - Class)

      类的字段个数。

    • NOPF (Number of Public Fields - Class)

      类的公共字段个数。

    • NOM (Number of Methods - Class)

      类的方法个数。

    • NOPM (Number of Public Methods - Class)

      类的公共方法个数。

    • WMC (Weighted Methods per Class - Class)

      类的加权方法个数。

    • NC (Number of Children - Class)

      类的子类个数。

    • DIT (Depth of Inheritance Tree - Class)

      类的继承树深度。

    • LCOM (Lack of Cohesion in Methods - Class)

      方法的内聚缺乏度。

    • FANIN (Fan-in - Class)

      类调用的上级模块的个数。

    • FANOUT (Fan-out - Class)

      类直接调用的下级模块的个数。

    稍微解释一下最后三个值:

    • 秉承着高内聚低耦合的思想,LCOM的值越小越好,FANIN和FANOUT与复用性和复杂度有关,视情况判断好坏

    • FANIN和FANOUT

      • (A)FANIN(扇入)

        扇入表示一个模块被多个模块调用。

        image

      • (B)扇出

        扇出表示一个模块调用多个模块。

        image

Java代码度量分析工具:DesigniteJava简介的更多相关文章

  1. Java代码度量分析工具:Designite简介

    前言 在Java面向对象课程的学习过程中,我们需要使用度量工具来分析自己程序的代码结构.此类的度量工具有许多,或以插件形式存在于各个IDE中,或以.jar包的形式供用户使用.在这里,笔者向大家简单的介 ...

  2. Java代码混淆工具ProGuard

    目录 Java代码混淆工具ProGuard 简介 描述 作用的环境 功能 工作原理 下载 使用时注意事项 版本问题 JDK位数问题 Java的字节码验证问题 关于使用类似于Hibernate的对象关系 ...

  3. eclipse Java代码折叠工具

      eclipse Java代码折叠工具 CreateTime--2018年5月17日15点09分 Author:Marydon 1.问题描述 eclipse自带的代码折叠工具,无法折叠try{}ca ...

  4. Findbug插件静态java代码扫描工具使用

    本文转自http://blog.csdn.net/gaofuqi/article/details/22679609 感谢作者 FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具. ...

  5. 把调试好的SQL语句转换为JAVA代码小工具

    关键点:Pattern实现SQL拆解.ZeroClipboard.js实现复制到剪切板 主要代码: <%@ page language="java" import=" ...

  6. GitLab - 代码仓库管理工具GitLab简介

    1 - GitLab 基于git的开源的仓库管理系统项目,使用git作为代码管理工具,并在此基础上搭建web服务,拥有与Github类似的功能. 社区版(Community Edition,CE) 企 ...

  7. Gerrit - 代码评审工具Gerrit简介与安装

    1 - 前言 Code Review 代码评审是指在软件开发过程中,对源代码的系统性检查,改进代码质量,查找系统缺陷,保证软件总体质量和提高开发者自身水平. 简单的说,Code Review是用来确认 ...

  8. java 代码分析工具——JDepend

    最近学习Mybatis的官方文档,看到了[项目文档]一节有很多内容没有见过,做个笔记,理解一下. 百科上的介绍,我竟然都看懂了,那就不找其他地方的资料了. JDepend 一个开放源代码的可以用来评价 ...

  9. [改善Java代码]让工具类不可实例化

    建议42: 让工具类不可实例化 Java项目中使用的工具类非常多,比如JDK自己的工具类java.lang.Math.java.util.Collections等都是我们经常用到的.工具类的方法和属性 ...

随机推荐

  1. 力扣832. 翻转图像-C语言实现-简单题

    题目 传送门 文本 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...

  2. python2与python3共存时的pip问题

    在树莓派上同时安装有python2和python3,初始的pip是9.01版本,用pip install django只能安装到1.11版本,但是我需要2.0的django. 于是升级pip: pyt ...

  3. 如何掌握 C 语言的一大利器——指针?

    一览:初学 C 语言时,大家肯定都被指针这个概念折磨过,一会指向这里.一会指向那里,最后把自己给指晕了.本文从一些基本的概念开始介绍指针的基本使用. 内存 考虑到初学 C 语言时,大家可能对计算机的组 ...

  4. DES加密详解

    目录 1 根据输入的秘钥得到16个子秘钥 1.1 大致流程 1.2 利用PC-1从K_0中挑出K_1 1.3 利用PC-2从K_1中挑出16个子秘钥 2 利用16个子秘钥对明文进行加密 2.1 大致流 ...

  5. Mybatis系列全解(六):Mybatis最硬核的API你知道几个?

    封面:洛小汐 作者:潘潘 2020 年的大疫情,把世界撕成几片. 时至今日,依旧人心惶惶. 很庆幸,身处这安稳国, 兼得一份安稳工. · 东家常讲的一个词:深秋心态 . 大势时,不跟风.起哄, 萧条时 ...

  6. OSI协议简述版

    OSI简介 OSI只是计算机网络中的一种协议名称缩写,它只是电脑间传输数据的协议,并不代表具体的物理设备,并且这种协议,只是被人为的划分为五层:物理层.数据链路层.网络层.传输层.应用层.记住,它只是 ...

  7. 漏洞复现-2.x rce-Thinkphp远程命令执行

                0x00实验环境 攻击机:win10 靶机:Ubuntu18 (docker搭建的vulhub靶场) 0x01影响版本 影响Thinkphp 2.x的版本 0x02实验目的 学 ...

  8. 【工具】 memtester内存压力测试工具

    作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14497838.html 目录 一.简介 二.Memtester安装 三.使用说明 四.测试示例 一.简介 mem ...

  9. 浅析MyBatis(一):由一个快速案例剖析MyBatis的整体架构与运行流程

    MyBatis 是轻量级的 Java 持久层中间件,完全基于 JDBC 实现持久化的数据访问,支持以 xml 和注解的形式进行配置,能灵活.简单地进行 SQL 映射,也提供了比 JDBC 更丰富的结果 ...

  10. sprintgboot+springsecurity的跨域问题,

    整个项目是使用前后端分离的形式开发,登录接口部分出现了问题, 重写了security的登录接口,返回json数据 到这一步已经没有没有问题了,使用postman测试,也可以看到接口返回的结果,但是使用 ...