一、Replace Exception with Test(以测试取代异常)
动机(Motivation)
面对一个[调用者可预先加以检查]的条件,你抛出了一个异常。修改调用者,使它在调用函数之前先做检查。
示例
private Dictionary<int, string> _values; public double GetValueForPeriod(int periodNumber) { try { return _values[periodNumber]; } catch { return 0; } }
改为
private Dictionary<int, string> _values; public double GetValueForPeriod(int periodNumber) { if (_values.ContainsKey(periodNumber)) return _values[periodNumber]; return 0; }
二、Pull Up Field(值域上移)
动机(Motivation)
两个subclasses拥有相同的值域,将此一值域移至superclass。
示例
public abstract class Emplayee { } public class Salesman : Emplayee { private string _name; public string Name { get { return _name; } set { _name = value; } } } public class Engineer : Emplayee { private string _name; public string Name { get { return _name; } set { _name = value; } } }
改为
public abstract class Emplayee { private string _name; public string Name { get { return _name; } set { _name = value; } } } public class Salesman : Emplayee { } public class Engineer : Emplayee { }
三、Pull Up Method(函数上移)
动机(Motivation)
有些函数,在各个subclass中产生完全相同的结果。将该函数移至superclass。
示例
public abstract class Emplayee { } public class Salesman : Emplayee { public string GetName() { return "spring yang"; } } public class Engineer : Emplayee { public string GetName() { return "spring yang"; } }
改为
public abstract class Emplayee { public string GetName() { return "spring yang"; } } public class Salesman : Emplayee { } public class Engineer : Emplayee { }
四、Pull Up Constructor Body(构造函数本体上移)
动机(Motivation)
在各个subclass中拥有一些构造函数,它们的本体代码几乎一致,在base中新建一个构造函数,并在subclass构造函数中调用它。
示例
public abstract class Emplayee { private string _ID; private string _name; public string ID { get { return _ID; } set { _ID = value; } } public string Name { get { return _name; } set { _name = value; } } } public class Salesman : Emplayee { public Salesman(string id, string name) { ID = id; Name = name; } }
改为
public abstract class Emplayee { private string _ID; private string _name; public string ID { get { return _ID; } set { _ID = value; } } public string Name { get { return _name; } set { _name = value; } } public Emplayee(string id, string name) { _ID = id; _name = name; } } public class Salesman : Emplayee { public Salesman(string id, string name):base(id,name) { } }
五、Push Down Method(函数下移)
动机(Motivation)
superclass中的某个函数只与部分(而非全部)subclasses有关。将这个函数移到相关的那些subclasses去。
示例
public abstract class Emplayee { public double GetQuota() { return 0; } } public class Salesman : Emplayee { } public class Engineer : Emplayee { }
改为
public abstract class Emplayee { } public class Salesman : Emplayee { public double GetQuota() { return 0; } } public class Engineer : Emplayee { }
六、Push Down Field(值域下移)
动机(Motivation)
superclass中的某个值域只被部分(而非全部)subclasses用到。将这个值域移到需要它的那些subclasses去。
示例
public abstract class Emplayee { private double _quota; public double Quota { get { return _quota; } set { _quota = value; } } } public class Salesman : Emplayee { } public class Engineer : Emplayee { }
改为
public abstract class Emplayee { } public class Salesman : Emplayee { private double _quota; public double Quota { get { return _quota; } set { _quota = value; } } } public class Engineer : Emplayee { }
七、Extract Subclass(提炼子类)
动机(Motivation)
class中的某些特性(features)只被某些(而非全部)实体(instances)用到,新建一个subclass,将上面所说的那一部分特性移到subclass中。
示例
public class JobItem { public double GetTotalPrice() { return 1000; } public double GetUnitPrice() { return 10; } public string GetEmployee() { return 100; } }
改为
public class JobItem:BaseItem { public double GetTotalPrice() { return 1000; } } public class BaseItem { public double GetUnitPrice() { return 10; } } public class LaborItem:BaseItem { public string GetEmployee() { return 100; } }
八、Extract Superclass(提炼超类)
动机(Motivation)
两个classes有相似特性(similar features)。为这两个classes建立一个superclass,将相同特性移至superclass。
示例
public class Department { public double GetAnnualCost() { return 1000; } public string GetName() { return "spring yang"; } public double GetHeadCount() { return 100; } } public class Employee { public double GetAnnualCost() { return 1000; } public string GetName() { return "spring yang"; } public int GetID() { return 1; } }
改为
public class LaborItem:BaseItem { public string GetEmployee() { return 100; } } public class Department:Party { public double GetHeadCount() { return 100; } } public class Employee:Party { public int GetID() { return 1; } } public class Party { public double GetAnnualCost() { return 1000; } public string GetName() { return "spring yang"; } }
九、Extract Interface(提炼接口)
动机(Motivation)
若干客户使用class接口中的同一子集;或者,两个classes的接口有部分相同。将相同的子集提炼到一个独立接口中。
示例
public class Employee { public double GetRate() { return 1; } public bool HasSpecialSkill() { return true; } public string GetName() { return "spring yang"; } public string GetDepartMent() { return "Development"; } }
改为
public class Employee:Billable { public double GetRate() { return 1; } public bool HasSpecialSkill() { return true; } public string GetName() { return "spring yang"; } public string GetDepartMent() { return "Development"; } } public interface Billable { double GetRate(); bool HasSpecialSkill(); }
十、Collapse Hierarchy(折叠继承体系)
动机(Motivation)
superclass 和subclass之间无太大区别。将它们合为一体。
示例
public class Employee { public string GetName() { return "spring yang"; } public string GetDepartMent() { return "Development"; } } public class Salesman { public int GetID() { return 1; } }
改为
public class Employee { public string GetName() { return "spring yang"; } public string GetDepartMent() { return "Development"; } public int GetID() { return 1; } }
步步为营 .NET 代码重构学习笔记系列
步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)
步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)
步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable)
步步为营 .NET 代码重构学习笔记 五、分解函数和替换算法(Replace Method And Substitute Algorithm)