1.Duplicated Code
代码重复几乎是最常见的异味了。他也是Refactoring的主要目标之一。代码重复往往来自于copy-and-paste的编程风格。与他相对应OAOO是一个好系统的重要标志。
2.Long method
它是传统结构化的“遗毒”。一个方法应当具有自我独立的意图,不要把几个意图放在一起。
3.Large Class
大类就是你把太多的责任交给了一个类。这里的规则是One Class One Responsibility.
4.Divergent Change
一个类里面的内容变化率不同。某些状态一个小时变一次,某些则几个月一年才变一次;某些状态因为这方面的原因发生变化,而另一些则因为其他方面的原因变一次。面向对象的抽象就是把相对不变的和相对变化相隔离。把问题变化的一方面和另一方面相隔离。这使得这些相对不变的可以重用。问题变化的每个方面都可以单独重用。这种相异变化的共存使得重用非常困难。
5.Shotgun Surgery
这正好和上面相反。对系统一个地方的改变涉及到其他许多地方的相关改变。这些变化率和变化内容相似的状态和行为通常应当放在同一个类中。
6.Feature Envy
对象的目的就是封装状态以及与这些状态紧密相关的行为。如果一个类的方法频繁用get 方法存取其他类的状态进行计算,那么你要考虑把行为移到涉及状态数目最多的那个类。
7.Data Clumps
某些数据通常像孩子一样成群玩耍:一起出现在很多类的成员变量中,一起出现在许多方法的参数中,这些数据或许应该自己独立形成对象。
8.Primitive Obsession
面向对象的新手通常习惯使用几个原始类型的数据来表示一个概念。譬如对于范围,他们会使用两个数字。对于Money,他们会用一个浮点数来表示。因为你没有使用对象来表达问题中存在的概念,这使得代码变的难以理解,解决问题的难度大大增加。好的习惯是扩充语言所能提供原始类型,用小对象来表示范围、金额、转化率、邮政编码等等。
9.Switch Statement
基于常量的开关语句是OO 的大敌,你应当把他变为子类、state或strategy.
10. Parallel Inheritance Hierarchies
并行的继承层次是shotgun surgery的特殊情况。因为当你改变一个层次中的某一个类时,你必须同时改变另外一个层次的并行子类。
11. Lazy Class
一个干活不多的类。类的维护需要额外的开销,如果一个类承担了太少的责任,应当消除它。
12. Speculative Generality
一个类实现了从未用到的功能和通用性。通常这样的类或方法唯一的用户是testcase.不要犹豫,删除它。
13. Temporary Field
一个对象的属性可能只在某些情况下才有意义。这样的代码将难以理解。专门建立一个对象来持有这样的孤儿属性,把只和他相关的行为移到该类。最常见的是一个特定的算法需要某些只有该算法才有用的变量。
14. Message Chain
消息链发生于当一个客户向一个对象要求另一个对象,然后客户又向这另一对象要求另一个对象,再向这另一个对象要求另一个对象,如此如此。这时,你需要隐藏分派。
15. Middle Man
对象的基本特性之一就是封装,而你经常会通过分派去实现封装。但是这一步不能走得太远,如果你发现一个类接口的一大半方法都在做分派,你可能需要移去这个中间人。
16. Inappropriate Intimacy
某些类相互之间太亲密,它们花费了太多的时间去砖研别人的私有部分。对人类而言,我们也许不应该太假正经,但我们应当让自己的类严格遵守禁欲主义。
17. Alternative Classes with Different Interfaces
做相同事情的方法有不同的函数signature,一致把它们往类层次上移,直至协议一致。
18. Incomplete Library Class
要建立一个好的类库非常困难。我们大量的程序工作都基于类库实现。然而,如此广泛而又相异的目标对库构建者提出了苛刻的要求。库构建者也不是万能的。有时候我们会发现库类无法实现我们需要的功能。而直接对库类的修改有非常困难。这时候就需要用各种手段进行Refactoring.
19. Data Class
对象包括状态和行为。如果一个类只有状态没有行为,那么肯定有什么地方出问题了。
20. Refused Bequest
超类传下来很多行为和状态,而子类只是用了其中的很小一部分。这通常意味着你的类层次有问题。
21. Comments
经常觉得要写很多注释表示你的代码难以理解。如果这种感觉太多,表示你需要Refactoring。
分享到:
相关推荐
以下是对这些最容易犯的21种错误的详细解释: 1. **重复代码 (Duplicated Code)** - 在多个地方存在相同或几乎相同的代码段,这违反了DRY(Don't Repeat Yourself)原则,应通过提取公共方法或模块化设计来避免。 ...
Java程序的打包通常涉及JAR(Java Archive)文件的制作。开发者可以使用jar命令行工具或集成开发环境(IDE)如Eclipse、IntelliJ IDEA的打包功能,将源代码、资源文件和类文件打包成可执行的JAR文件,便于分发和运行...
标题中的“目前网上最详细的java编写的记事本程序”表明这是一个使用Java编程语言实现的类似于Windows记事本的应用程序。这个程序旨在模仿并扩展Windows记事本的基本功能,可能是为了教学、练习或是个人项目的需求。...
它以其“一次编写,到处运行”的特性而闻名,这意味着开发者可以编写Java代码,然后在任何支持Java的平台上运行,无需重新编译。Java程序的稳定性和效率使其在各种应用领域,包括网络应用程序、企业级应用、移动应用...
"JAVA程序编辑器[java程序编写器]"是一个专为Java初学者设计的工具,它简化了代码编写、编译和调试的过程,使学习变得更加便捷。 这个编辑器的主要特点可能包括: 1. **用户友好界面**:对于初学者,简洁明了的...
本资源“java程序设计例题全集”显然是一份涵盖了大学Java程序设计课程中各种实例的集合,旨在帮助学习者深入理解和掌握Java编程。 标题中的“java程序设计例题全集”意味着这份资料包含了大量关于Java编程的实践...
趣味性:习题基本上覆盖了程序员在编写Java程序时经常出现的问题Java程序设计知识要点,各习题也列出其测试要点,从而方便教师从中挑选或改编考题以及方便学生进行实战模拟练习或测试,同时也可以为SCJP考试作准备...
6. **错误处理与异常捕获**:为了保证程序的稳定性和健壮性,需要编写异常处理代码,捕捉和处理可能出现的网络中断、数据格式错误等问题。 7. **安全性考虑**:虽然这是一个简单的个人聊天程序,但安全问题不容忽视...
【Java编写的倒计时程序】是一个典型的编程实践案例,主要展示了如何在Java环境中实现一个功能性的倒计时器。这个程序可能包含了基础的计时逻辑、用户界面以及可能的事件处理机制。以下是对该程序相关知识点的详细...
1. 图像处理:在这个Java程序中,原始图片被分割成多个小块,这可能使用了Java的`BufferedImage`类和图像处理库,如Java Advanced Imaging (JAI) 或 Apache Commons Imaging。开发者可能通过计算图像的宽度和高度来...
这些是所有Java程序的基础,理解并熟练运用它们是编程的起点。 2. **面向对象编程**:Java是面向对象的语言,弹球游戏中的每个元素(如弹球、挡板、墙壁)都可以抽象成类。通过类来封装属性和行为,实现对象的创建...
在开始编写Java程序之前,首先需要在计算机上安装Java开发工具包(JDK)。JDK是Java开发的基础,包含了编译、运行Java程序所需的所有工具。根据给定文件中的链接,我们访问Sun Microsystems(现已被Oracle收购)的...
【标题】:“java编写的扫雷小程序” 在编程领域,扫雷是一款经典的逻辑游戏,它由微软开发并随Windows操作系统广泛传播。这个标题表明我们正在讨论一个使用Java(J2SE)实现的扫雷游戏。Java是一种跨平台的、面向...
Java编写的FTP客户端程序是一种基于Java编程语言实现的软件,用于与FTP(文件传输协议)服务器进行交互。FTP是互联网上广泛使用的标准协议,用于在客户端和服务器之间传输文件。以下是一些关于Java FTP客户端程序的...
在本项目中,标题"Java编写QQ程序"表明我们关注的是使用Java编程语言实现的一款类似于QQ的即时通讯软件。描述提到“实现了QQ基本功能”,暗示该程序可能包括了登录、发送消息、接收消息、好友管理等核心功能。由于...
标题中的“用JAVA编写的画图程序(含文档)”表明我们即将探讨的是一个使用Java编程语言实现的图形绘制应用程序。这个程序可能包含了多种图形绘制功能,比如直线、曲线、圆形、矩形等基本图形的创建,以及可能的颜色...
### 如何使用记事本编写Java程序 #### 一、使用记事本创建Java源文件 ##### 第一种方法:通过文本文档更改后缀名 1. **创建文本文档**: - 右键点击桌面或其他文件夹,选择“新建”->“文本文档”。 2. **更改...
在编程领域,Java是一种广泛应用的面向对象的编程语言,以其跨平台、安全性高以及丰富的类库而著名。本文将深入探讨使用Java编写计算器程序的知识点,包括基础语法、控制结构、异常处理、用户界面设计等方面。 首先...
1. **基础语法与数据类型**:Java程序的基础是其语法结构,包括变量声明、条件语句(if-else)、循环(for, while)、函数定义等。数据类型如int、double用于存储数值,而运算符如+、-、*、/则用于执行算术操作。 2...
在本项目中,“用JAVA最基本知识编写的局域网聊天程序”是一个简单的应用程序,它允许用户在局域网内进行实时通信。这个程序基于Java语言,利用了Java的基础概念和特性来实现网络通信功能。下面将详细介绍这个项目...