zoukankan      html  css  js  c++  java
  • 『重构--改善既有代码的设计』读书笔记----Inline Class

    如果某个类没有做太多的事情,你可以将这个类的所有特性搬移到另外一个类中,然后删除原类。可以看到,Inline Class正好和Extract Class相反,后者是将一个巨类分解成多个小类从而来分担责任。这里是一个类如果不再承担足够多的责任,不再有单独存在的理由(通常是因为重构动作移除了这个类的责任),我们就会挑选这种类使用最频繁的用户(类),以Inline Class把这个类塞到这个用户类中去。

    • 做法:
    • 寻找源类的所有public接口,然后在你目标类上对这些public接口进行声明,并将其中的函数内容全部作为委托函数委托至源类。如果以一个独立接口表示源类更适合的话,就应该在内联之前先使用Extract Class.
    • 修改所有源类引用点,改而引用目标类。在Java中你更可以将源类声明为private以此来斩断包外所有引用的可能。同时你也可以修改源类的名称,你可以利用这个技巧让编译器帮助你寻找针对源类的所有引用点。
    • 编译,测试。
    • 利用Move FieldMove Method把源类的特性全部搬移到目标类中去。
    • 删除源类。

    例子:

    class Person
    {
    public:
        QString name()
        {
            return m_name;
        }
        QString telephoneNumber()
        {
            return m_telephoneNumber.telephoneNumber();
        }
        TelephoneNumber telephoneClass()
        {
            return m_telephoneNumber;
        }
    private:
        TelephoneNumber m_telephoneNumber;
        QString m_name;
    };
    
    
    class TelephoneNumber
    {
        QString telephoneNumber()
        {
            return m_officeAreaCode + m_officeNumber;
        }
        
        QString officeAreaCode()
        {
            return m_officeAreaCode;
        }
        
        void setOfficeAreaCode(const QString &value)
        {
            m_officeAreaCode = value;
        }
        
        QString officeNumber()
        {
            return m_officeNumber;
        }
        
        void setOfficeNumber(const QString &value)
        {
            m_officeNumber = value;
        }
    private:
        QString m_officeAreaCode;
        QString m_officeNumber;
    };

    我们还是使用上篇的例子,一开始这两个类都是分离的,首先我在Person类中声明所有TelephoneNumber的public接口,在这里分别添加officeAreaCode()和officeNumber()给Person,并且函数全部为委托函数。

    class Person
    {
    public:
        QString name()
        {
            return m_name;
        }
        QString telephoneNumber()
        {
            return m_telephoneNumber.telephoneNumber();
        }
        TelephoneNumber telephoneClass()
        {
            return m_telephoneNumber;
        }
        QString officeAreaCode()
        {
            return m_telephoneNumber.officeAreaCode();
        }
        
        void setOfficeAreaCode(const QString &value)
        {
            m_telephoneNumber.setOfficeAreaCode(value);
        }
        
        QString officeNumber()
        {
            return m_telephoneNumber.officeNumber();
        }
        
        void setOfficeNumber(const QString &value)
        {
            m_telephoneNumber.setOfficeNumber(value);
        }
    private:
        TelephoneNumber m_telephoneNumber;
        QString m_name;
    };

    现在,我们要转出所有针对TelephoneNumber的用户,让他们使用Person的接口。

    Person rickyk;
    ricky.telphoneNumberClass().setAreaCode("781");

    我们发现了TelephoneNumber的接口,将他们改为

    Person rickyk;
    rickyk.setAreaCode("781");

    之后,我们反复使用Move Field和Move Method直到TelephoneNumber不复存在。

  • 相关阅读:
    最全的“大数据”学习资源
    民生银行十五年的数据体系建设,深入解读阿拉丁大数据生态圈、人人BI 是如何养成的?【转】
    大数据分析界的“神兽”Apache Kylin有多牛?【转】
    大数据环境下互联网行业数据仓库/数据平台的架构之漫谈-续【转】
    写给大数据开发初学者的话5[转]
    唯品会海量实时OLAP分析技术升级之路
    大数据学习笔记
    元数据
    数据仓库之数据模型
    官方教程:Apache Kylin和Superset集成,使用开源组件,完美打造OLAP系统
  • 原文地址:https://www.cnblogs.com/rickyk/p/4164201.html
Copyright © 2011-2022 走看看