分类: C/C++
2012-03-25 18:27:55
Self Encapsulate Fileld 自封装字段:用get/set方法存取数据。
Replace Data Value with Object 用对象代替数据值:如果你有一个成员变量string date,不如用一个对象Date date。
Change Value to Reference 将值对象改为引用对象:C++ 里Date类和Date*类型就是Value/Reference的关系,这样是比较明了。Java里Value可以是这样class A { Date getDate() { return new Date(); } },而相应的Reference可以是这样class A { Date getDate() { return this->_date; } }。Reference的好处是可以减少对象的复制开销,而且可以被修改,如果这是你想要的,把Value改为Reference。
Change Reference to Value 将引用对象改为值对象:Value的好处就是你把它传出去后,是死是活都与你无关了。它的值改变也不会影响你类的状态。如果你不在乎那些复制对象的开销的话,把Reference改为Value。
Replace Array with Object 用对象代替数组:数 组就应该只记录同种类的信息,有些人为了图方便这样写:string person[] = {"Jim", "12", "male"}; 用的时候就这样 name = person[0], age = person[1], *** = person[2]; 这样是不对的。用一个类class person {string name; int age; string ***;}。这样就好看多了。
Duplicate Observed Data 重复被观察数据:一般出现在MVC里。不要把UI和逻辑代码混在一起。UI持有一份数据,逻辑代码也持有同一份数据。众所周知,duplicate是代码里的巨恶,但这种重复是好的,被实践所证明的。
Change Unidirectional Association to Bidirectional 将单向关联改为双向:如果你需要两个对象彼此知道对方的信息,那你就要把它们双向关联。
Change Bidirectional Association to Unidirectional 将双向关联改为单向:双向关联会增加代码的复杂度,能不用尽量不用……
Replace Magic Number with Symbolic Constant 用字面常量代替魔数: 什么是Magic Number?3.14就是一个例子。可能你的代码会有一堆3.14出现。这样是不好的,如果你要把3.14改为3.1415926,就搞大了。 const double pie = 3.14;所有直接用到magic number的地方都用这个常量代替,以后程序就容易扩展了。
Encapsulate Field 封装字段:class Person { public string name; } => class Person { private string name; public {get;set;}}
Encapsulate Collecion 封装集合:class PersonGroup { public stringList names; } => class PersonGroup { private stringList names; public AddName(); public RemoveName(); public readonly getNames(); }
Replace Record with Data Class 用数据代替记录:比如从数据库里提出一行数据,可以用一个类装载这行数据里的所有项。
Replace Type Code with Class 用类代替类型码: 程序经常会用一个enumeration配上switch语句来进行条件切换。用enum的缺陷是它本质上就是一个int,用类来代替enum会强迫编译 器不接受int作为一个有效的类型。enum bloodGroup{o, A, B, AB}; => BloodGroup o; BloodGroup A; BloodGroup B; BloodGroup AB;
Replace Type Code with Subclass 用子类代替类型码: 有些类会用一些enum来改变自己的行为,比如class Employee { enum type {Engineer, Manager} } 如果Employee的type是Engineer时,它就做一些事,如果是Manager时,就做另一些事。这种情况下用子类会好很多。class Engineer : Employee {} class Manager : Employee {} 。简单明了。
Replace Type Code with State/Strategy 用State/Strategy代替类型码: 如果某种原因不能用subclass代替type code,或者type会在运行时改变,这时用State/Strategy代替type code。Employee { EmployeeType type; } class ManagerType : EmployeeType {} class EngineerType : EmployeeType {}。
Replace Subclass with Fields 用字段代替子类: 有时候有些子类做的东西太有限,仅仅是返回一个常量。比如class Person {virtual getCode(); } class Male : Person { getCode() {return 'M'; } } class Female : Person { getcode() {return 'F';} }。这样的子类存在的基本没什么意义,直接用Person来描述code的信息。class Person { Person(code); getCode(); } 这样直接使用Person就行,Person p = new Person('M') 或 new Person('F')。