重构学习笔记1. 封装集合                                                   

 

概念:本文所讲的封装集合就是把集合进行封装,只提供调用端需要的接口。

 

正文:在很多时候,我们都不希望把一些不必要的操作暴露给调用端,只需要给它所需要的操作或数据就行,那么做法就是封装。比如最经典的属性对字段的封装就是一个很好的例子。

 

我们想到以前系统间耦合常喜欢用数据库。每个系统都会操作数据库,并且有些系统还会对数据库的表结构或字段进行修改,那么这很容易就会造成维护的地狱,很明智的一个做法就是使用SOA来隔开这些耦合,让一些只需要数据展示的系统得到自己需要的数据即可。

 

 

重构学习笔记2. 移动方法                                      

 

概念:本文所讲的移动方法就是方法放在合适的位置(通常指放在合适的类中)。

 

正文:移动方法是一个很简单也很常见的重构,只要是系统就会存在很多类,那么类里面包括很多方法,如果一个方法经常被另外一个类使用(比本身的类使用还多)或者这个方法本身就不应该放在这个类里面,那么这个适合应该考虑把它移到合适的类中。

这个重构法则在很多时候能让我们把代码组织的结构调整得更合理,同时也能给以后的维护带来方便。

 

重构学习笔记3. 提升方法                                         

 

概念:提升方法是指将一个很多继承类都要用到的方法提升到基类中。

 

正文:提升方法是指将一个很多继承类都要用到的方法提升到基类中,这样就能减少代码量,同时让类的结构更清晰。这个重构要根据具体情况使用,如果不是每个子类都有这个方法的话,可以考虑使用接口或者其他方式。

 

 

重构学习笔记4. 降低方法                                      

 

概念:本文中的降低方法和前篇的提升方法整好相反,也就是把个别子类使用到的方法从基类移到子类里面去。

 

正文:个别子类使用到的方法从基类移到子类里面去。

 

总结:面向对象三大特征(继承、封装、多态)很多时候可以帮助我们,但同时也可能会造成使用过度或者使用不当,所以如何把握好设计,这个就变得至关重要。在什么时候使用继承的方式,在什么时候使用组合和聚合,接口和继承类的选择等久成了我们的重点。

 

重构学习笔记5. 提升字段                                      

 

概念:本文中的提升字段和前面的提升方法颇为相似,就是把子类公用的字段提升到基类中,从而达到公用的目的。

 

正文:这个重构的策略比较简单,同时也是比较常用的一些做法,最主要就是要注意权衡是否真的有这个必要,看这样做究竟有没有什么好处(比如只需要改一个地方,维护简便了,同时代码量也更少了等)。

 

重构学习笔记6. 降低字段                                       

 

概念:本文中的降低字段和前篇的提升字段正好相反,就是把基类中只有某些少数类用到的字段降低到使用它们的子类中。 

 

正文:此重构也是一个非常简单的重构,在很多时候我们都会不自觉的使用它。

 

重构学习笔记7. 改名(方法,类,参数)                                

 

概念:本文中的改名(方法,类,参数)是指在写代码的时候对类、方法、参数、委托、事件等等元素取一个有意义的名称。

 

正文:此重构经常被广大程序员所忽视,但是带来的隐患是不可估量的,也许老板要修改功能,那我们来看这段没有重构的代码(就算是自己写的,但由于时间和项目多等关系,我们也很难理解了),然后就会变得焦头烂额。相反重构后的代码就会觉得一目了然、赏心悦目。

 

重构学习笔记8. 使用委派代替继承                                   

 

概念:本文中的“使用委派代替继承”是指在根本没有父子关系的类中使用继承是不合理的,可以用委派的方式来代替。

 

如下代码所示,Child 和Sanitation (公共设施)是没有逻辑上的父子关系,因为小孩不可能是一个公共设施吧!所以我们为了完成这个功能可以考虑使用委派的方式。

namespace Reconstruction
{
    public class Sanitation
    {
        public string WashHands()
        {
            return "Cleaned!";
        }
    }
    public class Child : Sanitation
    {
    }
}

 

重构后的代码如下,把Sanitation 委派到Child 类中,从而可以使用 WashHands这个方法,这种方式我们经常会用到,其实IOC也使用到了这个原理,可以通过构造注入和方法注入等。

namespace Reconstruction
{
    public class Sanitation
    {
        public string WashHands()
        {
            return "Cleaned!";
        }
    }

    public class Child
    {
        private Sanitation Sanitation { get; set; }

        public Child()
        {
            Sanitation = new Sanitation();
        }

        public string WashHands()
        {
            return Sanitation.WashHands();
        }
    }
}

 

总结:这个重构是一个很好的重构,在很大程度上解决了滥用继承的情况,很多设计模式也用到了这种思想(比如桥接模式、适配器模式、策略模式等)。

 

重构学习笔记9. 提取接口                                      

 

概念:本文中的“提取接口” 是指超过一个的类要使用某一个类中部分方法时,我们应该解开它们之间的依赖,让调用者使用接口,这很容易实现也可以降低代码的耦合性。

 

正文将方法中的某个类提取称接口,方便将来的多态结构。这个重构策略也是一个常见的运用,很多设计模式也会在其中运用此思想(如简单工程、抽象工厂等都会通过接口来解开依赖)。

 

重构学习笔记10. 提取方法                                    

 

概念:本文中的把某些计算复杂的过程按照功能提取成各个小方法,这样就可以使代码的可读性、维护性得到提高。

 

正文:将各种逻辑分离开,比如A方法里面包含了多个逻辑,第一计算总和逻辑a,第二减法逻辑b,第三就是计算逻辑c。我们可以根据功能把他们拆分成三个小方法,而不是统统写到同一个方法里。

 

这个重构在很多公司都有一些的代码规范作为参考,比如一个类不能超过多少行代码,一个方法里面不能超过多少行代码,这在一定程度上也能使程序员把这些复杂的逻辑剥离成意义很清楚的小方法。

 

参考资料:圣殿骑士