请选择 进入手机版 | 继续访问电脑版

马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

重构之提练类(Extract Class)

[复制链接]
查看2577 | 回复2 | 2019-3-11 23:54:24 | 显示全部楼层 |阅读模式
本帖最后由 剑弑 于 2019-3-12 08:43 编辑

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

重构后
[C#] 纯文本查看 复制代码
 
 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
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则