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

本文共 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

你可能感兴趣的文章
初始化一个list集合
查看>>
js如何获取当前时间并对时间进行比较?
查看>>
MySql远程访问及防火墙设置
查看>>
XCode 已有项目添加 Git
查看>>
windows安装解压版mysql5.6以上
查看>>
位域,链接指示
查看>>
exchange 2013 相关日志查询
查看>>
Centos7-修复心脏滴血漏洞
查看>>
WINDOWS 2008 R2增量备份
查看>>
Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead.
查看>>
shell 中利用getopts
查看>>
我的友情链接
查看>>
PowerShell 基本概念
查看>>
block,inline和inline-block概念和区别
查看>>
python oracle数据库备份脚本
查看>>
环形矩阵
查看>>
mysql的数学函数
查看>>
golang 使用 gorp 的问题
查看>>
Java44: web基础3
查看>>
最近百度云盘不提供搜索,闲来无事,玩玩python爬虫,爬一下百度云盘的资源...
查看>>