《重构-改善既有代码的设计》学习笔记(一)

其实看了重构之后,发现重构和设计模式有很多很多相通的地方,或者有着同样的目的。你完全可以参考设计模式的原则来修改已有的代码。

1.单一职责原则

2.开放--封闭原则

3.依赖倒装原则

4.迪米特原则(类松耦合)

笔者也在《重构》这本书中大量的谈到各种设计模式,所以再次推荐大家去看看 设计模式

其实很多时候我们不复审自己的代码的话,是很难发现自己编写代码的不足的。而且就算是复审了也很难发现问题,反正能实现功能就行了。

所以重构这本就是总结那些大牛们总结出的经验结晶,能教我们怎么发现这些不是bug的问题,并解决它们。

 

什么是重构?

这是定义:

  重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。

  重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。

  说人话:就是已有代码太糙了,又臭又长,既不方便修改,也不方便复用...(不符合各种设计原则),需要进行修改加工整容。

 

为什么需要重构?

因为可以升职加薪,赢取白富美呀。

 

什么时候重构?

1.难以阅读的程序,难以修改;

2.逻辑重复的程序,难以修改;

3.添加新行为时需要修改已有代码的程序,难以修改;

4.带复杂条件逻辑的程序,难以修改;

因此我们希望程序:

  1.阅读容易;

  2.所有逻辑都只在唯一地点指定;

  3.新的改动不会危及现有行为;

  4.尽可能简单表达条件逻辑;

 

代码的坏味道

当你闻到这些味道的时候,可能你的代码需要重构了。所以以下这些味道很重要。

1.重复代码(Duplicate Code):

如果你在一个以上的地方看到相同的程序结构,那么可以肯定:设法将它们合而为一,程序会变得更好。

2.过长函数(Long Method):

你应该积极分解函数。我们遵循这样一条原则:每当感觉需要以注释来说点什么的时候,我们就把需要说明的东西写进一个独立的函数中,并以其用途命名。

3.过大的类(Large Class):

如果想利用单个类做过多的事情,其内往往就会太多实例变量。

4.过长参数列(Long Parameter List):

如果参数列太长或者变化太频繁,你就需要重新考虑自己的依赖结构了。

5.发散式变化(Divergent Change):

如果某个类经常因为不同的原因在不同的方向上发生变化。(每个对象只应该因为一种变化而修改)

6.散弹式修改(Shotgun Surgery):

与发散式变化相反,如果每遇到某种变化,都需要在许多不同的类内做出许多修改。

7.依恋情结(Feature Envy):

对象技术的全部要点在于:将数据和对数据的操作行为包装在一起。 坏气味:函数对某个类的兴趣高于对自己所处类的兴趣。

有个原则:判断哪个类拥有最多被此函数使用的数据,然后就把这个函数和那些数据摆咋一起。

8.数据泥团(Data Clumps):

你常常看到相同的三四项数据:两个类中相同的字段、许多函数签名中相同的参数。这些总绑在一起出现的数据应该拥有属于它们自己的对象。

而且:一旦拥有新对象,你就可以着手寻找Featrue Envy,这可以帮你指出能够移至新类中的种种程序行为。

9.基本类型偏执狂(Primitive Obsession):

对象技术的新手通常不愿意在小任务上运用小对象。例如单独由数值、币种两个字段组成的money类。

10.switch惊悚现身(Switch Statement):

面向对象程序的一个最明显的特征就是:少用switch语句。大多数时候,一看到switch语句,你就应该考虑以多态来替换它。可以和策略模式一起食用。

11.平行继承体系(Paralle Inheritance Hierarchies):

其实是shotgun sergery的特殊情况。如果每当你为某个类增加一个子类,必须也为另一个类相应增加一个子类。

12.冗赘类(Lazy Class):

如果一个类的所得不值其身价,它就应该消失。程序届也不喜欢懒的类。

13.夸夸其谈未来性(Speculative Generality):

当有人说“噢,我想我们总有一天需要做这事”,并因而企图以各式各样的钩子和特殊情况来处理一些非必要的事情。

14.令人迷惑的暂时字段(Template Field):

有时你会看到这样的对象:其内某个实例变量仅为某种特定情况而设。

15.过度耦合的消息链(Message Chains):

如果你看到用户向一个对象请求另一个对象,然后向后者请求另一个对象,然后再请求另一个对象...这就是消息链。

16.中间人(Middle Man):

人们可能过度的运用代理(中间人)。你也许会看到某个接口有一半的函数都委托给其他类,这样就是过度运用。

17.狎昵xiá nì关系(Inappropriate Intimacy):

有时你会看到两个类过于亲密,花费太多时间去探究彼此的private成分。

18.异曲同工的类(Alternative Classes with Different Interface):

当两个函数做同一件事,却有着不同的签名。

19.不完美的类库(Incomplete Library Class):

麻烦的是类库往往构造的不够好,或者有些部分不适用了,而且我们往往不可能让我们修改其中的类使它完成工作。

20.幼稚的数据类(Data Class):

所谓Data Class是指:他们拥有一些字段,以及用于访问(读写)这些字段的函数,除此之外别无长物。

21.被拒绝的遗赠(Refused Bequest):

子类应该继承超类的函数和数据。但如果它们不想或不需要继承,或者只是需要其中少数元素。

22.过多的注释(Comment):

常常会有这样的情况:你看到一段代码有着长长的注释,然后发现,这些注释之所以存在乃是因为代码很糟糕,这种情况发生次数之多,很惊人。

当你感觉需要撰写注释时,请先尝试重构,试着让所有注释都变得多余。

 

下一篇详细讲讲怎么除去臭味。

转载于:https://www.cnblogs.com/zhaww/p/8664749.html

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

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

相关文章

展示Java开发人员课程包

60个小时以上的课程,5门所有级别的课程:成为Java编程专家 嘿,怪胎, 本周,在我们的JCG Deals商店中 ,我们提供了一个极端的报价 。 我们提供的Java Developer Course Bundle 仅售39美元,而不是…

吃鸡服务器不接受响应,绝地求生:蓝洞优化服务器性能,从此告别掉帧延迟!...

原标题:绝地求生:蓝洞优化服务器性能,从此告别掉帧延迟!很多玩家们都非常了解服务器的重要性,服务器响应时间也可以描述为‘网络延迟’。如果服务器的响应时间减少(或者网络延迟减少) 的话,玩家们可以体验到更加顺畅的…

遍历List过程中同时修改

public static void Main(){List<int> list new List<int>();int[] a{0,1,2,3,4,5,6,7,8,9};list.AddRange(a);foreach (var i in list){Console.WriteLine(i);if (i 2){list.Remove(i);}}Console.Read();} 有一个需求&#xff0c;要对List边遍历边将符合条件的L…

fifa15服务器位置,《FIFA 15》全系统教程图文攻略

《FIFA 15》全系统教程图文攻略2014-09-23 11:04:14来源&#xff1a;3DM论坛编辑&#xff1a;评论(0)《FIFA 15》为EA旗下足球模拟游戏&#xff0c;游戏使用了《UFC》所使用的EA的Ignite引擎&#xff0c;球员的全身细节、动作以及物理破坏效果都相当到位&#xff0c;将给带给玩…

Java EE 8 MVC:全局异常处理

在之前的先前文章中&#xff0c;我们了解了在Java EE MVC中访问请求信息&#xff08;例如查询或路径参数 &#xff09;的各种方法。 这篇文章显示了如何将全局异常处理应用于MVC应用程序。 假设我们有一个控制器方法可能抛出IllegalArgumentException&#xff1a; Controller…

可以显示网页服务器或者文件系统,浏览器是指可以显示网页服务器或者文件系统的HTML文件(标准通用标记语言的一个应用)内容,并让用户与这些文件交互的一种软件...

参考答案如下浏览技术进步有哪些类型&#xff1f;它们对贸易条件有什么影响&#xff1f;OSPF 协议生成的路由分为四类&#xff0c;指可准通些种软按优先级从高到低顺序来说分别是&#xff1a;区域内路由、区域间路由、第一类外部路由、第二类外部路由。并不是所有的商品都适合于…

hdu 3016 Man Down

题意&#xff1a;给你n个板子&#xff0c;初始100生命&#xff0c;到达每个板子加血或者扣血&#xff0c;求从最上面的板子落到地面的最优解 题解&#xff1a;对于每一个木板&#xff0c;只有从左下或者从右下&#xff0c;所以从下往上来看&#xff0c;到达第n个木板的最优解为…

主机做服务器共享文件,主机做文件共享服务器

主机做文件共享服务器 内容精选换一换用户要使用CSG&#xff0c;首先要注册一个华为云帐号&#xff0c;才有访问华为云资源的权限。目前CSG服务处于公测阶段&#xff0c;需要申请公测并通过审核才能使用&#xff0c;商用后自动开通。此外为确保用户能正确快速使用CSG服务&#…

java nosql_使用NoSQL实现实体服务–第4部分:Java EE

java nosql现在&#xff0c;我已经准备好了一个框架式的合同优先型Web服务&#xff0c;并使用Ektorp和CouchDB创建了一个数据访问层 &#xff0c;是时候将它们连接到一个可以正常工作的实体服务中了 。 为此&#xff0c;我将使用Java EE和Glassfish 3.1。 值得注意的是&#xf…

iOS安装CocoaPods的详细步骤

之前的文章没有说明如何安装CocoaPods&#xff0c;现在向大家一一说明&#xff1a; 1.升级ruby环境 应该输入&#xff1a;$ sudo gem update --system sudo是强制升级 2.更换ruby镜像 首先先移除现有ruby镜像&#xff1a;终端输入&#xff1a;$ gem sources --remove https://r…

i7怎么老是显示无服务器,i7处理器真有这么差?网友:懂电脑的人都不买!

大家都知道i7处理器的性能非常强劲&#xff0c;但是很多人买电脑时却选择i5或者AMD的&#xff0c;这是为什么&#xff1f;仅仅是价格原因么&#xff1f;可是为什么即使是预算足够&#xff0c;那些懂电脑的人也不会去选择I7处理器&#xff0c;难道名声在外的i7处理器真有这么差&…

JQuery入门

jQuery基础语法 $(selector).action() 查找标签 选择器 id选择器&#xff1a; $("#id") 标签选择器&#xff1a; $("tagName") class选择器&#xff1a; $(".className") 配合使用&#xff1a; $("div.c1") // 找到有c1 class类的div…

Java应用程序的令牌认证

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 2016年5月12日更新&#xff1a;构建…

mac 远程ftp服务器文件共享,mac 远程ftp服务器文件

mac 远程ftp服务器文件 内容精选换一换云堡垒机配置了FTP/SFTP远程备份&#xff0c;报请检查服务器密码或网络连接情况错误&#xff0c;不能启动远程备份。选择备份具体某一天日志&#xff0c;提示备份正在执行&#xff0c;但远程服务器未接收到该备份文件。原因一&#xff1a;…

ConcurrentHashMap 源码分析

https://weibo.com/6515091862/G9DawzK9fhttps://weibo.com/6515091862/G9D6x1kQrhttps://weibo.com/6515091862/G9Bo8oRCp 1. 前言 终于到这个类了&#xff0c;其实在前面很过很多次这个类&#xff0c;因为这个类代码量比较大&#xff0c;并且涉及到并发的问题&#xff0c;还有…

lambda ::_Lambda项目:迈向多核及超越

lambda ::周一下午在JavaOne 2011的希尔顿旧金山大宴会厅B上做了“ Project Lambda&#xff1a;迈向多核和超越”&#xff08;会议27400&#xff0c;不要与Brian Goetz的同名演讲相混淆&#xff09; 的演示 。大宴会厅关闭&#xff0c;这是一个非常大型的非主题演讲场地&#x…

Java 8:默认方法解析规则

随着Java 8中默认方法的引入&#xff0c;一个类现在可以从多个位置&#xff08;例如另一个类或接口&#xff09;继承相同的方法。 在这种情况下&#xff0c;可以使用以下规则来确定选择哪种方法&#xff1a; 类或超类方法声明始终优先于默认方法 否则&#xff0c;将使用具有最…

Log4j 2使用教程二 【详解】

配置Log4j 2的配置可以通过4种方式中的1种完成&#xff1a;1、通过使用XML&#xff0c;JSON&#xff0c;YAML或属性格式编写的配置文件。 2、以编程方式&#xff0c;通过创建一个ConfigurationFactory和配置实现。 3、以编程方式&#xff0c;通过调用配置界面中公开的API将组件…

firstJava

import java.util.Date;/*** Created by Administrator on 2018/3/30.*/ public class Test {public static void main(String[] args) {System.out.println("强调自主练习");new Date();} } 转载于:https://www.cnblogs.com/fengdaren/p/8675148.html

将Java EE Monolith雕刻成微服务

在介绍了为什么微服务应该由事件驱动的简介博客之后&#xff0c;我想采取一些其他步骤&#xff0c;并在有关博客的同时准备我即将进行的一系列演讲&#xff08;请参阅jBCNconf和Red Hat Summit&#xff0c;旧金山 &#xff09;。 在Twitter christianposta上关注我&#xff0c;…