Java方法中的参数太多,第8部分:工具

在我的系列文章的前七篇文章中,有关处理Java方法中期望的参数过多的内容集中在减少方法或构造函数期望的参数数量的替代方法上。 在本系列的第八篇文章中,我将介绍一些工具,这些工具可帮助您确定可能存在过多参数的情况,并在出现这种情况时帮助对其进行处理。

对于方法或构造函数中过多的参数,实际上并没有硬性规定 。 在许多方面,这都是一个问题,在某种程度上取决于这些参数是什么,它们是否使用自定义类型而不是原始类型和重复类型,以及是否存在可能需要传递null的可选参数。

罗伯特·马丁 ( Robert Martin )在《 清洁代码》中写道 (第40页):


函数的理想参数个数为零(尼拉度)。 接下来是一个(单声道),紧接着是两个(双声道)。 在可能的情况下,应避免使用三个参数(三重性)。 超过三个(多义词)需要非常特殊的理由-因此无论如何都不应使用。

在《代码完成》中 , 史蒂夫·麦康奈尔 ( Steve McConnell)写道,开发人员应“将例程参数的数量限制为七个左右”,因为“七个对于人们的理解是一个神奇的数字。” 我不认为有任何设定的最大参数数目,但是七个似乎确实很少超过“经验法则”,而且我通常更喜欢较小的数目,例如Martin建议的参数少于三个。

“眼睛测试”

体育谈话和体育写作中有一个共同的表达,即某些球员或球队“没有通过视力测验”。 我对这种表达的理解是,这意味着,尽管与该球员或团队相关的积极统计数据不尽相同,但观看球员或团队的比赛会让人们相信他们并不如统计数据所示。 换句话说,以一种难以描述的方式,观看者感到球队或球员并不像他们的统计数据所暗示的那样熟练。

在许多方面,软件开发都有自己的“眼力测试”,可以告诉我们某些事情的好坏比“规则”所暗示的要好。 尽管如此,我们仍然拥有关于“什么规则”或一般性指导原则,以了解如何构成良好的软件习惯,就像体育比赛中有统计数据试图客观地对比球队和球员一样。 例如,在软件中,我们可能会说“较少的参数通常比更多的参数要好。” Tooling的最大局限性在于它无法为我们执行“眼力测试”,但可以帮助我们确定潜在的改进领域。 换句话说,工具可以帮助报告游戏或比赛的“统计数据”,但是我们必须对工具所报告的内容做出自己的判断(“眼力测试”)。

静态分析工具

静态分析工具可用于自动识别可能期望太多参数的方法或构造函数。 一旦确定了可能带有太多参数的方法和构造函数,开发人员便可以对它们进行“外观测试”以确定是否应采取纠正措施。

PMD

PMD (带有幽默的口号“ Do n't Shoot the Messenger”)是一个“源代码分析器”,可以“发现”多种编程语言(包括Java)中的常见编程缺陷。 PMD的规则之一是“ ExcessiveParameterList ”(PMD 4.3中的LongParameterListRule而不是ExcessiveParameterList )。 触发此规则时, PMD提供的操作是“尝试将参数分组在一起”和“应创建一个新对象以包装大量参数”(请参阅​​我关于参数对象的文章 )。 较新的PMD文档这样说:“具有众多参数的方法很难维护,特别是如果大多数方法共享相同的数据类型时。 这些情况通常表示需要新对象来包装大量参数。”

任何工具都必须具有指定数量的被认为“太多”的参数。 在PMD的情况下,该默认数字为10。请注意,此触发PMD规则的默认最小阈值高于Steve McConnell建议的7个最大参数,并且大大高于Robert Martin建议的少于三个参数。

可通过PMD插件获得NetBeans PMD支持 。 也可以通过软件质量环境插件获得NetBeans PMD支持。 我在以前的文章NetBeans 7和软件质量环境以及在NetBeans 7中配置SQE插件中对此进行了介绍。 QAPlug-PMD是用于IntelliJ IDEA的类似插件,而PMD Eclipse可用于Eclipse 。

Checkstyle

与PMD一样, Checkstyle 会检测并警告过多的方法和构造函数参数。 Checkstyle在其主页上定义为“一种开发工具,可帮助程序员编写遵守编码标准的Java代码。” 具体来说,Checkstyle为ParameterNumber “ check ”提供了描述,“检查方法或构造函数的参数数量。” 在Checkstyle的情况下,构造函数或方法的默认“最大参数允许数量”为7(与Steve McConnell的建议相同)。

Checkstyle可以使用Checkstyle Beans插件与NetBeans结合使用。 像NetBeans PMD支持一样,也可以通过前面提到的Software Quality Environment获得NetBeans中的Checkstyle支持。 eclipse-cs插件支持将Checkstyle与Eclipse集成,而Checkstyle-IDEA是IntelliJ IDEA的类似插件。

CodePro Analytix

CodePro Analytix是Google Java开发人员工具的一部分 ,被描述为 “针对关注提高软件质量,降低开发成本和进度的Eclipse开发人员的首要Java软件测试工具。” 它包括代码审核功能,其中一类规则是“ 程序复杂性” 。 这些规则之一是“ 大量参数 ”规则。 该规则的摘要是“方法不应包含太多参数”,其描述为:“此审核规则将查找具有超过指定数量参数的方法。 超过此数目的方法可能太复杂了。 考虑将与它们相关的某些价值和行为移到一个单独的类中。”

还值得注意的是,CodePro Analytix还支持“平均参数数量”指标用于指标报告。 此度量标准报告每个方法的平均参数数量,但不包括构造函数。

NetBeans Java代码度量提示

我已经提到了用于Checkstyle和PMD的NetBeans插件,但是我在NetBeans中最喜欢的功能之一是大量且高度可定制的内置NetBeans提示和检查 。 NetBeans 7.4引入了一种全新的提示类别,称为“ Java代码度量 ”,这些新提示之一是“构造函数声明了太多参数”提示。 此提示描述为“使用太多参数的Reports构造函数。 构造函数通常比常规方法采用更多的参数,尤其是在初始化大对象时。 大量参数表示设计不良。 将来可能还会添加更多参数,因此应考虑使用诸如Builder之类的创建模式。” 在本系列的上一篇文章中,我讨论了构建器模式的应用,甚至讨论了如何使用NetBeans重构构建器。

另一个新添加的提示“ Method声明了太多参数”被描述为“ Reports方法使用了太多参数”。 具有大量参数的方法表明设计不良。 将来可能会添加更多的参数,因此应将这些参数分组到一个Command Object中,从而降低维护成本。 另外,该方法可以重构为几种方法,每种方法都完成任务的一部分,并且在输入时需要较少的参数。” 推荐的方法本质上与我在本系列文章的前面博客中提到的parameter object方法相同。

默认情况下,NetBeans 7.4的“ Java代码度量”类别中的所有提示均被禁用。 在他的博客文章“ 我的代码到底有多混乱? ”,“偶尔”的NetBeans博客Geertjan Wielenga演示了如何将Java代码度量标准配置为活动状态。

下一个屏幕快照演示了NetBeans 7.4中Java Code Metrics的使用。 通过选择“源”,然后选择“检查...”(将打开NetBeans 7.4“检查”窗口)进行配置。

netbeans7_4_sourceInspect

在“检查”窗口中选择“使用”标签和“配置”项目符号旁边的下拉菜单时,可以使用下一个屏幕快照中指示的选项。

netbeans7_4_inspect_configurations

netbeans7_4_inspect_configurations选择

出于演示目的,我选择“所有分析”,然后单击“检查”按钮。 下一个屏幕快照演示了正在进行的检查/分析。

netbeans7_4_inspection_progress

NetBeans Inspect机制“开箱即用”,发现了我的代码中缺少Javadoc语句的一堆,但是没有用太多参数标记构造函数和方法。 为了解决这个问题,我需要遵循Geertjan博客文章中的步骤。 为此,我可以单击Source | 检查并为“配置”选择“默认”。

netbeans7_4_inpect_Default_configuration

选择“默认”使我现在可以单击“管理...”按钮,然后单击该按钮将显示“配置”窗口。

netbeans7_4_configurations_window

单击“默认”标签会导致一个下拉菜单,从中可以选择“新建...”。

netbeans7_4_NewConfigurations

我可以将新配置命名为“ Java Code Metrics”。

netbeans7_4_newJavaCodeMetricsConfiguration

单击“分析器”标签旁边的下拉菜单,可以选择“ NetBeans Java提示”,然后选择该选项可以按类别显示所有NetBeans Java提示。 下一个屏幕快照显示了我可以选择要检查的代码指标。

netbeans7_4_analyzerJavaCodeMetrics

下一个屏幕快照指示我可以选择“构造函数声明太多参数”作为复选框,并选择“方法声明太多参数”作为另一个复选框。

netbeans7_4_constructor_methods_too_many_params_checked

通过新的“ Java代码度量”检查,现在可以通过单击“检查”按钮轻松检查那些特殊问题。

netbeans7_4inspectJavaCodeMetrics

按“检查”以应用新创建的“ Java代码度量”检查,将在以下屏幕快照中显示结果。 第一个图像显示了高级结果,随后的图像显示了通过单击高级结果而提供的更多详细信息。

netbeans7_4_javaCodeMetricsInspectionResults

netbeans7_4_javaCodeMetricsInspectionResultsDetailed

使用我所介绍的所有静态分析工具,对于一个构造函数或方法,可以调整被认为“太多”的参数数量。 借助NetBeans的Java Code Metrics支持,此配置确实非常容易。 接下来的两个屏幕快照展示了这些值是分别在构造器和方法中设置的,这些窗口是在我们检查要检查的选项的同一窗口中设置的。 每个选中选项的扩展窗口包括检查类型的定义和一个用于选择适用参数数量的字段。

netbeans7_4configureNumberParamsTooManyConstructor

能够轻松更改被认为不可接受的参数数量(或至少值得指出以便可以应用“眼图测试”)是一件好事,因为对于不可接受的数量存在如此广泛的意见。

netbeans7_4configureNumberParamsTooManyMethod

如最后一系列屏幕快照所示,NetBeans 7.4允许我们专门检查代码中“参数太多”的方法和构造函数。 在写这篇文章的这一部分时,我想起了NetBeans提供了重要的静态代码分析支持 。

IntelliJ IDEA检查

IntelliJ IDEA提供检查以找出具有过多参数的方法。 “ 参数过多的方法 ”检查描述为:“此检查报告参数过多的方法的所有实例。 参数过多的方法表明必须进行重构。 其签名是从库类继承的方法将被此检查忽略。” 该检查允许配置的方法参数数量过多。

其他静态分析工具

除了我已经集中讨论的工具以外,还有其他工具可以通过静态分析在Java方法或构造函数接受“参数过多”时进行标识和标记。 其中包括Java Coding Standard Checker和Sonar 。 所有这些识别“参数太多”的静态分析工具的存在证明了参数太多可能是维护和可读性的问题。

代码变更工具

到目前为止,本文中讨论的工具在分析代码以查找期望参数过多的现有方法和构造函数方面非常有用。 一旦确定,就可以手动更改/重构这些构造函数和方法,以减少方法的数量,例如我在本系列过多参数的早期文章中概述的方法。 幸运的是,有一些工具可以帮助进行这些重构和新的代码生成工作。 现代Java IDE在重构和代码生成方面特别有用。

重构

构造器的应用程序是我处理构造器参数过多的最喜欢的方法之一。 幸运的是,NetBeans能够依靠大量参数构造函数来自动重构代码以使用构建程序实现。 我以前在“ Java方法中的参数过多,第3部分:构建器模式和NetBeans 7.2:将参数化构造函数重构为Builder”中发表了关于此方法的博客。 IntelliJ IDEA有一个类似的重构工具,称为Builder 。 构建器模式Eclipse插件可用于Eclipse。

代码生成

我最喜欢的处理太多参数的方法包括编写新的自定义类型和创建参数对象 。 现代Java IDE在这里非常有用,可以简化这些类和枚举的生成。 通常只需几分钟即可生成具有适当的toString() , hashCode()和equals(Object)实现的完整类。 很难说要编写自定义类型类和参数对象(命令)类太“昂贵”,因为使用现代Java IDE及其代码生成功能可以很容易地编写它们。

结论

这篇文章的重点是Java开发人员可以用来在Java代码中标识方法和/或构造函数期望太多参数的位置的工具,以及可以轻松修复这些构造函数和方法以接受更合理数量的Java可用的工具。参数。 有几种静态分析工具和IDE支持对期望过多参数的构造函数和方法的快速识别,而现代Java IDE使重构和代码生成变得轻松快捷。 可用于识别“参数过多”问题的大量工具提醒我们,这实际上是一个值得解决的问题。

参考: Java方法中的参数太多,第8部分:来自JCG合作伙伴 Dustin Marx的工具,来自Inspired by Actual Events博客。

翻译自: https://www.javacodegeeks.com/2013/11/too-many-parameters-in-java-methods-part-8-tooling.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

predict函数 R_学习|R语言做机器学习的常用函数总结

预测函数:predict() type"prob"判别该量度的昆虫归类为A、B和C的概率;type"response":判别该量度的昆虫的类别;预测分类的概率的函数predict(…, type)参数type:R语音里面不同模型,参数…

微信小程序:动画(Animation)

简单总结一下微信动画的实现及执行步骤。 一、实现方式 官方文档是这样说的:①创建一个动画实例 animation。②调用实例的方法来描述动画。③最后通过动画实例的 export 方法导出动画数据传递给组件的 animation 属性。 因为小程序是数据驱动的,给这句话…

SSM+solr 通过商品搜索学习solr的简单使用

学习了一下https://github.com/TyCoding/ssm-redis-solr这个github上的solr搜索功能,现在来记录一下。 我的理解就是solr有点类似于数据库,但它是有索引的数据库,按很多字段建立索引,可能是b树或者散列索引,然后就能够…

可以使用中文作为变量名_次氯酸可以作为伤口消毒使用吗?

次氯酸可以作为伤口消毒使用吗?次氯酸在经过2020年的洗礼,已然成为常态化,它对于人体是否有害,也是人们关注的焦点。对于那些还不太了解次氯酸的群体做一下简短科普。什么是次氯酸?次氯酸(HCIO)…

tomcat启动java项目_Java web项目启动Tomcat报错解决方案

点击运行项目时显示 A Java Exception has occurred.Starting Tomcat v9.0 Server at localhost has oncountered a problem.Server Tomcat v9.0 Server at localhost failed tostart.并显示以下两个弹框同时控制台报错org.apache.catalina.startup.Bootstraporg.apache.catali…

matlab 从 excel读取 日期_MATLAB批量修改文件名和选择性复制/剪切文件

今天解决的问题:1、如何利用MATLAB批量修改文件名?(前面写过一次bat命令法,这个应该也算一次改进,程序的初衷是想将Smartsolo导出的文件名批量修改为以炮点桩号为文件名)2、如何利用MATLAB选择性批量复制/剪切文件?(程…

CODE[VS] 1860 最大数 1998年NOIP全国联赛提高组

题目描述 Description设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。 输入描述 Input Description第一行一个正整数n。 第二行n个正整数,空格隔开。 输出描述 Output Description连接成的多位数。…

您基于JEE的Web项目的结构是什么?

在本文中,我将主要与JSF讨论基于Web的项目的各种组织结构。 开始新项目时,首先想到的是如何组织Java包? 想象一下,您开发了一个基于Web的用户和组管理系统。 很长时间以来,我使用以下Java包结构来将Bean类与模型类分开…

自定义scoll样式

使用伪类自定义scroll样式 效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0,maximum-scale1.0,minimum1.0,…

关于常用的编码工具如何引入jar包

myeclipse和eclipse&#xff08;差不多&#xff09;引入jar包&#xff1a; 普通项目&#xff1a; 1.对准你的项目创建一个文件夹名字尽量命名成lib&#xff08;注意要和src平级&#xff0c;不要在src下创建文件夹&#xff09;。 2.将下载好的依赖放到lib文件夹下&#xff0c; 3…

win10商店打不开_win10自带的照片查看器打不开的修复方法

我们知道win10或win7等系统都自带有默认的照片查看器&#xff0c;安装好系统后&#xff0c;我们再不用安装第三方看图软件来查看照片了&#xff0c;给我们玩电脑带来了极大的方便。但有些朋友近来向我求教照片查看器打不开&#xff0c;或打开很慢不正常的问题。下面我来跟大家介…

休眠事实:访存策略的重要性

在使用ORM工具时&#xff0c;每个人都承认数据库设计和实体到表映射的重要性。 这些方面引起了很多关注&#xff0c;而诸如获取策略之类的事情可能只是推迟了。 我认为&#xff0c;不应将实体获取策略与实体映射设计分开&#xff0c;因为除非经过适当设计&#xff0c;否则它可…

自定义checkbox样式

通过选中时添加背景图片自定义CheckBox样式 效果&#xff1a; CSS样式&#xff1a; <style type"text/css>label {width: 10%;display: flex;display: -webkit-flex;display: -moz-flex;flex-direction: row;justify-content: center;align-items: center;}label i…

安装步骤

1、安装node&#xff0c;安装全局webpack&#xff0c;npm init 生成package.json文件全局打包命令webpack b.js -o bundle.js旧版本的是webpack b.js bundle.js2、npm install webpack --save-dev 引入本项目webpack&#xff0c;package.json文件中会生成对应的webpack版本号…

fpu测试_I510400性能及温度测试详解

5月20号&#xff0c;INTEL将正式销售十代民用桌面级处理器&#xff0c;此次上市的型号相对9代与8代来说要多了很多型号&#xff0c;仅I9系列就有4个型号&#xff0c;下图有此次INTEL更新所有型号的参数&#xff1a;从上图参数可知&#xff0c;Intel有史以来I3~I9全部支持超线程…

ADFLogger的SLF4J绑定–缺少的部分

由于最好的原因&#xff0c;在我的日常工作中&#xff0c;我希望为ADF Logger Oracle ADF提供一个SLF4J适配器。 毫不奇怪&#xff0c;slf4j没有用于ADFLogger的适配器&#xff0c;但是由于ADFLogger只是Java Util Logging的轻巧包装&#xff0c;因此花了一个多小时来填补这一空…

c语言int 转bool_C++代码实现逆波兰式_C 语言

100行以内C代码实现逆波兰式逆波兰式(Reverse Polish notation&#xff0c;RPN&#xff0c;或逆波兰记法)&#xff0c;也叫后缀表达式(将运算符写在操作数之后)。算术表达式转逆波兰式例子&#xff1a;逆波兰式整体的算法流程图如下&#xff1a;下面给出我基于C 语言对逆波兰式…

css的再深入9(更新中···)

一 单位 1.px 就是一个基本的单位 像素 2.em 也是一个单位 用父级元素的字体大小乘以em前面的数字。如果父级没有就继承上一个父级直到body&#xff0c;如果body没有那就默认是16px。 3.rem 也是一个单位&#xff0c;只跟根节点<html>的字体大小有关&#xff0c;如果没…

指令的存储与执行初探

前言导读&#xff1a;从零开始构造一台二进制加法器 假设一个处理器与存储器相连&#xff0c;存储器中存放着一些指令。这些指令通过处理器发出的寻址信号被加载到处理器中&#xff0c;这个过程称为取指令。 下面通过简单的加法运算&#xff0c;来看一下指令和数据是怎么存储在…

java 中的流_Java中的流(IO

Java中的流(IO流.java.io包中定义了多个流类型(类或抽象类)来实现 输入 / 输出功能&#xff0c;可以从不同的角度对其进行分类&#xff1a;按单位可分为&#xff1a; 字节流 (一个字节一个字节的读取) 字符流 (一个字符一个字符的读取『一个字符是两个字节』)按…