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;}