摘要:
一、Remove Control Flag(移除控制标记)动机(Motivation)以break语句或return语句取代控制标记。示例view sourceprint?01public void CheckSecurity(string[] people) 02{ 03string found = string.Empty; 04for (int i = 0; i < people.Length; i++) 05{ 06if (found.Equals("")) 07{ 08if (people[i].Equals("Don")) 09{ 10 阅读全文
摘要:
一、Replace Type Code with Subclasses (以子类取代型别码)动机(Motivation)以一个subclass取代这个type code,如果面对的type code不会影响宿主类的行为,可以使用Replace Type Code with Class 来处理它们。但如果type code 会影响宿主类的行为,那么最好的办法就是借助多态(polymorphism)业处理 变化行为。示例view sourceprint?01public class Employee 02{ 03private int _type; 04public static int ENGI 阅读全文
摘要:
一、Duplicate Observed Data(复制[被监视数据])动机(Motivation)将该笔数据拷贝到一个domain object中。建立一个Observer模式,用以对domain object 和GUI object内的重复数据进行同步控制(sync)。示例步步为营 .NET 设计模式学习笔记 十二、Observer (观察者模式)二、Change Unidirectional Association to Bidirectional(将单向关联改为双向)动机(Motivation)添加一个反指针,并使修改函数(modifiers)能够同时更新两条连接。示例view sou 阅读全文
摘要:
一、Introduce Foreign Method(引入外加函数)动机(Motivation)在client class 中建立一个函数,并以一个server class实体作为第一引数(argument)。示例view sourceprint?1DateTime newStart = DateTime.Now.AddDays(1);改为view sourceprint?1public DateTime NextDate() 2{ 3return DateTime.Now.AddDays(1); 45}二、Introduce Local Extension(引入本地扩展)动机(Motivat 阅读全文
摘要:
一、Extract Class(提炼类)动机(Motivation)一个class应该是一个清楚的抽象(abstract),处理一些明确的责任。但在实际工作中,class会不断成长扩展。这个class会变得过份复杂,很快,class就会变成一团乱麻。示例view sourceprint?01public class Person 02{ 03private string _name; 04private string _officeAreaCode; 05private string _officeNumber; 0607public string Name 08{ 09get { retur 阅读全文
摘要:
Move Method概述程序中,有个函数与其所驻class之外的另一个class进行更多交流,调用后者或被后者调用动机(Motivation)如果一个class有太多行为,或如果一个class与另一个class有太多合作而形成高度耦合(highly coupled),我们就会搬移函数。通过这种手段,我们可以使系统中的classes更简单,这些classes最终也将更干净利落地实现系统交付的任务。示例view sourceprint?01public class MoveMethod 02{ 03private AccountType _type; 04private int _daysOve 阅读全文
摘要:
Replace Method with Method Object概述将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的值域(field),然后你可以在同一个对象中将这个大型函数分解为数个小型函数.动机(Motivation)小型函数优美动人,只要将相对独立的代码从大型函数中提炼出来,就可以大在提高代码的可读性.示例view sourceprint?1public int Gamma(int inputValue, int quantity, int yearToDate) 2{ 3int importantValue1 = inputValue * quantity + DateT 阅读全文
摘要:
Split Temporary Variable(剖解临时变量)概述程序中有某个临时变量被赋值超过一次,它既不是循环变量,也不是一个集用临时变量(collecting temporary variable)动机(Motivation)临时变量有各种不同用途,其中某些用途会很自然地导至临时变量被多次赋值.(循环变量)和(集用临时变量)就是两个典型例子:循环变量(loop variable)会随循环的每次运行而改变(例如 for(int i=0;i<10;i++))语句中的i);集用临时变量(collecting temporary variable)负责将(通过整个函数的运算)而构成的某个 阅读全文
摘要:
一、Inline Method概述一个函数,其本体(method body)应该与其名称(method name)同样清楚易懂.动机(Motivation)以简短的函数表现动作意图,这样会使代码更清晰易读.但有时候你会遇到某些函数.其内部代码和函数名称同样清晰易读.也可能你重构了该函数,使得其内容和其名称变得同样清晰.果真如此,你就应该去掉这个函数,直接使用其中代码,间接可能带来帮助,但非必要的间接性总是让人不舒服.作法(Mechanics)1、检查函数,确定它不具多态性(is not ploymorphic)如果subclass继承了这个函数,就不要将此函数inline化。因为subclas 阅读全文
摘要:
动机(Motivation)Extract Method是我们最常用的重构手法之一.当我们看见一个过长的函数或一段需要注释才能让人理解用途的代码,我们就会将这段代码放进一个独立函数中.有数个原因造成我们喜欢简短而有良好命名的函数.首先,如果每个函数的粒度都很小(finely grained),那么函数之间彼此复用的机会就更大;其次,这会使高层函数代码读起来就像一系列注释;再者,如果函数都是细粒度,那么函数的覆写(override)也会更容易些.的确,如果你习惯看人型函数,恐怕需要一段时间才能适应这种新风格.而且只有当你能给小型函数很好地命名时,它们才能真正起到作用,所以你需要在函数名称下点功夫 阅读全文
摘要:
最近在学习代码重构,根据自己的学习进度写一个关于代码重构的系列出来,供自己总结提高,也希望能对他人有所帮助。园子里有圣殿骑士的31 天重构学习笔记 给了我很多的启发,自己也在学习《Refactoring improving the Designe of Existing Code》(重构 改善既有代码的设计),希望在代码重构思想上能有自己的心得. 一、为什么要重构(Refactoring) 通过重构可以达到以下的目标: 1·持续偏纠和改进软件设计 重构和设计是相辅相成的,它和设计彼此互补。有了重构,你仍然必须做预先的设计,但是不必是最优的设计,只需要一个合理的解决方案就够了,如果没有 阅读全文