# refactor_practice **Repository Path**: qintingsuo/refactor_practice ## Basic Information - **Project Name**: refactor_practice - **Description**: 影片出租店程度代码优化 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-12 - **Last Updated**: 2024-01-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 背景 这是一个影片出租店用的程序,计算每一位顾客的消费金额并打印详单,操作者告诉程序:顾客租了哪些影片,租期多长,程序便根据租赁时间和影片类型算出费用。影片分为三类:普通片、儿童片和新片。除了计算费用,还要为常客计算积分,积分会根据租片种类是否为新片而有不同。 ### example: ``` Rental Record for user1 regular movie 3.5 new movie 6.0 children movie 4.5 Amount owed is 14.0 You earned 4 frequent renter points ``` ## 新需求 用户希望改变**影片的分类规则**,但还没决定怎么改。不过可以肯定的是改动的方案会影响**顾客消费和常客积分点**的计算方式 ## 要求 根据新需求的要求对代码进行重构,使其更加符合面向对象精神,(可选:并添加HTML格式的输出详单实现)。 ## 优化思路 原始程序有三个类,分别为Moive、Rental、Customer,要想做好重构需分析他的类图,观察类的调用关系,识别出哪些类是紧耦合的, 哪些是可以提取的才能做好重构。 1、搬移金额计算代码 多数情况下此方法应放在他所使用的数据的归属对象内,amountFor()在Customer中,用的是Rental中的信息,运用Move Method将 amountFor()移至Rental中,更名为getCharge(),测试没问题后,修改所有引用点 2、提炼常客积分计算代码 积分计算和影片的种类和租赁的天数有关,运用Extract Method重构手法将积分计算移至Rental中,方法名getFrequentRenterPoints() 3、去除临时变量 在customer类中,用查询方法替换totalAmount和frequentRentalPoints,用getTotalCharge()取代totalAmount; 用getFrequentRentalPoints取代frequentRentalPoints 4、运用多态取代与价格相关的条件逻辑 Rental中getCharge中的switch用到Movie中获取影片类型的方法,按照1规则,把getCharge()再做一次搬移,将租赁天数作为getDaysRented() 作为参数传入。这个方法需要两项数据:租赁天数和影片类型,因为影片类型的变化带有不稳定倾向,也迁移至Movie;同样根据影片类型变化的积分计算 也迁移到Movie中 5、继承 movie有三种影片类型,出租的类型与价格不同,都会带来收益。建立movie的三个子类,每个都有自己的计费方法,用多态取代Switch. 根据类图分析,新建Price类,加入一个抽象方法abstract int getPriceCode();创建三个子类,NewReleasePrice、RegularPrice、ChildrensPrice, 所有子类加上具体的方法,最后修改priceCode的get和set方法,通过Price.getPriceCode()方法获取。