Refactoring之——代码的坏味道(二)过大的类 &(三)基本类型偏执
1.1.2 Large Class(过大的类)
特征:一个类包含过多的字段、方法、代码行。
问题原因:
类通常一开始很小,但是随着程序的增长而逐渐膨胀。
类似于过长方法,程序员通常觉得在一个现存类中添加新特性比创建一个新的类要容易。
解决方法:
设计模式中有一条重要原则:职责单一原则。一个类应该只赋予它一个职责。如果它所承担的职责太多,就该考虑为它减减负。
- 如果过大类中的部分行为可以提炼到一个独立的组件中,可以使用
提炼类(Extract Class)
。 - 如果过大类中的部分行为可以用不同方式实现或使用于特殊场景,可以使用
提炼子类(Extract Subclass)
。 - 如果有必要为客户端提供一组操作和行为,可以使用
提炼接口(Extract Interface)
。 - 如果你的过大类是个GUI类,可能需要把数据和行为移到一个独立的领域对象去。你可能需要两边各保留一些重复数据,并保持两边同步。
复制被监视数据(Duplicate Observed Data)
可以告诉你怎么做。
收获:
- 重构过大的类可以使程序员不必记住一个类中大量的属性。
- 在大多数情况下,分割过大的类可以避免代码和功能的重复。
1.1.3 Primitive Obsession(基本类型偏执)
特征:
- 使用基本类型而不是小对象来实现简单任务(例如货币、范围、电话号码字符串等)。
- 使用常量编码信息(例如一个用于引用管理员权限的常量
USER_ADMIN_ROLE = 1
)。 - 使用字符串常量作为字段名在数组中使用。
问题原因:
类似其他大部分坏味道,基本类型偏执诞生于类初建的时候。一开始,可能只是不多的字段,随着表示的特性越来越多,基本数据类型字段也越来越多。
基本类型常常被用于表示模型的类型。你有一组数字或字符串用来表示某个实体。
还有一个场景:在模拟场景,大量的字符串常量被用于数组的索引。
解决办法:
大多数编程语言都支持基本数据类型和结构类型(类、结构体等)。结构类型允许程序员将基本数据类型组织起来,以代表某一事物的模型。
基本数据类型可以看成是机构类型的积木块。当基本数据类型数量成规模后,将它们有组织地结合起来,可以更方便的管理这些数据。
- 如果你有大量的基本数据类型字段,就有可能将其中部分存在逻辑联系的字段组织起来,形成一个类。更进一步的是,将与这些数据有关联的方法也一并移入类中。为了实现这个目标,可以尝试
以类取代类型码(Replace Type Code with Class)
。 - 如果基本数据类型字段的值是用于方法的参数,可以使用
引入参数对象(Introduce Parameter Object)
或保持对象完整(Preserve Whole Object)
。 - 如果想要替换的数据值是类型码,而它并不影响行为,则可以运用
以类取代类型码(Replace Type Code with Class)
将它替换掉。如果你有与类型码相关的条件表达式,可运用以子类取代类型码(Replace Type Code with Subclass)
或以状态/策略模式取代类型码(Replace Type Code with State/Strategy)
加以处理。 - 如果你发现自己正从数组中挑选数据,可运用
以对象取代数组(Replace Array with Object)
。
收获:
- 多亏了使用对象替代基本数据类型,使得代码变得更加灵活。
- 代码变得更加易读和更加有组织。特殊数据可以集中进行操作,而不像之前那样分散。不用再猜测这些陌生的常量的意义以及它们为什么在数组中。
- 更容易发现重复代码。
Refactoring之——代码的坏味道(二)过大的类 &(三)基本类型偏执的更多相关文章
- Refactoring之——代码的坏味道(一)过长方法
1 代码的坏味道 重构一书中提到了22种代码的坏味道,大致可以分为几类. 识别代码的坏味道,有助于发现代码的潜在问题,从而可以有的放矢的修改现有代码,使之不断完善. 1.1 Bloaters(臭鲱,暂 ...
- 代码的坏味道(15)——冗余类(Lazy Class)
坏味道--冗余类(Lazy Class) 特征 理解和维护类总是费时费力的.如果一个类不值得你花费精力,它就应该被删除. 问题原因 也许一个类的初始设计是一个功能完全的类,然而随着代码的变迁,变得没什 ...
- Refactoring之——代码的坏味道(四)过长参数列
1.1.4 Long Parameter List(过长参数列) 特征:一个方法有超过三四个的参数. 问题原因: 过长参数列可能是将多个算法并到一个函数中时发生的.函数中的入参可以用来控制最终选用哪个 ...
- 代码的坏味道(22)——不完美的库类(Incomplete Library Class)
坏味道--不完美的库类(Incomplete Library Class) 特征 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建 ...
- 代码的坏味道(16)——纯稚的数据类(Data Class)
坏味道--纯稚的数据类(Data Class) 特征 纯稚的数据类(Data Class) 指的是只包含字段和访问它们的getter和setter函数的类.这些仅仅是供其他类使用的数据容器.这些类不包 ...
- 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)
膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...
- Bad Smell (代码的坏味道)
sourcemaking 如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹.正如食物要腐坏之前,经常会发出一些异味一样, 我们管这些痕迹叫做 "代码异味" ...
- 重构 之 总结代码的坏味道 Bad Smell (一) 重复代码 过长函数 过大的类 过长参数列 发散式变化 霰弹式修改
膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...
- Chapter 3 :代码的坏味道
"如果尿布臭了,就换掉它." --Beck奶奶,论保持小孩清洁的哲学 代码的坏味道这一章集中论述该何时重构.具体的重构方法在后面的章节. "没有任何度量规矩比得上见识广博 ...
随机推荐
- C# axWindowsMediaPlayer制作播放器
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- C#在 64位系统下出现 “未能加载文件或程序集”错误
64位系统下,Build的时候,如果选择Any CPU,默认会按照64位进行编译,便无法加载某些旧的dll,这些dll可能是特定到X86 CPU的. 所以,把编译选项中改为 X86CPU,就可以运行了 ...
- Python2.5/2.6实用教程:基础篇(转)
介绍 本文方便有经验的程序员进入Python世界.本文适用于python2.5/2.6版本. Deparecated:Python3 和 python2.x语法不同.如果你正在用python3,请参考 ...
- [转]认识session
今天想用一个session来实现用户登录判断,也算是对之前session的探究,查了下资料session的运行机制如下: session是服务器端的一种会话机制,当客户端的请求服务器创建一个sessi ...
- 洛谷——P2719 搞笑世界杯
题目背景 很久很久以后,一次世界杯,. 题目描述 随着世界杯小组赛的结束,法国,阿根廷等世界强队都纷纷被淘汰,让人心痛不已. 于是有人组织了一场搞笑世界杯,将这些被淘汰的强队重新组织起来和世界杯一同比 ...
- dutacm.club Water Problem(矩阵快速幂)
Water Problem Time Limit:3000/1000 MS (Java/Others) Memory Limit:163840/131072 KB (Java/Others)Tot ...
- 小型Web应用扫描工具Grabber
小型Web应用扫描工具Grabber Grabber是Kali Linux集成的一款Web应用扫描工具.该工具适合中小Web应用,如个人博客.论坛等.该工具使用Python语言编写,支持常见的漏洞 ...
- Exercise01_11
public class Population{ public static void main(String[] args){ int sum,s; s=365*5*24*60*60; sum=31 ...
- Java高级架构师(一)第19节:X-gen生成相应的Visitor
package cn.javass.themes.smvcsm.visitors; import cn.javass.xgen.genconf.vo.ExtendConfModel; import c ...
- Services
*在实际运行中同样的Service的确只能有一个. Services有两种启动形式: Started:其他组件调用startService()方法启动一个Service.一旦启动,Service将一直 ...