java代码识别_识别Java中的代码气味

java代码识别

作为软件开发人员,我们不仅要编写有效的代码,而且还要编写可维护的代码,这是我们的责任。 Martin Fowler在他的《重构:改进现有代码的设计》中将代码气味定义为:

通常对应于系统中更深层问题的表面指示

重构是在不影响代码外部行为的情况下改进代码内部结构的过程。 理想情况下,我们应该在添加新功能的同时重构旧代码。 与尝试一次完成所有操作相比,这将节省我们一些时间。

Fowler的书是极好的资源,可以帮助我们识别并消除一些常见的代码异味。 在编写代码以满足新要求时,我们还应该避免这些代码的味道。

在本教程中,我们将探索其中的一些。

1.评论:

理想情况下,我们应该编写能说明一切的代码。 进行大量评论被认为是不好的做法。 当我们使用大量评论时,它们通常会随着时间的推移而失去同步。 对于有时设计不当的系统,它们有时还会起到除臭剂的作用。

如果我们有一个好的设计并且正确地命名了我们的类,方法和变量,那么代码将轻松地将其目的传达给另一个开发人员。

一些开发人员喜欢在他们创建的新类上签名自己的名字。 我个人不建议这样做,因为使用任何版本控制系统都可以轻松地跟踪作者。

注释在某些情况下可能会很有用,但请谨慎使用。

2.重复的代码:

复制代码是当我们在代码库的多个位置分布相似的代码时看到代码味道。 这是一个结构不良的代码,我们应该找到某种方法以单独的方法提取出通用功能。

代码重复的问题在于,如果要进行更改,则必须修改所有这些文件以适应该更改。 我们有可能错过一些代码块中的更新。

让我们尽一切可能坚持DRY(不要重复自己)的原则。 根据DRY原则,我们不应该重写已经编写的功能。

3.长方法:

我们应该避免使用长方法,这是一种不好的代码味道。 太长的方法很难阅读,很难适应它的新变化。 在开发人员中经常争论多长时间。 就我个人而言,我更喜欢遵循方法大小的规则,该规则的大小不应超过十五行代码。 在大多数情况下,此规则对我来说效果很好。

每当我看到自己违反此规则时,就会问自己: “此方法仅做一件事情(SRP原理)吗?” 。 如果没有,那么我尝试在逻辑上将我的方法拆分为更有意义的方法。

尽管使用长方法有时会很好,但约束是我们应该有足够的理由来证明它合理。

4.大班:

不出所料,我们列表中的下一个是大型类代码气味。 大型课程通常也称为“上帝课程”或“斑点或黑洞课程”。

在大型系统中,我们经常会遇到这种代码异味。 随着系统的发展,某些类最终会在一段时间内支持添加到其中的许多功能。 尽早捕获此代码气味是个好主意。 如果一个类变得太大,则稍后将花费大量时间和精力进行修复。

根据“ 单一职责原则”(SRP),一个类必须恰好做一件事,并且要做到这一点。 在向现有类添加一些代码时,让我们利用开发人员的直觉并自问: “此类是否真的应该支持此功能?”。 如果没有,最好将其放置在其他位置。

5.长参数列表:

另一个类似的代码味道是长参数列表。 长参数列表的方法可能难以使用,并且由于疏忽而增加了错误映射的可能性:

 public void doSomething(String name, int id, String deptCode, String regNumber) {  ...  } 

此处的解决方案是引入捕获上下文的参数对象。 因此,我们可以将上述方法改进为:

 public void doSomething(Student student) { ...  } 

在这里,我们已经实现了正确的封装。

6.数据类别:

数据类是仅包含数据成员及其获取器和设置器的类:

 public class Student {  private int id; private String name;  //constructor, getters and setters   } 

这通常表明它可能不是一个很好的抽象。

尽管我们创建参数对象来解决“长参数”代码的味道, 但理想情况下我们应该设计类,而不仅仅是存储数据。

我们应该问类似的问题: “我可以向当前在其他地方处理的此类添加一些功能吗?”

有时,当我们在代码库中的多个地方处理了这些数据类的功能时,就会意识到出现重复的代码味道。

7.发散类:

当我们意识到由于许多不同的原因而不得不以许多不同的方式更改一个类时,就会产生不同的类代码气味

正如我们前面讨论的,类应仅具有一个特定的目的。 如果是这样,我们将有较少的理由要对类进行更改,并且要在其中进行的更改也较少。

如果我们发现自己以多种方式更改了一个类,那么这很好地表明该类的职责需要分解为单独的类。

8.消息链:

消息链是一种代码气味,我们在对象上调用一个方法,然后在该返回的对象上调用另一个方法,依此类推:

 int id = obj.getDept().getSubDept().getHOD().getId(); 

较长的消息链使我们的系统变得僵硬,难以独立测试。

它通常还违反Demeter法则,法则规定了良好的面向对象设计应允许调用哪些方法。

9. Shot弹枪手术:

realize弹枪手术是一种代码气味, 当我们意识到我们必须触摸许多类以针对一个简单的要求进行更改时就会发生这种气味 当触及我们代码库中的许多地方时,很可能会引入错误并破坏现有的实现。

对于设计良好的系统,较小的更改将理想地要求将本地更改更改为一两个位置。 虽然,这很难实现,但是无论我们对代码的设计水平如何,有时都需要进行shot弹枪手术。

我们可以通过移动方法来解决the弹枪外科手术代码的气味。 如果更改要求我们修改多个类中的方法,我们应该问自己: “这些方法应该合并为一两个类吗?” 然后让我们的开发者本能引导我们。

10.功能嫉妒:

功能嫉妒是一种代码气味,当我们拥有的方法对其他类的详细信息比对其中的类更感兴趣时,就会发生这种情况。

如果两个或多个方法总是互相交谈,则它们很可能必须属于同一类。

11.不适当的亲密关系:

当两个类通过双向通信彼此之间过于依赖时这是不适当的亲密代码气味。

在班级之间进行双向交流使他们紧密地联系在一起。 我们至少应将某些方法分解为一个单独的类,并以消除这种循环为目标。 我们应该设计易于理解和维护的类。

12.原始痴迷:

顾名思义,我们有时过于依赖原始类型。 尽管我们在代码中需要基元,但它们应存在于代码的最低级别。

我们应该避免过度使用原语,并在需要时定义合适的类。

13.投机性:

有时, 我们会过度设计诸如定义超类或某些当前不需要的代码之类的东西,但是我们认为有一天可能会有用。 此代码气味被称为推测性普遍性。

敏捷开发促进采用准时设计。 我们的设计应该保持简单,并且应该足以支持当前的功能。 用户需求经常快速变化,因此,仅在必要时才应引入概括。 否则,我们可能最终将时间浪费在最终从未使用过的设计上。

14.拒绝的请求:

当子类继承某些东西但不需要它时,就会出现拒绝请求代码的气味

如果子类继承了它们不使用的东西,则它们可能不是超类的适当子类:

 public class Bird {  void fly() { System.out.println( "Flying!!" ); }  }   public class Ostrich extends Bird {  void fly() { throw new IllegalStateException( "An ostrich can't fly" ); }  } 

显然,鸵鸟不会飞行,因此这是拒绝请求代码气味的一个示例。 我们可以通过以下方式之一来处理此代码异味:

  • 要么不要在超类中定义不需要的行为,要么
  • 将它们创建为单独的独立类

结论:

在本教程中,我们研究了一些代码气味,并学习了如何避免和处理它们。

该列表显然并不详尽,但可以证明是快速入门指南。

翻译自: https://www.javacodegeeks.com/2019/09/identifying-code-smells-in-java.html

java代码识别

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

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

相关文章

关于Java父子类继承的问题

1.子类无法继承父类的构造器 2.子类可以继承父类所有的变量和方法,父类私有的方法和变量也被继承到子类中,只是不可见而已,子类无法直接调用和访问。在子类对象中存储着父类中所有的变量的数据以及父类所有方法的引用地址。 3.被重写的父类方…

git连接到github(SSH无密码登陆)

【0】README 0.1)本文旨在尝试在linux环境下免密码连接到github,并进行push pull projects in github by git commands。0.1) 对ssh免密码登录有不熟悉的童鞋,please visit http://blog.csdn.net/pacosonswjtu/article/details/…

excel柱状图堆叠图显示总和_excel堆积柱形图显示百分比 在Excel堆积图中显示百分比标签的方法...

excel堆积柱形图显示百分比 在Excel堆积图中显示百分比标签的方法,前天刚学习了一个excel的新技术,叫“excel堆积柱形图显示百分比”授课老师对我们说,这一技术的专业全称为“excel堆积柱形图显示百分比 在Excel堆积图中显示百分比标签的方法…

java命令模式_Java中的命令设计模式

java命令模式在本教程中,我们将学习命令模式,这是一种重要的行为设计模式。 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能。 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间。 发送者对象可以创建…

抽象类与接口的区别

文章目录抽象类的理解接口的理解区别分析演示案例总结参考抽象类的理解 动物就是对某类事物的普遍性、共同性进行抽取后得到的用来反映这类事物本质的概念。 动物被定义为靠摄取有机物(植物、动物或微生物)来获得营养而不能完成无机物到有机物转化过程的能够对环境…

浅尝硬盘分区表

【0】README 0.1) text description from orange’s implemention of a os; 0.2) there are a number of analysis and attention proves to be essence of this page, I think; 0.3)Conclusion about hd partition table C1…

openjdk-7支持版本_长期支持对OpenJDK意味着什么?

openjdk-7支持版本Bruno Borges最近在推特上发布了一个有关OpenJDK的长期支持(LTS)的问题,这表明对它的真正含义仍有一些困惑。 在此博客文章中,我将解释不同部分如何组合在一起。 那么……谁说或在哪里说“ #OpenJDK 11”是LTS&…

android 安装卸载应用提醒_Android监听程序的安装和卸载

在android系统中,安装和卸载都会发送广播,当应用安装完成后系统会发android.intent.action.PACKAGE_ADDED广播。可以通过intent.getDataString()获得所安装的包名。当卸载程序时系统发android.intent.action.PACKAGE_REMOVED广播。同样intent.getDataStr…

常用函数式接口的学习

文章目录定义常用的函数式接口Supplier演示代码Consumeraccept 方法演示代码andThen 方法演示代码Predicatetest 方法and 方法演示代码or 方法negate 方法Functionapply 方法演示代码andThen 方法演示代码定义 有且仅有一个抽象方法的接口称之为“函数式接口”,但是…

如何创建虚拟硬盘 + os 读取硬盘参数代码

【0】README 0.1) 本文旨在演示如何利用 bximage 创建虚拟硬盘;0.2) 利用 os 读取硬盘参数, source code from orange’s implemention of a os , for complete code , please visit https://github.com/pacosonTang/Orange-s-OS…

内联脚本被视为是有害的_数据类被认为有害

内联脚本被视为是有害的这篇博客文章解释了从我参与的项目之一中删除Lombok项目的动机。 它反映了我的个人观点,并不妨碍特定的技术。 大约三年前,我认识了Project Lombok ,这是一个添加Java代码的库。 我从一开始就喜欢它,因为它…

win10可用空间变成未分配_教你两种方法有效利用Win10未分配的空间 - 易我科技...

Haley 于2020/08/24更新 磁盘分区管理摘要文中介绍了两种方法充分利用Windows10未分配空间,分别为1)格式化Win10未分配空间来创建新的分区,2)在分区上添加未分配空间。我的Win 10计算机上有一个大小99GB的未分配空间 :「我在Windows计算机上安装了两个硬…

selenium编写脚本_Selenium脚本编写技巧和窍门

selenium编写脚本如果您刚刚开始学习Selenium,则以下技巧和窍门将成为您的救星。 这些技巧和窍门具有您可能会忘记的所有基本知识,将帮助您记住所有这些。 您只需浏览一次,几秒钟后您便会了解所有内容。 让我们一一看一下所有的技巧和窍门。 …

div和div之间画横线_HTML如何在两个div标签中间画一条竖线

近日在画一个界面的时候,遇到一个需求:在界面当中画一条竖线,且这条竖线在高度上需要自动占满整个父div(即这条竖线的高度和两个div中较高的一个等高)。往常我们画一条横线直接用标签即可,当画一条竖线的时候发现找不到标签。在网…

静态类型/静态分派/动态分派/单分派/多分派

文章目录静态类型/实际类型方法解析静态分派动态单分派参考静态类型/实际类型 Human woman new Woman(); // Human就是静态类型,其实就是变量编译时类型,Woman就是实际类型 Man man new Man(); // 静态类型和实际类型都是Man方法解析 Class 文件的编…

jvm回收垃圾_没有垃圾回收的JVM

jvm回收垃圾JVM社区不断增加新的GC,最近又添加了一个新的GC,它被称为Epsilon ,是非常特殊的一个。 Epsilon仅分配内存,但不会回收任何内存。 看起来好像不执行任何垃圾回收的GC用途是什么。 这种类型的垃圾收集器有特殊用途&…

C打印函数printf的一种实现原理简要分析

【0】README 0.1)本文旨在对 printf 的 某一种 实现 原理进行分析,做了解之用;0.2) vsprintf 和 printf.c 的源码,参见 https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/p309 【1】pr…

wireshark提取流量包中的文件_[技术]Wireshark抓取的数据包提取文件

0x00 简介本期主要会教大家如何从流量中还原出来文件。下面我将会用多种办法来讲解。使用系统:Kali Linux0x01 tcpxtract工具网络流量提取文件(方法1)Kali Linux默认没有安装该工具,需要自己安装安装命令:sudo apt install tcpxtract使用方法…

java设计模式适配器模式_Java中的适配器设计模式

java设计模式适配器模式适配器设计模式是一种结构设计模式 ,可以帮助我们连接到通过不同接口公开相似功能的旧版或第三方代码。 适配器的现实世界是我们用来将USB电缆连接到以太网端口的类比。 在设计一个面向对象的应用程序时,当我们的客户期望一个特…

技术路线的选择重要但不具有决定性

微软在技术上连续大动作,如果放在几年前,我相信微软粉丝们一定是欢声雷动,不过这次情况有点不太一样,在网上看到有人在抱怨微软技术更新速度太快而且四面出击,还有人扬言要改弦更张,投奔Linux或者Java阵营。…