识别Java中的代码气味

作为软件开发人员,我们不仅要编写有效的代码,而且还要编写可维护的代码,这是我们的责任。 Martin 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

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

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

相关文章

光纤收发器出现死机故障怎么解决

众所周知,光纤收发器是一种将双绞线电信号和光纤的光信号进行互换的以太网传输设备,因此也被称为光电转换器。使用光纤收发器可以将网络的传输距离延伸到100公里以上。相信大家在光纤收发器使用过程中,有时候会遇到一些问题的,最近进碰到有用…

数据类被认为有害

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

光纤收发器测试方法大全

光纤收发器产品一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中,且通常定位于宽带城域网的接入层应用;如:监控安全工程的高清视频图像传输。我们在使用光纤收发器的过程中,不可避免的会遇到一些问题&a…

Spring Boot:构建一个RESTful Web应用程序

介绍: REST代表表示状态传输 ,是API设计的体系结构指南。 我们假设您已经具有构建RESTful API的背景。 在本教程中,我们将设计一个简单的Spring Boot RESTful Web应用程序,公开一些REST端点。 项目设置: 让我们首先通…

光纤收发器具体是怎么分类的?

现如今,随着光纤收发器产品的多样化发展,其分类方法也各异,但各种分类方法之间又有着一定的关联,那么,光纤收发器具体是怎么分类的呢?接下来就由杭州飞畅地 小编来为大家详细介绍下吧! 按速率来…

光纤收发器的分类介绍

现如今,国外和国内生产光纤收发器的厂商很多,产品线也极为丰富,主要有深圳三旺通信、光路科技、瑞斯康达、烽火、飞畅、博威、德胜、Netlink、迅捷、腾达等。时下由于国内各大运营商正在大力建设小区网、校园网和企业网,因此光纤收…

java 编译 器 ide_在没有IDE的情况下编译和运行Java

java 编译 器 ide最近一个名为“ 不使用IDE编译Java软件包 ”的Java subreddit线程提出了一个问题:“是否有一个命令将软件包内的一组Java文件编译到一个单独的文件夹中(以下简称为bin),以及如何我会去运行新的类文件吗&#xff1…

光纤收发器的工作原理以及使用方法

关于光纤收发器的工作原理以及使用方法这块,在这里飞畅科技的小编做了专门的整理,首先,我们来了解下什么是光纤收发器,光纤收发器是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元,在很…

Spring Boot登录选项快速指南

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 在本文中,您将研究使用Spring Boot 2.1实现登录功能的各种选项。 您将从最…

光纤收发器的故障处理

在之前,我们详细地介绍了光纤收发器的分类,我们了解到光纤收发器有单模、多模之分,单纤多纤之分,但是不管光纤收发器是怎么分类的,其故障的判断方法基本是一样的,总结起来光纤收发器所会出现的故障有&#…

光纤收发器怎么使用?

在网络建设及应用中,由于网线最大的传输距离一般为100米,因此布建远距离传输网络的时候不得不使用光纤收发器等中继设备。光纤收发器一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中。那么,光纤收发器该如何使用呢…

光纤收发器通常具有哪些特点?

光纤收发器,是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元,在很多地方也被称之为光电转换器,其产品一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中,且通常定位于宽…

lambda 高并发_玩Java 8 – Lambda和并发

lambda 高并发因此Java 8不久前发布,具有大量功能和更改。 我们所有的Java狂热者一直在等待这一点,从他们最初宣布Java 7的所有强大功能开始一直到最终被取消。 我最近才有时间实际开始给它一个真实的外观,我将我的家庭项目更新为8个&#x…

光纤收发器的选择与维护!

光纤收发器在弱电工程中的使用是非常普遍,那么,我们在工程项目中该如何选择光纤收发器?当光纤收发器出现故障问题了,又该如何维护呢?这些问题对于新手来说都是难题,今天杭州飞畅的小编就来为大家分享一下关…

回调地狱和反应模式

我可以更好地了解a的用途的一种方式 基于反应流的方法是它简化了无阻塞IO调用的方式。 这篇文章将快速讲解进行同步远程调用所涉及的那种代码,然后说明如何在非阻塞IO中分层,尽管在资源(尤其是线程)的使用方面非常高效&#xff…

光纤收发器的实际应用范围介绍

众所周知,光纤收发器的有很多不同的分类,种类很多,在实际使用中大多注意的是按光纤接头不同而区分的类别:SC接头光纤收发器和FC/ST接头光纤收发器。接下来小编就来为大家介绍下光纤收发器的具体应用范围有哪些,想要了解…

光纤收发器的优势介绍

提到光纤收发器,人们常常不免会将光纤收发器与带光口的交换机来进行比较,下面咱们就主要来谈一下光纤收发器相对于光口交换机的优势。想要了解的朋友就一起来看看吧! 首先,光纤收发器和普通交换机在价格上远远比光口交换机便宜&a…

[渝粤教育] 南通大学 分子生物学 参考 资料

教育 -分子生物学-章节资料考试资料-南通大学【】 第二章 思考题 第二章 测试 1、【单选题】核酸的基本组成单位是 A、A.磷酸和核糖 B、B.核苷和碱基 C、C.单核苷酸 D、D.脱氧核苷和碱基 参考资料【 】 2、【单选题】DNA与RNA完全水解后,其产物的特点是 A、A.戊糖不…

[渝粤教育] 南通大学 大学计算机信息技术基础 参考 资料

教育 -大学计算机信息技术基础-章节资料考试资料-南通大学【】 数制转换 1、【填空题】与十六进制数(BC)16等值的八进制数是___________ 。 A、 参考资料【 】 2、【填空题】十进制数205.5的八进制表示是___________________。 A、 参考资料【 】 整数在计算机中的表示 1、【填…

Selenium脚本编写技巧和窍门

如果您刚刚开始学习硒,则以下技巧和窍门将成为您的救星。 这些技巧和窍门具有您可能会忘记的所有基本知识,将帮助您记住所有这些。 您只需浏览一下它们,几秒钟后您就会了解所有内容。 让我们一一看一下所有的技巧和窍门。 创建Webdriver实例…