05 2011 档案
摘要:步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一、为何要代码重构 步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method) 步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method) 步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable) 步步为营 .NET 代码重构学习笔记 五、...
阅读全文
摘要:步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一、为何要代码重构 步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method) 步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method) 步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable) 步步为营 .NET 代码重构学习笔记 五、...
阅读全文
摘要:一、Introduce Foreign Method(引入外加函数)动机(Motivation)在client class 中建立一个函数,并以一个server class实体作为第一引数(argument)。示例DateTime newStart = DateTime.Now.AddDays(1);改为 public DateTime NextDate() { return DateTime.Now.AddDays(1); }二、Introduce Local Extension(引入本地扩展)动机(Motivation)建立一个新class,使它包含这些额外函数。让这个扩展品成为sourc
阅读全文
摘要:一、Extract Class(提炼类)动机(Motivation)一个class应该是一个清楚的抽象(abstract),处理一些明确的责任。但在实际工作中,class会不断成长扩展。这个class会变得过份复杂,很快,class就会变成一团乱麻。示例 public class Person { private string _name; private string _officeAreaCode; private string _officeNumber; public string Name { get { return _name; } set { _name = value; }
阅读全文
摘要:Move Method概述程序中,有个函数与其所驻class之外的另一个class进行更多交流,调用后者或被后者调用动机(Motivation)如果一个class有太多行为,或如果一个class与另一个class有太多合作而形成高度耦合(highly coupled),我们就会搬移函数。通过这种手段,我们可以使系统中的classes更简单,这些classes最终也将更干净利落地实现系统交付的任务。示例 public class MoveMethod { private AccountType _type; private int _daysOverdrawn; public double Ov
阅读全文
摘要:Replace Method with Method Object概述将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的值域(field),然后你可以在同一个对象中将这个大型函数分解为数个小型函数.动机(Motivation)小型函数优美动人,只要将相对独立的代码从大型函数中提炼出来,就可以大在提高代码的可读性.示例 public int Gamma(int inputValue, int quantity, int yearToDate) { int importantValue1 = inputValue * quantity + DateTime.Now.Minute; int
阅读全文
摘要: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) 以简短的函数表现动作意图,这样会使代码更清晰易读.但有时候你会遇到某些函数.其内部代码和函数名称同样清晰易读.也可能你重构了该函数,使得其内容和其名称变得同样清晰.果真如此,你就应该去掉这个函数,直接使用其中代码,间接可能带来帮助,但非...
阅读全文
摘要:动机(Motivation) Extract Method是我们最常用的重构手法之一.当我们看见一个过长的函数或一段需要注释才能让人理解用途的代码,我们就会将这段代码放进一个独立函数中. 有数个原因造成我们喜欢简短而有良好命名的函数.首先,如果每个函数的粒度都很小(finely grained),那么函数之间彼此复用的机会就更大;其次,这会使高层函数代码读起来就像一系列注释;再者,如果函数都是细粒...
阅读全文
摘要:最近在学习代码重构,根据自己的学习进度写一个关于代码重构的系列出来,供自己总结提高,也希望能对他人有所帮助。园子里有圣殿骑士的31 天重构学习笔记 给了我很多的启发,自己也在学习《Refactoring improving the Designe of Existing Code》(重构 改善既有代码的设计),希望在代码重构思想上能有自己的心得. 一、为什么要重构(Refactoring) 通过...
阅读全文
摘要:设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意.系列导航步步为营 .NET 设计模式学习笔记 一、开篇(设计模式之泡妞二十三招)步步为营 .NET 设计模式学习笔记 二、Abstract Factory(抽象工厂)步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)步步为营 .NET 设计模式学习笔记 四、Singleton(单例模式)步步为营 .NET 设计模式学习笔记 五、Prototype(原型模式)步步为营 .NE.
阅读全文
摘要:概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何应对这种变化?提供一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变?这就是要说的Factory Method模式了。 意图 定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Meth...
阅读全文
摘要:概述 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。 意图 给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。 结构图 角色说明: AbstractExp...
阅读全文
摘要:概述 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。 意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 结构图 ...
阅读全文
摘要:概述 表示一个作用于某对象结构中的元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作,它把数据结构和作用于结构上的操作之间的耦合性解脱开,使的操作结合可以相对自由地演化。优点是增加新的操作很容易,因为增加一个新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问对象中。 意图 实现通过统一的接口访问不同类型元素的操作,并且通过这个接口可以增加新的操作而不改变元...
阅读全文
摘要:概述 在软件构建过程中,经常会出现多个对象互相关联交互的情况, 对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。 在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。 意图 用一个中介对象来封装一系列的对象交互。 中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独...
阅读全文
摘要:概述 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合。 如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。 意图 责任链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到...
阅读全文