Chapter 2 :重构的原则】的更多相关文章

1,什么是重构? 在不改变软件可观察行为的前提下,使用一些重构的手法,提高代码可读性. 换句话说,在保持软件可用的前提下,修改代码使得更加容易被理解. 2,为什么重构? 为了后续的代码维护和修改,易读是重构的核心价值. 除此之外,重构随之带来的好处有: 找到bug 提高编程速度(在代码量累计到一定程度时,重构过的代码会更加易于添加新功能) 3,什么时候重构? 添加新功能之前重构 添加新功能最快的方法往往是先修改现有代码,使新功能容易被加入. 使代码更易理解时重构 顺便重构(修复bug,添加新功能…
英文原文:Hill Climbing (Wonkish)   重构是一种对软件进行修改的行为,但它并不改变软件的功能特征,而是通过让软件程序更清晰,更简洁和更条理来改进软件的质量.代码重构之于软件,相当于结构修改之于散文.每次人们对如何对代码进行重构的讨论就像是讨论如果对一篇文学作品进行修订一样无休无止.所有人都知道应该根据项目的自身情况来对代码进行重构,而重构是无止境的.莫扎特从来不不对他的作品进行修订,特罗洛普对自己作品修订的恰到好处,大多数作家认为他们俩这样做都是合适的,但他们的合适对于你…
抽象不应该依赖谢姐,细节应该依赖于抽象:针对接口编程,不要对实现编程.例如电脑内的内存坏了不会影响到其它模块,而且什么品牌都可以插入内存插槽,而不仅限于某个品牌的内存条. A.高层模块不应该依赖底层模块,两个都应该依赖抽象. B.抽象不应该依赖细节,细节应该依赖抽象. 里氏代换原则(LSP):子类型必须能够替换掉它们的父类型. 只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为. 依赖倒转其实可以说是面向对象设计的标识,用哪种语言来编…
开放-封闭原则:是说软件实体应该可以扩展,但不可修改. 设计人员必须对于他设计的模块应该对哪种变化封闭做出选择,先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化. 面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码. 拒绝不成熟的抽象和抽象本身一样重要.…
单一职责原则:就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力. 如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责,就应该考虑类的职责分离.…
最初接触到面向对象的CSS还是因为项目中的CSS已经超过八千行,缺乏约束和管理,在近期或者是不远的将来,有迫切的要求需要重构.在前端重构中,我们已经讨论过了JavaScript面向对象的重构,在这个时候再看一看CSS面向对象和模块化,这给我的工作提供了非常好的思路. 首先,我要说的是,在这个概念翻飞的年代里,固执地追求某些概念和涵义,并不能带来更优秀的设计和更高的生产力,面向对象是一种思路,或者说是一种方法论,给CSS重构带来一些启示,这就足够了,没有必要去纠结OO CSS的定义和严谨性. 我们…
最初接触到的CSS面向对象,是项目里的CSS超过8千行,缺乏约束和管理,在近期或不远的将来,有迫切的要求需要重构.CSS面向对象和模块化. CSS代码遇到的问题: 重用性差,看着一个CSS的名称,很难说出哪些模块可能引用到了它,这个CSS是用作网页的哪些部分的: 结果谁也不敢修改和删除,后面的样式只能往上面堆积: 怕CSS重名,s1.s2.t1.t2这样的命名开始出现了,这无异于饮鸩止渴,没有人知道这些样式是做什么的: 于是,CSS越来越大了: 做高保真的美工和业务开发人员思路是完全不同的,我们…
关于软件的设计原则有很多,对于设计原则的掌握.理解.实践及升华是架构师的一项极为之必要的修炼. 记得在12年前第一次阅读<敏捷开发>时,五大基本设计原则就深深地植入到我的脑海中一直影响至今,我也由此获益良多.设计原则当然不止只有五种,最主要的面向对象的设计原则有以下这些:   单一职责原则 (SRP) - 就一个类而言,应该仅有一个引起它变化的原因 开-闭原则 (OCP)- 软件实体(类,模块,函数等)应该是可以扩展的,但是不可以修改 里氏替换原则 (LSP)- 子类必须能够替换它们的基类型…
重构的第一步: 为即将修改的代码建立一组可靠的测试环境. 和任何重构手法一样,当提炼一个函数时,我们必须知道可能出什么错. 安全步骤: 首先在一个函数内找到局部变量和参数.任何不会被修改的变量都可以被当成参数传入新的函数,至于会被修改的变量就需要格外小心. 重构代码原则:每次的改动幅度不要太大,这样才能保证 任何一个傻瓜都能写出计算机可以理解的代码,惟有写出人类容易理解的代码,才是优秀的程序员.是不过三,三则重构.…
   李建忠老师讲的<面向对象设计模式纵横谈>,早就看过了,现在有了时间重新整理一下,以前的博客[赛迪网]没有了,现在搬到博客园,重新过一遍,也便于以后浏览. 设计模式从不同的角度分类会得到不同的结果.设计模式可以从[目的]和[范围]两个角度来看看. 模式分类 从目的来看[这个分来是广泛使用的]: -创建型(Creational)模式:负责对象的创建 -结构型(Structural)模式:处理类与对象间的组合关系 -行为型(Behavioral)模式:类与对象交互中的职责分配的问题 从范围来看…
掌握编程语言仅仅意味着掌握了如何给计算机"下命令",而到底要计算机如何去做,怎么指挥,则是另一个问题--如何编程.设计模式是一套程序员的"武功套路",它教我们如何去编程.虽然不遵守这个套路也是可以编程的,但是为了做到让整支程序员军团以整齐一致的步伐协调工作,设计模式的存在还是很有必要的.它定义了一系列的"武功套路"以及对应的招式的名称,相当于制定好了行业内的一套规范以及术语,方便程序员军团成员之间相互沟通. GoF的23种设计模式 GoF是指Er…
同为创造型设计模式的简单工厂模式可以理解为对new关键字的代替. 本着重复三次即重构的原则,如果一个对象在不同的地方被new了两次以上,那就可以考虑使用它.那我们为什么要用简单工厂模式代替new呢?就像我们使用Getter Setter代替直接读写字段一样,说白了就是加上一个间接层,以缓冲处理流程的变化(比如获取字段的时候,为其加上100再返回,写在Getter里就不需要散弹式修改). 相比起来工厂方法模式无疑复杂了很多.引用一句维基百科上对其用途的解释: Deal with the probl…
1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快速的. 自治的是指:关注于验证某个单一功能,例如只关注于类的某个方法的功能. 可重复的是指:无论何时允许同一段测试代码都应该得到相同的结果. 独立的是指:不依赖与其他任何系统或单元测试. 快速的是指:所有测试都应快速地完成,   集成测试 验证两个或多个组件之间的交互. 验收测试 确保已构建的系统实…
2012年3月 随笔档案 - java_my_life - 博客园--此网友 12年的博客都是和模式有关的,希望可以多看看.http://www.cnblogs.com/java-my-life/archive/2012/03.html <JAVA与模式>之单例模式 - java_my_life - 博客园http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html 第一部分 第1章 模式的简史和形而上学 1.1 模式是…
9个有用的和免费的工具来支持动态网页开发 8个基本的引导工具的网页设计师 11款CSS3动画工具的开发 2016年某前端群题目答案参考 9最好的JavaScript压缩工具 创建响应式布局的10款优秀网格工具集锦 8个超实用的jQuery插件应用 8个非常个性化的CSS3单/复选框 10个超赞的jQuery图片滑块动画 推荐20款JavaScript框架给前端开发者 7个华丽的基于Canvas的HTML5动画 10个非常炫酷的jQuery相册动画赏析 9个绚丽多彩的HTML5进度条动画赏析 7款…
本篇文章已授权微信公众号 guolin_blog (郭霖)独家公布重点内容 2017年第一篇文章,祝各位好友新年快乐. 年前因为不小心坐到了自己左手大拇指导致轻微的骨裂,没有按时更新,实在是羞愧.今年给自己订了个小目标,在安顿好新工作后,每周一篇来总结这些年所学. 话不多说,步入正题 写本文的最初灵感源于16年11月份我将工作环境切换到Mac OS上,当中一些使用"差异"让我開始对Unix/Linux中设计产生了浓厚的兴趣.虽然从13年開始使用redhat,再到后来一直使用的ubunt…
同为创造型设计模式的简单工厂模式可以理解为对new关键字的代替. 本着重复三次即重构的原则,如果一个对象在不同的地方被new了两次以上,那就可以考虑使用它.那我们为什么要用简单工厂模式代替new呢?就像我们使用Getter Setter代替直接读写字段一样,说白了就是加上一个间接层,以缓冲处理流程的变化(比如获取字段的时候,为其加上100再返回,写在Getter里就不需要散弹式修改). 相比起来工厂方法模式无疑复杂了很多.引用一句维基百科上对其用途的解释: Deal with the probl…
DAO设计 没有使用DAO存在的问题:多个地方都要都同时做CRUD操作时,重复的代码就会很多. DAO:Data Access Object(数据存取对象). 位于业务逻辑和持久化数据之间,实现对持久化数据的访问. ORM 对象关系映射: 将关系数据库中表中的记录映射成为对象,以对象的形式展现.因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作. 对应关系: 示意图: domain domain 就是一个符合JavaBean规范(一个类当中有字段和该字段的getter与Set…
一 老规则边看边写书上的代码,磨磨蹭蹭三个多星期终于把一本1000+的java与模式看完了. 于是,在这里贴上自己对每个模式的思考和总结,其实这个东西在我边看边写的时候已经写了一大半,博文再写一次算是复盘和分享. 而且由于是总结所以不贴代码,有兴趣的可以直接看我的项目,里面自带博文全部中文,因为也是边写变更新一遍github. 附上自己的项目地址 https://github.com/247292980/Design-Patterns 必须要说的是本人其实大二开始敲代码,目前工作不满一年,一定有…
最近打算巩固,整理一下设计模式相关的内容.这篇是关于  ——模板模式! 原文:http://www.jb51.net/article/76052.htm -------------------------------------------------------------------------------------------------------------------------------------------------- 这篇文章主要介绍了PHP设计模式中的模板方法模式.使…
参考书籍: <重构 改善既有代码的设计 第2版>马丁 福勒著 人民邮电出版社 马丁 福勒的其他著作:<分析模式>,<UML精粹>,<领域特定语言> 目录 这本书一共有12章,像代码的坏味道,测试体系这类词已经屡见不鲜了. 第1章:重构,第一个示例 第2章:重构的原则 第3章:代码的坏味道 第4章:构筑测试体系 第5章:介绍重构名录 第6章:第一组重构 第7章:封装 第8章:搬移特性 第9章:重新组织数据 第10章:简化条件逻辑 第11章:重构API 第12章…
面向对象 现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程.面向对象和函数式编程.面向对象这种编程风格又是这其中最主流的.现在比较流行的编程语言大部分都是面向对象编程语言.大部分项目也都是基于面向对象编程风格开发的.面向对象编程因为其具有丰富的特性(封装.抽象.继承.多态),可以实现很多复杂的设计思路,是很多设计原则.设计模式编码实现的基础. 所以,在专栏的最开始,我们会详细地讲解面向对象编程的相关的知识,为学习后面的内容做铺垫.对于这部分内容,你需要掌握下面这 7 个大的知识点.…
我们会介绍几种方法,帮助你重构代码,以适配使用Lambda表达式,让你的代码具备更好的可读性和灵活性.除此之外,我们还会讨论目前比较流行的几种面向对象的设计模式, 包括策略模式.模板方法模式.观察者模式.责任链模式,以及工厂模式,在结合Lambda表达式之后变得更简洁的情况.最后,我们会介绍如何测试和调试使用Lambda表达式和Stream API的代码. 1. 为改善可读性和灵活性重构代码 1.1 改善代码的可读性 Java 8的新特性也可以帮助提升代码的可读性: 使用Java 8,你可以减少…
1. 引言     从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模式,如今打算系统的学习.学习以书<设计模式的艺术--软件开发人员内功修炼之道/刘伟著>为主.       所谓设计模式,即是前人对某类相似问题的抽象给出的解决方案.书中给出了23(Gof)+1(简单工厂模式)种设计模式.每种模式的学习将关注以下几点:名称(Name),问题(Problem),解决方…
封装一个独立弹窗Module,这里的弹窗包括普通的Dialog方式弹框和WindowManager方式弹窗.提供一种管理项目里面弹窗的方案,便于后期修改和维护. 首先描述一个在大项目中普遍存在的一个现象:由于项目的功能多,负责功能的人不同,当功能中需要一个普通的确定取消对话框时,大部分人都选择自己写了一个,自己new一个独立的弹窗出来.这样做的好处有以下几个: 代码逻辑独立,自己写的代码自己能控制 快速方便,便于修改,便于满足各种奇怪的需求 可是这个做法导致项目中存在大量的代码冗余,大量的分散的…
数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际开发中最为常见的设计范式有三个:第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式:第二范式在第一范式的基础之上更进一层.第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言).也…
一:设计模式简介 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心. ---- Christopher Alexander 软件设计领域设计模式: 设计模式描述了软件设计过程中某一类常见问题的解决方案. 面向对象的设计模式: 面向对象的设计模式描述了面向对象设计过程中,特定场景下,类与相互通信的对象之间常见的组织关系. 二: GOF 23种设计模式 历史性著作 <设计模式 : 可复用面向对象软件的基础>一书中描述了23种经典面向对象设计模式,创立了模式在软件设计中的…
世间万物,以俗眼观纷纷各异,以道眼观种种是常.面向对象思想不仅是编程的智慧,同样也是人生的智慧.通过生活去领悟面向对象的智慧,以面向对象的智慧来指导生活. (部分图片取自How I explained OOD to my wife) 一·单一职责原则(Single-Responsibility Principle) 定义:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中. 宿舍里并不能好好学习,自习还是得去图书馆.这是一条颠扑不破的真理!被无数学子千百次的实践所证明!我就想不通了,…
凡是写过一些代码的程序猿都能够意识到应该避免重复的代码和逻辑.我们通过提取方法,提取抽象类等等措施来达到这一目的.我们总能时不时的听到类似这样的话:”把这些公用的类放到shared项目去,别的项目还要使用...“,什么算是公用(重复)的代码?是不是公用(重复)的代码就要放到一个叫shared的地方? 为什么说重复的代码和逻辑会带来问题呢? 你从一个类中复制了一段代码到另一个类中,但是这段代码足够的稳定,百年不变,这样的重复会带来问题吗? 也许不会. 如果这段代码需要时不时的修改,那么你就要花时间…
1.单一职责原则的核心思想 一个类应该有且只有一个变化的原因. 2.为什么要引入单一职责原则 单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化的中心.当需求变化时,这个变化将通过更改职责相关的类来体现.如果一个类拥有多于一个的职责,则这些职责就耦合到在了一起,那么就会有多于一个原因来导致这个类的变化.对于某一职责的更改可能会损害类满足其他耦合职责的能力.这样职责的耦合会导致设计的脆弱,以至于当职责发生更改时产生无法预期的破坏. 在SRP中,把职责定义为变化的原因. 3.单一职责原则…