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

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

步步为营 .NET 代码重构学习笔记系列

 

 

一、Duplicate Observed Data(复制[被监视数据])

动机(Motivation)

将该笔数据拷贝到一个domain object中。建立一个Observer模式,用以对domain object 和GUI object内的重复数据进行同步控制(sync)。

示例

 

二、Change Unidirectional Association to Bidirectional(将单向关联改为双向)

动机(Motivation)

添加一个反指针,并使修改函数(modifiers)能够同时更新两条连接。

示例

public class Order    {        private Customer _customer;        public Customer NewCustomer        {            get { return _customer; }            set { _customer = value; }        }    }    public class Customer    {    }

 

改为

public class Order    {        public List
CustomerList = new List
(); public void AddCustomer(Customer arg) { arg.orderlist.Add(this); CustomerList.Add(arg); } public void RemoveCustomer(Customer arg) { arg.orderlist.Remove(this); CustomerList.Remove(arg); } } public class Customer { public List
orderlist = new List
(); public void AddOrder(Order arg) { arg.CustomerList.Add(this); orderlist.Add(arg); } public void RemoveOrder(Order arg) { arg.CustomerList.Remove(this); orderlist.Remove(arg); } }

 

 

三、Change Bidirectional Association to Unidirectional(将双向改为单向)

动机(Motivation)

两个classes之间有双向关联,但其中一个class如今不再需要另一个class的特性。

示例

public class Order    {        public List
CustomerList = new List
(); public void AddCustomer(Customer arg) { arg.orderlist.Add(this); CustomerList.Add(arg); } public void RemoveCustomer(Customer arg) { arg.orderlist.Remove(this); CustomerList.Remove(arg); } } public class Customer { public List
orderlist = new List
(); public void AddOrder(Order arg) { arg.CustomerList.Add(this); orderlist.Add(arg); } public void RemoveOrder(Order arg) { arg.CustomerList.Remove(this); orderlist.Remove(arg); } }

 

 

改为

public class Order    {        private Customer _customer;        public Customer NewCustomer        {            get { return _customer; }            set { _customer = value; }        }    }    public class Customer    {    }

 

 

四、Replace Magic Number with Symbolic Constant(以符号常量/字面常量取侙魔法数)

动机(Motivation)

创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量。

示例

public double PotentialEnergy(double mass, double height)        {            return mass * 9.51 * height;        }

 

 

改为

private double GRAVITATIONAL_CONSTANT = 9.51;        public double PotentialEnergy(double mass, double height)        {            return mass * GRAVITATIONAL_CONSTANT * height;        }

 

 

 

五、Encapsulate Field(封装值域)

动机(Motivation)

将它声明为private,并提供相应的访问函数(accessors)

示例

public string _name;

 

 

改为

private  string _name;        public string Name        {            get { return _name; }            set { _name = value; }        }

 

 

六、Replace Type Code with Class(以类取代型别码)

动机(Motivation)

以一个新的class替换该数值型别码(type code)

示例

public class Person    {        public  int O = 0;        public  int A = 1;        public  int B = 2;        public  int AB = 3;        private int _bloodGroup;        public Person(int bloodGroup)        {            _bloodGroup = bloodGroup;        }        public int NewBloodGroup        {            get { return _bloodGroup; }            set { _bloodGroup = value; }        }    }

 

改为

public class Person    {        public int O = BloodGroup.O.Code;        public int A = BloodGroup.A.Code;        public int B = BloodGroup.B.Code;        public int AB = BloodGroup.AB.Code;        private int _bloodGroup;        public Person(int bloodGroup)        {            _bloodGroup = bloodGroup;        }        public int NewBloodGroup        {            get { return _bloodGroup; }            set { _bloodGroup = value; }        }    }    public class BloodGroup    {        public static BloodGroup O = new BloodGroup(0);        public static BloodGroup A = new BloodGroup(1);        public static BloodGroup B = new BloodGroup(2);        public static BloodGroup AB = new BloodGroup(3);        private int _code;        private BloodGroup(int code)        {            _code = code;        }        public int Code        {            get { return _code; }            set { _code = value; }        }    }

转载地址:http://qtfoa.baihongyu.com/

你可能感兴趣的文章
CRT + lrzsz 进行远程linux系统服务器文件上传下载
查看>>
nginx 域名跳转 Nginx跳转自动到带www域名规则配置、nginx多域名向主域名跳转
查看>>
man openstack >>1.txt
查看>>
linux几大服务器版本大比拼
查看>>
在BT5系统中安装postgresQL
查看>>
Can't connect to MySQL server on 'localhost'
查看>>
【Magedu】Week01
查看>>
写给MongoDB开发者的50条建议Tip25
查看>>
PostgreSQL学习手册(四) 常用数据类型
查看>>
为什么要让带宽制约云计算发展
查看>>
[iOS Animation]-CALayer 绘图效率
查看>>
2012-8-5
查看>>
VS中ProjectDir的值以及$(ProjectDir)../的含义
查看>>
我的友情链接
查看>>
PHP实现排序算法
查看>>
Business Contact Mnanager for Outlook2010
查看>>
9种用户体验设计的状态是必须知道的(五)
查看>>
解决WIN7下组播问题
查看>>
陈松松:视频营销成交率低,这三个因素没到位
查看>>
vmware nat模式原理探究,实现虚拟机跨网段管理
查看>>