10.8 replace parameter with methods(以函数取代参数)
来源:互联网 发布:3c证书编号 淘宝 编辑:程序博客网 时间:2024/05/06 01:19
动机:
如果函数可以通过其他途径获得参数值,那么它就不应该通过参数取得该值。过长的参数列会增加程序阅读者的理解难度,因此我们应该尽可能缩短参数列的长度。
方法一:看看参数接收端是否可以通过与调用端相同的计算来取得参数值。如果调用端通过其所属对象内部的另一个函数来计算参数,并在计算过程中未曾引用调用端的其他参数,那么你就应该可以将这个计算过程转移到被调用端内,从而去除该项参数。如果你所调用的函数隶属另一个对象,而该对象拥有调用端所属对象的引用,前面所说的这些也同样适用。
但是如果参数值的计算过程依赖于调用端的某个参数,那么你就无法去掉被调用端的参数,因为每一次调用动作中,该参数值都可能不同。另外,如果参数接收端没有参数发送端对象的引用,而你也不想加上这样一个引用,那么也无法去除参数。
有时候,参数的存在是为了将来的灵活性。这种情况下我们仍然会把这种多余参数拿掉。是的,你应该只必要光头才添加参数,预先添加的参数很可能并不是你所需要的。如果修改接口会对整个程序造成非常痛苦的结果,那么可以考虑预先加入的参数。如果真是这样,应该首先判断修改接口究竟会造成多严重的后果,然后考虑是否应该降低系统各部分之间的依赖,以减少修改接口所造成的影响。稳定的接口确实很好,但是被冻结在一个不良接口上也是有问题的。
做法:
如果有必要,将参数的结算过程提炼到一个独立函数中。
将函数本体内引用该参数的地方改为调用新建的函数。
旧代码
public double getPrice(){ int basePrice = _quantity * _itemPrice; int discountLevel; if(_quantity > 100) discountLevel = 2; else discountLevel = 1; double finalPrice = discountedPrice(basePrice, discountLevel); return finalPrice;}private double discountedPrice(int basePrice, int discountLevel){ if(discountLevel == 2) return basePrice * 0.1 else return basePrice * 0.05;}
新代码
public double getPrice(){ return discountedPrice();}private double discountedPrice(){ if(getdiscountLevel() == 2) return getBasePrice() * 0.1; else return getBasePrice() * 0.05;}private double getBasePrice(){ return _quantity * _itemPrice;}private int getDiscountLevel(){ if(_quantity > 100) return 2; else return 1;}
- 10.8 replace parameter with methods(以函数取代参数)
- 简化函数调用之六 :Replace Parameter with Explicit Methods(以明确函数取代参数)
- 10.6 replace parameter with explicit methods(以明确函数取代参数)
- 简化函数调用之八 :Replace Parameter with Method(以函数取代参数)
- Replace Static Variable with Parameter -- 以参数变量取代静态变量
- Replace Method with Method Object(以函数对象取代函数)
- 重新组织函数--Replace Method with Method Object(以函数对象取代函数)
- 6.8replace method with method object(以函数对象取代函数)
- java重构学习7:以函数对象取代函数(Replace Method with Method Object)
- Replace Method with Method Object(以函数对象取代函数)
- 简化函数调用之十五 :Replace Exception with Test(以测试取代异常)
- 重新组织函数--以查询取代临时变量(Replace Temp with Query)
- 重新组织你的函数之八 :Replace Method with Method Object(以函数对象取代函数)
- Replace Temp With Query(以查询取代临时变量)
- Replace Data Value with Object(以对象取代数据值)
- Replace Array with Object(以对象取代数组)
- Replace Record with Data Class(以数据类取代记录 )
- Replace Type Code with Class(以类取代型别码)
- 一个基数排序(桶子算法)算法的例子
- c++中把int转化为char
- 配置BlogEngine的问题总结
- ubuntu11.10 安装谷歌拼音输入法详细步骤
- BaseAdapter
- 10.8 replace parameter with methods(以函数取代参数)
- 第六章 - 图像变换 - 卷积边界(cvCopyMakeBorder)
- 编程思想与技术总结(一)
- VC 开机自动启动程序代码
- ArrayAdapter
- The ZALMAN ZM VE200 SATA hard disk caddy with DVD/HDD/FDD emulation
- 初次接触C语言,小白级问题。三个数,求最大者
- C++ 堆结构(数组实现)
- 求一个串中出现的第一个最长重复子串