博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
步步为营 .NET 代码重构学习笔记 十三
阅读量:7074 次
发布时间:2019-06-28

本文共 7917 字,大约阅读时间需要 26 分钟。

一、Replace Exception with Test(以测试取代异常)

动机(Motivation)

面对一个[调用者可预先加以检查]的条件,你抛出了一个异常。修改调用者,使它在调用函数之前先做检查。

示例

private Dictionary
_values; public double GetValueForPeriod(int periodNumber) { try { return _values[periodNumber]; } catch { return 0; } }

 

改为

private Dictionary
_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 代码重构学习笔记系列

转载于:https://www.cnblogs.com/springyangwc/archive/2011/06/06/2073441.html

你可能感兴趣的文章
linux环境搭建seafile客户端自动上传文件
查看>>
10.27 函数
查看>>
MySQL查询缓存
查看>>
【问题总结】问题行
查看>>
这种放法会使div像一张纸一样
查看>>
阿里云环境配置
查看>>
Codeforces 455C
查看>>
PHP请求页面
查看>>
【动态规划】旅行
查看>>
Git小白入门
查看>>
基于 HTML5 的 WebGL 和 VR 技术的 3D 机房数据中心可视化
查看>>
PHP,JAVA,NET 开发比较
查看>>
平方开根 - 牛顿迭代(板子整理)
查看>>
java string字符拼接符"+"的研究
查看>>
Layui表格编辑【不依赖Layui的动态table加载】
查看>>
HDU2087剪花布条(KMP)
查看>>
NOIP2018普及初赛解析
查看>>
jQuery中$.extend(true,object1, object2);深拷贝对象
查看>>
圆角和倒角
查看>>
自然语言处理之维特比算法
查看>>