重构

重构改善已有代码

*爱你&永不变心* 提交于 2020-02-17 12:55:23
序言   前段时间改版升级老项目的时候,发现老项目的代码很多地方写的不够简洁,可读性及可扩展性较差。致使项目维护牵一发而动全身,严重影响了开发效率。 1.重复代码的提炼   重复代码是重构收效最大的手法之一,进行这项重构的原因不需要多说。它有很多很明显的好处,比如总代码量大大减少,维护方便,代码条理更加清晰易读。   它的重点就在于寻找代码当中完成某项子功能的重复代码,找到以后请毫不犹豫将它移动到合适的方法当中,并存放在合适的类当中。 class BadExample { public void someMethod1(){ //code System.out.println("重复代码");/* 重复代码块 */ //code } public void someMethod2(){ //code System.out.println("重复代码");/* 重复代码块 */ //code } } /* ---------------------分割线---------------------- */ class GoodExample { public void someMethod1(){ //code someMethod3(); //code } public void someMethod2(){ //code someMethod3(); //code } public

代码重构方向原则指导

岁酱吖の 提交于 2020-02-17 11:34:52
http://www.aqee.net/hill-climbing-wonkish/ 重构 是一种对软件进行修改的行为,但它并不改变软件的功能特征,而是通过让软件程序更清晰,更简洁和更条理来改进软件的质量。代码重构之于软件,相当于结构修改之于散文。每次人们对如何对代码进行重构的讨论就像是讨论如果对一篇文学作品进行修订一样无休无止。所有人都知道应该根据项目的自身情况来对代码进行重构,而重构是无止境的。莫扎特从来不不对他的作品进行修订,特罗洛普对自己作品修订的恰到好处,大多数作家认为他们俩这样做都是合适的,但他们的合适对于你我来说未必是合适的。 最常见的基本重构方法可以归纳为两个方向。通过 归纳方法 将一个长的过程分解为小的可以重用的组件,和通过 内联(inline)方法 来消除那些不够份量的小方法。我们可以 提炼方法 来让大量的子类共享相同的功能特征,我们可以 下放方法 来让只有用到这些功能的子类才知道它们的存在。重构就是爬山,通过一步一步的小的提高来逐渐的改进整体的质量, 但在重构时,我们如何知道哪种方法是上山的正确道路? 关于代码地形学的这个问题公认的方法有两种。去除有异味的代码和 重构成模式 。如果能做到这样,当然是很好的。就像是纠正作文里的一个语法错误或不恰当的比喻。如果我们可以找到这些四处隐藏的有异味的代码,将它们重写成整洁的,条理的,结构化的形式,何乐而不为

代码重构方向原则指导

一世执手 提交于 2020-02-17 11:32:14
重构 是一种对软件进行修改的行为,但它并不改变软件的功能特征,而是通过让软件程序更清晰,更简洁和更条理来改进软件的质量。代码重构之于软件,相当于结构修改之于散文。每次人们对如何对代码进行重构的讨论就像是讨论如果对一篇文学作品进行修订一样无休无止。所有人都知道应该根据项目的自身情况来对代码进行重构,而重构是无止境的。莫扎特从来不不对他的作品进行修订,特罗洛普对自己作品修订的恰到好处,大多数作家认为他们俩这样做都是合适的,但他们的合适对于你我来说未必是合适的。 最常见的 基本重构方法 可以归纳为两个方向。通过 归纳方法 将一个长的过程分解为小的可以重用的组件,和通过 内联(inline)方法 来消除那些不够份量的小方法。我们可以 提炼方法 来让大量的子类共享相同的功能特征,我们可以 下放方法 来让只有用到这些功能的子类才知道它们的存在。重构就是爬山,通过一步一步的小的提高来逐渐的改进整体的质量, 但在重构时,我们如何知道哪种方法是上山的正确道路? 关于代码地形学的这个问题公认的方法有两种。去除 有异味的代码 和 重构成模式 。如果能做到这样,当然是很好的。就像是纠正作文里的一个语法错误或不恰当的比喻。如果我们可以找到这些四处隐藏的有异味的代码,将它们重写成整洁的,条理的,结构化的形式,何乐而不为。但这些都是特殊情况。如果没有明显的模式来重构,或没有很直接的方法来去除代码异味

重构集团管理模式、创建

徘徊边缘 提交于 2020-02-16 01:45:41
重 构集团管理模式、创建 高效 组织 ——某特大型国有集团公司管理模式及组织机构设计项目 执笔人:李松涛     一、项目背景    某特大型国有集团公司,业务经营领域分布在十多个行业,不同行业发展规模、盈利能力、价值贡献、竞争能力和管理模式等均有较大差异。业务类型上既存在面向国家计划的封闭式业务内容,又存在面向市场竞争的开放式业务内容。   由于历史的原因,集团公司在对下属企业的管理控制上没有形成与战略相一致的有效模式,集团总部职能定位不清晰,原有职能部门的职责已不符合当前发展的要求。因此,集团公司必须提高运营效率,适应日益激烈的外部竞争,不断创造集团业务持续发展的能力,方能顺利实现集团公司的战略目标。   二、项目目标及内容   在对集团管理现状进行了初步分析之后,项目双方就咨询服务的目标和内容达成了一致。项目目标是重构集团管控模式、完善母子公司管理和考核体系;项目的内容为设计集团管理模式,协助实施总部组织机构调整,重构系统化管理流程,完善薪酬与绩效考核体系。    第一阶段的工作内容是集团管理模式及组织机构设计:    "重构集团管理模式":从集团总部的权利和价值贡献两个方面明确集团总部的管理定位,确定集团总部的关键管理职能;根据集团公司各产业板块的规模、结构、经营特点、管理水平以及其他相关因素,设计集团业务多元化下的管理模式;明确集团总部与各子公司间不同的集权分权关系

LintCode 605 序列重构

孤街醉人 提交于 2020-02-15 10:19:51
原文首发自 https://www.stdstring.com/2020/02/02/LintCode%20605%20%E5%BA%8F%E5%88%97%E9%87%8D%E6%9E%84/ 题目描述 判断是否序列 org 能唯一地由 seqs重构得出. org是一个由从1到n的正整数排列而成的序列,1 ≤ n ≤ 10^4。 重构表示组合成seqs的一个最短的父序列 (意思是,一个最短的序列使得所有 seqs里的序列都是它的子序列). 判断是否有且仅有一个能从 seqs重构出来的序列,并且这个序列是org。 思路解析 这道题的关键之处在于理解“重构”的概念。拿下面的例子来说,对于seqs = [[1,2],[1,3],[2,3]]这三个子序列来说,必须同时满足这三个前后顺序,也就是说,这三个数组其实是给定了三个前后关系: 1 必须在 2 的前面 1 必须在 3 的前面 2 必须在 3 的前面 这样,这道题就和课程表的题目非常相似了。所以,这道题目的关键也就是分层 BFS ,而且对于每一层,队列里的元素数目不能超过 1 个,也就是满足入度为 0 的元素最多只能有一个。因为假如同时有两个或以上元素满足入度为 0 的条件的话,此时就会有多个备选项可以选择,那么久不能满足“唯一”的要求了。 原文首发自 https://www.stdstring.com/2020/02/02

《重构:改善代码的既有设计》读书笔记

别说谁变了你拦得住时间么 提交于 2020-02-14 19:14:16
本文已同步发表在CSDN: http://blog.csdn.net/wenxin2011/article/details/50790939 第1章 重构,第一个案例 代码块俞小,代码的功能就俞容易管理,代码的处理和移动也就俞轻松。(功能也就越单一) 任何不会被修改的变量都可以被当成参数传入新的函数,至于会被修改的变量需要慎重。如果只有一个变量会被修改,可以把它当做返回值。 绝大多数情况下,函数应该放在它所使用的数据的所属对象内。 最好不要在另一个对象的属性基础上运用switch语句。如果不得不使用,也应该在对象自己的数据上使用,而不是在别人的数据上使用。 使用继承来适当组织类关系后,可以用多态取代switch语句。 一部影片可以在生命周期内修改自己的分类,一个对象却不能在生命周期内修改自己所属的类。 第2章 重构原则 三次法则:第一次做某件事时只管去做;第二次做类似的事会产生反感,但无论如何还是可以去做;第三次在做类似的是,你就应该重构。事不过三,三则重构。 在重构中引入间接层的某些价值: 允许逻辑共享 分开解释意图和实现 隔离变化 封装条件逻辑 封装条件逻辑。对象有一种奇妙的机制:多态消息,可以灵活而清晰地表达条件逻辑。将条件逻辑转化为消息形式,往往能降低代码的重复、增加清晰度并提高弹性。 第3章 代码的坏味道 重复代码:设法合二为一 同一个类的两个函数还有相同的表达式

《重构,改善既有代码的设计》读书笔记

一世执手 提交于 2020-02-13 23:02:09
重构,绝对是写程序过程中最重要的事之一。在写程序之前我们不可能事先了解所有的需求,设计肯定会有考虑不周的地方,而且随着项目需求的修改,也有可能原来的设计已经被改得面目全非了。更何况, 我们很少有机会从头到尾完成一个项目 ,基本上都是接手别人的代码,即使这个项目是从头参与的,也有可能接手其他组员的代码。我们都有过这样的经验,看到别人的代码时感觉就像屎一样,有一种强烈的想重写的冲动,但一定要压制住这种冲动,你完全重写,可能比原来的好一点,但浪费时间不说,还有可能引入原来不存在的Bug,而且,你不一定比原来设计得好,也许原来的设计考虑到了一些你没考虑到的情况。我们写的代码,终有一天也会被别人接手,很可能到时别人会有和我们现在一样的冲动。所以,我们要做的是重构,从小范围的重构开始。 重构不只可以改善既有的设计,还可以帮助我们理解原来很难理解的流程。比如一个复杂的条件表达式,我们可能需要很久才能看明白这个表达式的作用,还可能看了好久终于看明白了,过了没多长时间又忘了,现在还要从头看,如果我们把这个表达式运用Extract Method抽象出来,并起一个易于理解的名字,如果函数名字起得好,下次当我们再看到这段代码时,不用看逻辑我们就知道这个函数是做什么的。如果对这个函数内所有难于理解的地方我们做了适当的重构,把每个细小的逻辑抽象成一个小函数并起一个容易理解的名字

重构-改善既有代码的设计

我的未来我决定 提交于 2020-02-13 12:11:03
》重构:对软件内部的一种调整。目的是在不改变软件行为的前提下,提高其可理解性。降低修改成本。 》重构的第一步:为即将重构的代码建立一组测试环境。 》三次法则:事不过三,三则重构。 添加功能时候重构。 修补错误时重构。 》Duplicated code(重复代码) 如果在一个以上的地点看到相同的程序结构,合二为一,程序会更好。 》Long Method(过长函数) 1:如果代码的前方 有一行注释,就是在提醒你,可以将这段代码替换成一个函数。 2:条件表达式和循环也是提炼的信号。 》Large Class(过大的类) 如果想利用单个类做太多的事情。其内部往往会出现太多的实例变量。一旦如此。Duplicated Code也就接踵而至了。 》Long Parameter List(过长的参数) 》Divergent Change(发散式变化) 一个类受多种变化的影响 》Shotgun Surgevy(散弹式修改) 一个变化引发多个类进行修改。 》Feature Envy(依恋情节) 》Switch Statements(switch 惊悚现身) 用多态解决。 四:构筑测试体系。 》自测代码的价值 确保所有的测试都完全自动化,让他们检查自己的测试结果。 五:重构列表 》Extract Method(提炼函数) 你有一段代码可以被组织在一起并独立出来。 》Inline Method(内联函数)

代码习惯

时光毁灭记忆、已成空白 提交于 2020-02-11 08:07:55
前天在AgileChina2009上听了Fred George的演讲,他说他以前拿自己的代码给Kent Beck看,结果Kent说这代码很垃圾,你去看看我写的Smalltalk best practice patterns吧。然后Fred George就看了这本书并且完全按照书上的要求去做,5年后当他再给Kent看自己的代码时,Kent说很漂亮的代码。 考虑到Fred比Kent要老,可以看出Fred是非常虚心的,听了Kent的评价不仅没有生气,而且还完全听从了建议。当然这也可能是Kent太出名的缘故,若是我说他的代码不好,或许他就不会这样做了。 这让我联想到有一次和8x一起面试,8x的手工重构让我很是惊讶。虽然我也看过《重构》,虽然我平时也重构,但是不论从步伐还是安全性上,都相差深 远。我读《重构》的时候对如此小步伐的改变是不太赞同的,因为效率比较低。我认为书中之所以把条目分的很详细,每个条目的步骤很小很谨慎,完全是为了可以 让支持重构的工具得以实现,对于人来说,保持这样小的步骤太难了,不管是从记忆还是从操作的角度来看。然而8x的表现让我改变了看法,不仅速度并不慢,而 且安全性非常的高。回想起我的重构经常出现改错以后没法返回的问题,不禁感叹--差距啊。 经常在国内的论坛上看到各种讨论设计、架构的帖子,然而每每show代码的时候却发现一塌糊涂。当然他们自己不觉得,可是我觉得很不好

重构手法51:Remove Setting Method (移除设置函数)

笑着哭i 提交于 2020-02-11 07:18:47
类中的某个字段应该在对象创建时被设值,然后就不再改变。 去掉该字段的所有设值函数。 动机:如果你为某个字段提供了设值函数,这就暗示这个字段值可以被改变。如果你不希望在对象创建之后此字段还有机会被改变,那就不要为它提供设值函数。这样你的意图会更加清晰,并且可以排除其值被修改的可能性。 如果你保留了间接访问变量的方法,就可能经常有程序员盲目使用它们。这些人甚至会在构造函数中使用设值函数。 做法:1、检查设值函数被使用情况,看它是否只是被构造函数调用,或者被构造函数所调用的另一个函数调用。 2 、修改构造函数,使其直接访问设值函数所针对的那个变量。 3 、编译、测试。 4 、移除这个设值函数,将它所针对的字段设为const。 5 、编译、测试。 来源: https://www.cnblogs.com/matchcolor/archive/2010/08/11/1786434.html