现在就重构来说是非常普通的,虽然我们经常会漏掉或忽略一些需要重构的地方.方法搬移,正如所定义的那样,把方法搬移到更适合他的位置.让我们看看下面这一段重构前的代码: 理解:方法搬移,正如所定义的那样,把方法搬移到更适合他的位置. 详解:如果一个类中某个方法,经常被其他类使用(比自身使用的次数还多),或者这个方法本身不适合这个类,可以考虑把这个方法搬移到更适合他的类中. public class BankAccount { public BankAccount(int accountAge, int…
重构第二式:搬移方法 (Refactoring 2: Move Method) 毋容置疑,搬移方法(Move Method)应该是最常用的重构手段之一,正因为太常用而且较为简单,以至于很多人并不认为它是一种很有价值的重构,但事实并非如此,在最初的代码诞生之后,有些方法可能会被放在一些不合适的地方,例如,一个方法被其他类使用比在它所在的类中的使用还要频繁或者一个方法本身就不应该放在某个类中时,我们应该考虑将它移到更合适的地方.搬移方法,顾名思义就是将方法搬移至合适的位置,如将方法搬移到更频繁地使用…
你的程序中,某个字段被其所驻类之外的另一个类更多的用到.在目标类建立一个新字段,修改源字段的所有用户,令它们改用新字段.        动机:在类之间移动状态和行为,是重构过程中必不可少的措施.随着系统发展,你会发现自己需要新的类,并需要将现有的工作责任拖到新的类中.在这个星期看似合理而正确的设计决策,到了下个星期可能不再正确.这没问题,如果你从来没遇到这种情况,那才有问题. 如果发现对于一个字段,在其所驻类之外的另一个类中有更多函数使用了它,就考虑搬移这个字段.上述所谓“使用”可能是通过设值/…
你的程序中,有个函数与其所驻类之外的另一个类进行更多的交流:调用后者,或被后者调用.在该函数最常用引用的类中建立一个有着类似行为的新函数.将旧函数编程一个单纯的委托函数,或是将旧函数完全移除. 动机:“搬移函数”是重构理论的支柱.如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,就需要搬移函数.通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落的实现系统交付的工作. 浏览类的所有函数,从中找出这样的函数:使用另一个对象的次数比使用自己所驻对象的次数还多.一旦移动了…
理解:降低方法,就是把基类中的某个方法,提出来放到继承类当中去. 详解: 上一节我们讲了方法的提公,是把多于一个继承类都要用到的方法,提出来放到基类中去,来提高代码的可维护性和重用性.那么这一节,我们所讲述的正好相反.就是把基类中不常用的方法,或者只有某个继承类会用到的方法,踢出去,搬移到需要他的类中去,来让结构更清晰,提高代码的可读性. 重构前代码: using System; using System.Collections.Generic; using System.Linq; using…
明确函数所在类的位置是很重要的.这样可以避免你的类与别的类有太多耦合.也会让你的类的内聚性变得更加牢固,让你的整个系统变得更加整洁.简单来说,如果在你的程序中,某个类的函数在使用的过程中,更多的是在和别的类进行交互,调用后者或者被后者调用,那么你就要注意了,你要去判断这个类是否真正适合他原来所在的类. 简单来说,这套手法就是在该函数最常引用的新类中建立一个有着类似行为的新函数,让旧函数变成一个单纯的委托函数或者完全删掉. Move Method是重构理论的支柱.如果一个类的责任太多,或者一个类和…
svn是一款非常简便,易用的源代码管理工具,用了这么多年,对它情有独钟.都说习惯最难改,那为何要搬移到gitlab上呢? 喜欢尝试新东西,前提还是git比较强大,svn有的它都有,svn没有的它也有. 这次是把公司有7年历史的svn项目搬移到gitlab上,期间各种折腾,有几点原因: 1.第一次使用git. 2.gitlab托管到linux服务器上,对命令不熟悉. 3.跟着前人的路走,以为这样能少走弯路,结果方法没对,没搞懂原理就跟随. 4.svn服务器上很多历史版本已经损毁. 后来才知道以上问…
理解:本文中的“提取方法对象”是指当你发现一个方法中存在过多的局部变量时,你可以通过使用“提取方法对象”重构来引入一些方法,每个方法完成任务的一个步骤,这样可以使得程序变得更具有可读性. 详解:如下代码所示,Order 类中的Calculate方法要完成很多功能,在之前我们用“提取方法”来进行重构,现在我们采取“提取方法对象”来完成重构. 重构前代码: using System; using System.Collections.Generic; using System.Linq; using…
对于区间旋转使用lazy思想就能解决.然后对于区间搬移,先把a-1结点做根,b+1作为它的右孩子,这样ch[ch[root][1]][0]就是区间[a,b],现将他取出. 然后在将当前的树伸展,把c结点转到根,c+1作为它的右孩子,这样c+1结点的左孩子就是空的,直接将上次取出的作为c+1结点的做孩子即可. #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<…
好题.我做了很久,学了大牛们的区间搬移.主要的代码都有注释. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define INF 999999999 #define key_value ch[ch[root][1]][0] using namespace std; ; ],s[MAXN],key[MAXN],tot1,tot2,root,ans[MAXN]…