剑弑 发表于 2019-3-11 23:54:24

重构之提练类(Extract Class)

本帖最后由 剑弑 于 2019-3-12 08:43 编辑

       提练类(Extract Class),字面上的解释就是对类进行提练;为什么要提练类呢?提练类的情景是怎样产生的呢?怎样对类进行提练呢?对类进行提练有什么好处呢?
       不知道大家还记不记得,前面讲过的提炼函数(Extract Method)。我们要提炼一个函数,是因为它代码过长、逻辑不易理解,同样的对类进行提练也是因为,类的代码过长(类行业过多,责任过重)、类的逻辑难于理解(过于杂乱,一团乱麻),所以我们要对类进行提练,考虑可以分离的部分将它放到单独的类中。
       大家也许听过这样的教诲:“一个类应该是一个清楚的抽像,处理一些明确的责任”。但实际开发中,我们的类是不段成长的。你一会可能给类填加一些行为(功能),一会又新加入一些属性字段。。。等等,特别是在团队开发的时候,可能今天你新建了这个类,明天别人又对这个类加入新的功能。这就产生了大量的行为,大量的属性/字段,甚至有时候我们还要加入一些数据,导致代码过长、逻辑难于理解。
      怎样对类进行提练呢?其实提练类就三个步骤,一新建一个类,给类起一个符合的类名,再跟旧类建立联系;二把旧类可分离部分函数、属性/字段、数据等,使用前面进的搬移函数(Move Method)和搬移字段(Move Field)两种重构手法进行提练;三改变旧类的搬移函数的调用方式及判断类的访问权限(private、public、internal等)。
代码如下:
重构前

class Person
    {
      private string _name;
      private string _officeAreaCode;
      private string _officeNumber;

      public string Name { get; set; }
      public string OfficeAreaCode { get; set; }
      public string OfficeNumber { get; set; }
      

      public string getTelephoneNumber()
      {
            return string.Format("({0}){1}",_officeAreaCode ,_officeNumber);
      }
    }

重构后

class Person
      {
            private TelephoneNumber _officeTelephone = new TelephoneNumber();
            private string _name;

            public string Name { get; set; }

            public string getTelephoneNumber()
            {
                return string.Format("({0}){1}", _officeTelephone.OfficeAreaCode, _officeTelephone.OfficeNumber);
            }
      }

      class TelephoneNumber
      {
            private string _officeAreaCode;
            private string _officeNumber;

            public string OfficeAreaCode { get; set; }
            public string OfficeNumber { get; set; }

            public string getTelephoneNumber()
            {
                return string.Format("({0}{1})", _officeAreaCode, _officeNumber);
            }
      }


注意:
       1、旧类剩下责任与旧类名称不符,更改旧类类名;
       2、尽量使用单向连接,有可能新类与旧类要进行双向连接,但在你真正需要使用它之前,不要建立连接;
       3、新类的访问权限可以优先考虑跟旧类一样,要使用最适合的访问权限;
       4、提练后要进行多次编译测试,避免新类对系统造成影响。

      前面我们知道了为什么要提练类、提练情景是怎么产生的、怎样对类进行提练,哪我们做了这么多工作,提练类有什么好处呢?
       1、代码更简短、更简洁,看着舒服;
       2、逻辑更易理解,理解简单;
       3、复用性更高,调用方便;

参考文献
重构——改善既有代码的设计   【美】Martin Fowler 著
                                                                         熊节 译


ibcadmin 发表于 2019-3-13 08:54:28

111
页: [1]
查看完整版本: 重构之提练类(Extract Class)