分类: C/C++
2012-03-25 18:31:31
对象无非是一堆接口,这些接口的好坏是面向对象成功的关键
Rename Method 重命名方法:一个好的方法名省去了N多不必要的注释。与其写个eom() 不如写成EndOfMonth()。这年头字符不值钱,不必吝惜那点墨水。而且方法名一定要贴切,int sub(a, b) { return a - b; } 这样的函数会让人很郁闷的。
Add Parameter 添加参数:当一个方法需要从调用者那获取更多的信息时,增加一个参数。
Remove Parameter 去除参数:当方法的某些参数并没有作用时,把它们去掉,可以让方法更加简洁。但要注意多态的情况。
Separate Query from Modifier 将查询方法与修改方法分离:一个函数就做一件事情,不要在返回值的同时用加入一些副作用。如果getA() {_a++; return a;} 调用者怎么也不会预料到每次取到的值都会不同。
Parameterize Method 参数化方法:如果一个类有几个方法很相似,可以考虑把它们合并成一个附加额外参数的方法。AddFive() 和 AddTen() 可以合并成Add(int)。
Replace Parameter with Explicit Methods 用显式方法代替参数: 这个和上面一条刚好相反。如果一个函数仅仅依靠参数,做着几件不同的事情,最好把它拆成几个不同的函数。比如:void set(string type, int value) { if (type == "width") width = value; else if (type == "height") height = value; } 除非你是为了使用某种设计模式或其它好的理由,否则最好把它拆成setWidth 和 setHeight。
Preserve Whole Object 保持对象完整:如果你有一个 对象Date,你有一个函数是这样的:NextDay(int year, int month, int day)。用户调用你的函数是就得这样:Date d = new Date; NextDay(d.year, d.month, d.day); 不如改写函数的参数 NextDay(Date d)。用户会很欢乐的。
Replace Parameter with Method 用方法代替参数: 如果你写出这样的代码:double money = GetSalary(); double tax = GetTax(money); 可以试着把GetTax的参数去掉。直接这样写:GetTax() { return GetSalary() * rate; } 这样用户调用起来方便一些。
Introduce Parameter Object 引入参数对象:如果参数太多太杂,可以考虑把它们整合成一个参数对象。GetValue(int min, int max) => GetValue(Range range); class Range { int min; int max }
Remove Setting Method 去除设置方法:如果有的变量只能设置一次,就不要为它提供Set方法 class Person { int ID; } ID出生时就给了你,以后就不能改了。那与其提供一个SetId()不如写成new Person(id) 或 InitializeId(id)。
Hide Method 隐藏方法:不要随便把方法public出去。要学会矜持,别人不用的方法把它改成private。以后要修改这个方法时,你就偷着乐了。
Replace Constructor with Factory Method 用工厂方法代替构造器: 当你需要在runtime是确定构建对象的类型时,你可以考虑Factory方法。Factory配上一堆接口,绝对完配。实践中的感悟。 interface IVerhicle{} IVerhicle pVerhicle = verhicleFactory.Create(); 这个factory可以根据你的需要创建出汽车,飞机,轮船。很欢乐。
Encapsulate Downcast 封装向下转型:如果你有一个这 样的函数 object GetPerson() { return CreateObject("Person"); } 用户使用你函数时需要这样:Person p = (Person)GetPerson(); 其实你可以减轻用户的痛苦:Person GetPerson() { return (Person)CreateObject("Person"); } 何乐而不为?
Replace Error Code with Exception 用异常代替错误码:如果你熟悉Windows编程,应该对GetLastError不陌生。时代不同了,throw一个Exception要更酷些。Exception可以让出错的地方和解决错误的地方更紧凑。
Replace Exception with Test 用测试代替异常: 不要滥用exception,只在真正需要的时候用。Exception对性能的影响是不小的。如果一个 if (index < array.length) return array[index] 可以解决问题,为什么非要写成try { return array.at(index); } catch(...) {}?