『重构--改善既有代码的设计』读书笔记----序

    作为C++的程序员,我从大学就开始不间断的看书,看到如今上班,也始终坚持每天多多少少阅读技术文章,书看的很多,但很难有一本书,能让我去反复的翻阅。但唯独『重构--改善既有代码的设计』这本书让我重复看了不下3遍,今天我重新拿起这本书开始了第四遍的阅读。

    我后来仔细想了想为什么我会对这个书如此“迷恋”?忽然之间,我意识到这本书真正意义上给我带来了工作的改变。不像别的技术书籍,可能你看过之后,你脑子里有个印象,但对于实践这块不能立马就做,所以往往印象不深。而这本重构,在你看完之后,你可以立马开刀阔斧去进行真正意义上的实践,而且收获颇多,乐此不疲。

    接下来的日子,我将进行第四次『重构--改善既有代码的设计』的阅读,对于这本书,我也有了不一样的感情在里面。以前对于看书,没有写读书笔记的习惯,希望在这本书给我带来各种便利的同时,我也能够为它“做点什么”。呵呵,其实也是给自己加深印象的一种途径。因为“重构”我感觉目前国内开发者还不是特别熟悉,甚至有些程序员写了几年代码之后都不知道设计模式是什么东西。遇到项目,遇到代码,往往是想到什么就写什么。当遇到代码修改或者增加功能的时候,不会去看扩展性或者兼容性,直接语句一贴就完事。对于这种程序员,我真的希望你可以好好的静下心来想想,这些年来你代码能力有没有实质上的长进。

    拥有“代码洁癖”其实是一种很难能可贵的事情,有时候看到一团糟糕代码,心里会去想对他进行重构。不要怀疑这样会不会耽误自己的效率,重构之后添加功能往往能够更加如鱼得水。

    今天写的是序,为了便于有文有料,还是总结几个可以直接上手的要点给大家,之后我的出法应该就是针对重构列表中的每一条,都出一篇对应的文章。只有这样,我才能真正意义上的去重视那些简单的,和坦然接受那些复杂的重构手法。下面先列举几个比较有效的重构原则。作为序篇的总结。

    1. 有时候遇到大长段函数,需要进行Extract Method的时候,往往找不到一个比较好的切入点。其实这里有一个小窍门,就是寻找逻辑泥团,那么什么是逻辑泥团?其实很简单,就是那种有switch,if...else,for,while等循环判断的逻辑结构。往往提炼这种到单独的函数可以更加有效。

    2. 对于函数自身来说,函数内部的参数命名其实也很重要。有些同学可能会觉得接口的命名似乎比内部实现的参数命名更加重要,但你要知道,这个函数很可能之后还是由你去修改去增加功能。如果没有一个好的参数命名习惯,你又要重新开始去思考,这个变量是用来干什么的,这个时间就浪费掉了。

    3.  如果函数中使用的参数都不是该类所持有,应该考虑是否要Move Method到别的类去。对于类中函数,如果有函数内部使用的变量跟本类没有任何关系,那么说白了,这个函数不属于这个类。那么就将这个函数移到他需要的参数所在的类中去。别以为这个小动作没什么改变,这其实已经改变了类与类之间的耦合关系。从之前的实现耦合到现在的接口耦合,耦合度直接下降了一个级别,这是有目共睹的。

    4. 对于一些临时变量,如果可以通过函数获得,那么你就Replace Temp with Query,用函数将他替换,不要担心性能效率问题,记住28原则,80%的效率问题仅仅掌握在20%的代码身上。

    5. 针对变化,转移函数。如果一个函数中需要同时用到两个类以上的变量,那么你需要去观察,这个函数中这些类中变量,在将来比较容易变化的是哪些。优先将这个函数放到变化类中去。这样对于类型码这种,你当然可以利用面向对象的法宝--多态来取代switch语句了。这里还有个小技巧,如果你觉得如果在类的生命周期中可能会改变类型,那你就别对这个类做继承,你所要做的就是加个间接层,State/Strategy模式。通过委托来进行生命期的行为改变,还记得David Wheeler的名言吗?----计算机科学中的大多数问题都可以通过增加一层间接性来解决。

    结语: 其实个人很喜欢测评界的ZEALER,因为他们的精神就是想到什么就去做,与其思来想去要不要真正来篇读书笔记,不如狠下心来直接来一篇 『重构--改善既有代码的设计』读书笔记----序 : )

转载于:https://www.cnblogs.com/rickyk/p/4105158.html

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

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

相关文章

微信公共平台接口开发--Java实现

Java微信实现,采用SpringMVC 架构,采用SAXReader解析XML RequestMapping(value"/extend") public class WeixinController { RequestMapping(value"/weixin") public ModelAndView weixin(HttpServletRequest request,HttpServlet…

最大权闭合图hdu3996

定义:最大权闭合图:是有向图的一个点集,且该点集的所有出边都指向该集合。即闭合图内任意点的集合也在改闭合图内,给每个点分配一个点权值Pu,最大权闭合图就是使闭合图的点权之和最大。 最小割建边方式:源点…

非监督学习的单层网络分析

这篇博客对应的是Andrew.Ng的那篇文章:An Analysis o f Single-Layer Networks in Unsupervised Feature Learning,文章的主要目的是讨论receptive field size,number of hidden nodes, step-stride以及whitening在对卷积网络模型…

Spring MVC 验证码

页面 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"request.getServerP…

数据结构实验之链表四:有序链表的归并

数据结构实验之链表四&#xff1a;有序链表的归并 Time Limit: 1000MS Memory limit: 65536K 题目描述 分别输入两个有序的整数序列&#xff08;分别包含M和N个数据&#xff09;&#xff0c;建立两个有序的单链表&#xff0c;将这两个有序单链表合并成为一个大的有序单链表&…

apk文件编译到系统文件中的方法(及包含so库的)

把第三方或自己开发的apk文件编译到系统文件(system.img)中的方法&#xff1a; 1 (1)源码编译后&#xff0c;把apk拷贝到out\target\product\generic\system\app中。 (2) 执行命令make snod , 把添加的spk编到system.img 中 缺点&#xff1a;执行make clean 后&#xff0c;再…

javascript中interval与setTimeOut的区别

setTimeout(code,millisec) //- 在指定时间后执行代码 code必须&#xff1b; millisec必须&#xff1b; clearTimeout(setTimeoutId) //- 取消 setTimeout() setInterval(code,millisec)&#xff1b;//指定间隔毫秒内循环执行代码 code必须&#xff1b; millisec必须&a…

java设计模式之单例模式(七种方法)

单例模式&#xff1a;个人认为这个是最简单的一种设计模式&#xff0c;而且也是在我们开发中最常用的一个设计模式。 单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。这个类称为单例类。我们前面学习的…

java 遍历map集合

Map<String, String> map new HashMap<String, String>(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); //第一种&#xff1a;通过Map.keySet遍…

poj3009 Curling 2.0 深搜

PS&#xff1a;以前看到题目这么长就没写下去了。今天做了半天&#xff0c;没做出来。准备看题解&#xff0c;打开了网站都忍住了&#xff0c;最后还是靠自己做出来的。算是一点进步吧。 分析&#xff1a; 题目的意思没明白或者理解有偏差都没办法做题。看样例3和样例4&#xf…

Android监听事件

ListView事件监听&#xff1a; setOnItemSelectedListener 鼠标滚动时触发 setOnItemClickListener 点击时触发 EditText事件监听&#xff1a; setOnKeyListener 获取焦点时触发 RadioGroup事件监听&#xff1a; setOnCheckedChangeListener 点击时触发 CheckBox事件监听&#…

子类能不能继承父类的构造方法?

class A{ public A(){} // 1:无参数构造方法。 public A(String s){} // 2.}class B extends A{ public B(String s){ super(s); // 3. }}说明&#xff1a;如果没有1处的无参数构造方法&#xff0c;那么3处一定要主动调用父类带参数的构造方法。如果有1处的构造方法&#…

基于原生javascript的ajax实现

function getXMLHttpRequest(){if(window.ActiveXObject){//用户是ie浏览器http_requestnew ActiveXObject("Microsoft.XMLHTTP");}else{//其他的浏览器http_requestnew XMLHttpRequest();}return http_request;}var httpRequest;function name(){httpRequestgetXMLH…

Google File System设计方面的问题汇总

1、Google File System概述 google file system是一个分布式文件系统&#xff0c;针对的是数据密集型应用&#xff0c;提供容错功能&#xff0c;运行在低廉的服务器上&#xff0c;同时给大量的用户提供高性能服务。尽管google file system有着传统的分布式文件系统的目标&#…

linux phpize

phpize是什么 1、phpize是用来扩展php扩展模块的&#xff0c;通过phpize可以建立php的外挂模块。 当php编译完后&#xff0c;在bin下面会有phpize这个脚本文件&#xff0c; 在编译你要添加的扩展模块之前&#xff0c;执行以下phpize就可以了&#xff1b; 比如现在想在php中加入…

一些常用的正则表达式

较验邮箱&#xff1a; var EmailReg /^[-_A-Za-z0-9]([_A-Za-z0-9]\.)[A-Za-z0-9]{2,3}$/; 身份证号码&#xff1a; var reg /(^\d{15}$)|(^\d{17}(\d|X)$)/; 15位身份证号 //身份证15位时&#xff0c;次序为省&#xff08;3位&#xff09;市&#xff08;3位&#xff…

iOS iphone屏幕分析(岂止而大)

在写本文前&#xff0c;我必须介绍几点内容&#xff1a;第一点&#xff1a;屏幕上面显示的内容多少和屏幕的尺寸大小无关第二点&#xff1a;屏幕上面显示的内容多少和分辨率完全无关第三点&#xff1a;屏幕上面显示的内容多少和屏幕尺寸、屏幕分辨率、PPI等都是无关的那到底什么…

js的一些实现

响应回车键提交表单 //*******************************************************响应回车键登录****************************************************************** document.οnkeydοwnfunction(event){ var e event || window.event || arguments…

【随笔】Win7下GVIM的安装与配置

针对各种语言的编辑器千千万万&#xff0c;最好的就是最适合自己的&#xff0c;这句话一点没错。 偶然间&#xff0c;需要在Windows上编写代码&#xff0c;MyEclipse等太大&#xff0c;完全没有必要&#xff0c;所以就想起来了vim这个神器。个子小&#xff0c;功能强&#xff0…

java遍历Set集合

在Java中使用Set,可以方便地将需要的类型&#xff0c;以集合类型保存在一个变量中.主要应用在显示列表. Set是一个不包含重复元素的collection。更确切地讲&#xff0c;set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2&#xff0c;并且最多包含一个 null 元素。 import java.u…