本帖最后由 剑弑 于 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 著
熊节 译
|