标签:style blog http ar color 使用 sp java strong
如果某个类没有做太多的事情,你可以将这个类的所有特性搬移到另外一个类中,然后删除原类。可以看到,Inline Class正好和Extract Class相反,后者是将一个巨类分解成多个小类从而来分担责任。这里是一个类如果不再承担足够多的责任,不再有单独存在的理由(通常是因为重构动作移除了这个类的责任),我们就会挑选这种类使用最频繁的用户(类),以Inline Class把这个类塞到这个用户类中去。
例子:
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不复存在。
『重构--改善既有代码的设计』读书笔记----Inline Class
标签:style blog http ar color 使用 sp java strong
原文地址:http://www.cnblogs.com/rickyk/p/4164201.html