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代码识别
java代码识别_识别Java中的代码气味相关推荐
- python以什么表示代码层次_在Python中,采用代码缩进和( )区分代码之间的层次。_学小易找答案...
[填空题]29 号元素 Cu 基态时的电子排布式为 ___ __ ,该元素在周期表中位于 __ _ 周期. __ __ 族. [单选题]"我要努力实现梦想,以弥补小时候吹过的牛"小 ...
- java fianlly_Java冷知识:finally中的代码一定会执行吗?
前言 Java开发中,正常情况下,在执行了try代码块之后,finally中的代码一定会执行.我们实际开发也经常会利用这个特性,在finally中来执行一些特殊的操作,比如:释放资源.释放锁等. de ...
- java bufferedimage颜色_基于Java BufferedImage实现识别图片中的黑色矩形
基于Java BufferedImage实现识别图片中的黑色矩形 前言:在项目中需要实现将图片中的黑色矩形替换为其他图形,其中的难点在于图片中存在其他黑点或者黑色小方块. 实现思路: 二值化,将纯黑的 ...
- Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法
public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...
- Java 7:项目代币中的代码示例
该博客通过代码示例介绍了一些新的Java 7功能,这些功能在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更改确实简化了Java语言 ...
- java 静态代码块_关于Java你不知道的那些事之代码块
前言 普通代码块:在方法或语句中出现的{},就被称为代码块 静态代码块:静态代码块有且仅加载一次,也就是在这个类被加载至内存的时候 普通代码块和一般语句执行顺序由他们在代码中出现的次序决定,先出现先执 ...
- java vb 速度_使用VB.NET加快代码开发速度
以前在学校时,编写代码都是使用C#,习惯了C#的代码习惯,等工作后由于工作需要逐渐的开始采用了VB.NET开发项目,渐渐地喜欢上了VB.NET,现在我就罗列一些VB.NET加速代码开发的方法. 一.智 ...
- java 重用性_提高Java代码重用性的三个方法
三种修改现有代码提高其可重用性的方法,它们分别是:改写类的实例方法,把参数类型改成接口,选择最简单的参数接口类型. 措施一:改写类的实例方法 通过类继承实现代码重用不是精确的代码重用技术,因此它并不是 ...
- java final 类_在Java中,final修饰的类有什么特点
展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...
最新文章
- python中defaultdict()函数的介绍以及应用场景
- 20172304 《程序设计与数据结构》第六周学习总结
- Linux系统基本命令之vim编辑器的使用
- 2020-11-29(准备考试)
- 头条号个人中心登录_微信个人订阅号开通了创作领域的认证!这是要跟头条看齐了吗?...
- jmeter mysql查询结果提取_Jmeter-从数据库中获取数据并作为变量使用
- VUE自学日志05-计算属性和侦听器
- 九章基础算法04:二叉搜索树与哈希表
- freeMarker导出word富文本带图片或者指定目录下的图片
- 国内安卓渠道列表42个
- 框架内(React)网页打印的实现
- 扑克玩法:9点半--数据分析
- 钉钉电脑端屏蔽文件上传下载功能的方法
- Mac系统打开命令行终端及查看操作系统版本号的方法
- 【每日知识】res是什么意思?
- 解决”您的连接不是私密链接“的问题!
- oracle数据库系统学习,Oracle数据库学习第二天
- 射频器件厂商RFMD与TriQuint达成合并协议
- python非参数检验的区别_python KS-检验(Kolmogorov-Smirnov test) -- 检验数据是否符合某种分布...
- cifar10数据读取
热门文章
- 1003 Express Mail Taking
- Codeforces Round #759 (Div. 2, based on Technocup 2022 Elimination Round 3)
- 不止代码:保留道路(ybtoj 最小生成树)
- P4819-[中山市选]杀人游戏【tarjan】
- P4395-[BOI2003]Gem气垫车【树形dp,四色定理】
- P1941-飞扬的小鸟【dp】
- POJ1958-Strange Towers of Hanoi【递推】
- ssl1761-城市问题【图论,最短路,Dijkstra】
- The 2020 ICPC Asia Macau Regional Contest J. Jewel Grab(数颜色+链表)
- 【模拟】生日蛋糕(jzoj 1613)