关于网站建设的参考文献,深圳老牌房企被曝全员解散,全国建设信息网官网,大理工程建设信息网站重构到底是什么#xff1f;只是代码的推倒重新编码#xff1f;还是有规则、有方法可寻#xff1f;当然#xff0c;结论肯定是有的#xff0c;本文#xff0c;我们通过一个简单的实例#xff0c;来理解一下重构。
1.借助一个实例需求
这是一个影片出租店用的程序#…重构到底是什么只是代码的推倒重新编码还是有规则、有方法可寻当然结论肯定是有的本文我们通过一个简单的实例来理解一下重构。
1.借助一个实例需求
这是一个影片出租店用的程序计算每一位顾客的消费金额并打印详单。操作者告诉程序顾客租了哪些影片、租期多长程序便根据租赁时间和影片类型计算出费用。影片分为三类普通片、儿童片和新片。除了计算费用还要为常客计算积分具体的租赁用户积分规则为 租赁规则 价格计算规则普通片儿 —— 起步价2¥超过2天的部分每天每部电影收费1.5元新片儿 —— 每天每部3元儿童片 —— 起步价2¥超过3天的部分每天每部电影收费1.5元 积分计算规则 每借一部电影积分加1新片每部加2 2. 实现重构
我们很容易实现了代码类图如下
但是此时考虑几个需求
/**
* 打印顾客的订单详情
* TODO 函数复杂
* TODO 如果有需求需要更改打印样式或者换一个html样式那么需要把statement copy一次
* TODO 如果需要修改计价规则则需要变更所有的计价函数
* TODO 如果需要新增类型则需要变更过所有的函数
* return
*/自然而然我们首先想到statment函数功能太复杂了那我们需要吧这个函数功能分解最简单的计算价格应该分离出来根据输入的影片类型还有租借天数得到了租赁的价格
Extract method将方法抽离
/**
* Extract method
* param rentUnit
* return
*/
private double getRentPrice(RentUnit rentUnit) {double temp 0;switch (rentUnit.getMovie().getMovieType()) {case NEW:temp rentUnit.getDays() * 3;if (rentUnit.getDays() 2) {temp (rentUnit.getDays() - 2) * 2.5;}break;case NORMAL:temp rentUnit.getDays() * 2;if (rentUnit.getDays() 2) {temp (rentUnit.getDays() - 2) * 1.5;}break;case CHILDREM:temp rentUnit.getDays() * 1;if (rentUnit.getDays() 2) {temp (rentUnit.getDays() - 2);}break;}return temp;
}这时大家发现抽离的方法依然有问题因为切记任何一个傻瓜都可以写出计算机理解的代码但是唯有写出人类容易理解的代码才是优秀的程序员。 所以这里我们采用 Rename field and method继续优化
大家此时发现没有其实这个方法和Customer没有关系的是和租赁类有关系的也就是每个租赁实体类应该有这样一个方法可以计算返回它的租赁价格 所以我们采用Move method移到合适的类中 积分规则同样如此操作
此时还有什么问题计价规则和积分规则其实是日后最容易变动的地方所以我们需要将其抽离
大家返回来看通过一系列简单的提炼操作是否现在代码对于需求的兼容性更高了呢 例如
我现在要改变积分规则或者计价规则只需修改RentUnit类即可我现在想要添加一个htmlstatement打印函数那么也可以自己调用相应的价格和积分计算函数
但是需要考虑一个事情影片分类增加怎么办某种影片类型的计价规则或者积分规则发生变化不应该是整体发生变化其实关键在于switch语句每次修改都需要修改这语句对于代码整体健壮性来说肯定是不对的。
那么我们把计价规则和积分规则先抽离到Movie类中这时有人会说这就简单了只需要去新增不同的Movie类然后去继承Movie从而实现计价规则和积分规则的变动但是大家切记如果是在一个大的系统中那么这样将是灾难性的后果因为这样变更之后意味着上层所有调用Movie实例的地方都必须去区分到底想要去调用哪种类型所以的地方都需要去改
但是我们站在开发使用的角度来讲我新建一个Movie类只需要告诉你类型就可以我不想关心这么多的东西我只想告诉你类型你让我新增相应的计价规则和积分规则即可。 有两个东西需要去做
一个是switch语句需要借助多态性去除另外一个不可以直接movie继承的方式去搞不然上层就得跟着变动而且这样设计后期上层的使用上也会诸多不便 重构到这里实例的所有需求都已兼容而且都是在不影响最上层调用的前提下完成的最主要我们是一步一步配合测试完成的 接下来思考这里还有什么问题
后期如果新增影片类型那么需要修改枚举定义中添加类型还需新增具体的影片的计价规则和积分计算规则也就是新增一个price类即可。
但是这里有一个问题就是需要修改Movie类因为这里有一个根据类型去新建price的switch语句那么这里应该怎么去优化呢