前情回顾:
璐璐:22种代码坏味道之——重复的代码、过长的参数列表、数据泥团zhuanlan.zhihu.com过长函数
对于过长的方法,我们可以用Extract Method(提炼函数)进行重构。但是如果方法内有大量的参数和临时变量,它们会对你的函数提炼形成阻碍。
接下来仔细看计算税费的方法,逻辑是这样的,用优惠后的价格乘以税率就是需要缴的税,而价格超过200000的会打98折,而税率是根据排量的大小计算,1.6L排量下的为5%,1.6以上税率是10%
虽然只有几行代码,却不能一目了然的使人理解,主要是因为出现了临时变量,这时我们可以用一种重构手法——Replace Temp with Query(以查询取代临时变量)把此方法重构成如下方式。
private
过大类
对于过大的类,可以用Extract Class(提炼类)把不同的业务抽象到其他类中;如果一个类中的某些特性只能被一部分实例使用到,可以用Extract Subclass(提炼子类)的方法,将只能由一部分实例用到的特性转移到子类中,上面的汽车类Car.java就可以提炼出两个子类。
//Benz
发散式变化
多个业务发生变化时,修改的都是同一个类,说明此类承担的职责过多,可以运用Extract Class(提炼类)根据业务提炼到不同的类中。
举个例子,比如一个电商系统,有一个商品类,商品类中有计算价格和查询库存等方法:
霰弹式修改
一旦有业务修改,需要修改程序的多处,这种坏味道可以用Move Method(搬移函数)和Move Field(搬移值域)把相同业务的代码放进同一个类。
还是商品计算价格的例子,假设现在有很多种类的商品:促销商品,团购商品,秒杀商品,每种商品类中都有计算价格的方法,如下图: