上一篇文章:java 代码重构-第一章(去除临时变量)
继续吧...
运用多态(Polymorphism)取代与价格相关的条件逻辑
前述有些重构码系从上版本里头拷贝过来——主要是循环设置部分。更深入的重构动作可以清除这些重复代码。我可以把处理表头(header)、表尾(footer)和报表细目的代码都分别提炼目出来。在 Form Template Method 实例中,.你可以看到如何做这些动作。但是,现在用户又开始嘀咕了,他们准备修改影片分类规则。我们尚未清楚他们想怎么做,但似乎新分类法很快就要引入,现有的分类法马上就要变更。与之相应的费用计算方式和常客积点计算方式都还待决定,现在就对程序做修改,肯定是愚蠢的。我必须进入费用计算和常客积点计算中,把「因条件 而异的代码」(译注:指的是switch 语句内的case 子句)替换掉,这样才能为 将来的改变镀上一层保护膜。现在,请重新戴回「重构」这顶帽子。
这个问题的第一部分是switch 语句。在另一个对象的属性(attribute)基础上运用switch 语句,并不是什么好主意。如果不得不使用,也应该在对象自己的数据上使用,而不是在别人的数据上使用。
看java代码
class Rental...
double getCharge() {
double result = 0;
switch (getMovie().getPriceCode()) {
case Movie.REGULAR:
result += 2;
if (getDaysRented() > 2)
result += (getDaysRented() - 2) * 1.5;
break;
case Movie.NEW_RELEASE:
result += getDaysRented() * 3;
break;
case Movie.CHILDRENS:
result += 1.5;
if (getDaysRented() > 3)
result += (getDaysRented() - 3) * 1.5;
break;
}
return result;
}
这暗示getCharge() 应该移到Movie class 里头去:
class Movie...
double getCharge(int daysRented) {
double result = 0;
switch (getPriceCode()) {
case Movie.REGULAR:
result += 2;
if (daysRented > 2)
result += (daysRented - 2) * 1.5;
break;
case Movie.NEW_RELEASE:
result += daysRented * 3;
break;
case Movie.CHILDRENS:
result += 1.5;
if (daysRented > 3)
result += (daysRented - 3) * 1.5;
break;
}
return result;
}
为了让它得以运作,我必须把「租期长度」作为参数传递进去。当然,「租期长度」来自收Rental 对象。计算费用时需要两份数据:「租期长度」和「影片类型」。为什么我选择「将租期长度传给Movie 对象」而不是「将影片类型传给Rental 对象」呢?因为本系统可能发生的变化是加入新影片类型,这种变化带有不稳定倾向。如果影片类型有所变化,我希望掀起最小的链滴,所以我选择在Movie 对象内计算费用。
我把上述计费方法放进Movie class 里头,然后修改Rental 的getCharge(),让它使用这个新函数(图1.12和图1.13):
class Rental...
double getCharge() {
return movie.getCharge(_daysRented);
}
搬移getCharge() 之后,我以相同手法处理常客积点计算。这样我就把根据影片类型而变化的所有东西,都放到了影片类型所属的class 中。
以下是重构前的代码:
class Rental...
int getFrequentRenterPoints() {
if ((getMovie().getPriceCode() == Movie.NEW_RELEASE) && getDaysRented() > 1)
return 2;
else
return 1;
}
重构如下:
Class rental..
int getFrequentRenterPoints() {
return movie.getFrequentRenterPoints(_daysRented);
}
class movie...
int getFrequentRenterPoints(int daysRented) {
if ((getPriceCode() == Movie.NEW_RELEASE) && daysRented > 1)
return 2;
else
return 1;
}
- 大小: 22.5 KB
- 大小: 22.1 KB
分享到:
相关推荐
Educoder题目:Java面向对象 - 封装、继承和多态的综合练习答案解析
Educoder题目:Java面向对象 - 封装、继承和多态答案解析
Java ------ 多态作业
第8章--virtual函数与多态
多态是 Java 中的一种机制,允许一个对象引用多种数据类型。多态的优点是可以提高代码的灵活性和扩展性。 在 Java 中,可以通过方法重写和方法重载来实现多态。方法重写是子类继承父类的方法,并提供不同的实现。...
Python工具箱.zip - 办公自动化、多态文件搜索、高级加密。Python工具箱.zip - 办公自动化、多态文件搜索、高级加密。Python工具箱.zip - 办公自动化、多态文件搜索、高级加密。Python工具箱.zip - 办公自动化、多态...
多态 Polymorphism 马克-to-win java视频的详细介绍
多态 Polymorphism 马克-to-win java视频的详细的介绍
在Java编程中,继承和多态是面向对象编程的核心概念,它们在软件设计中起着至关重要的作用。在这个实验中,我们看到一个具体的应用场景,即实现一个小型公司的工资管理系统,来阐述这两个概念。 首先,让我们理解...
JAVA基础-第4章继承与多态-练习题 本资源是关于JAVA基础的第四章继承与多态的练习题,涵盖了继承、多态、构造方法、方法覆盖、final类等知识点。本资源共有9道选择题,考察了程序员对JAVA语言的掌握程度。 在第1题...
多态Polymorphism 马克-to-win java视频的详细描述介绍
多态 Polymorphism 马克-to-win java视频的详细描述介绍
在Java中,多态性(Polymorphism)是面向对象编程的三大特性之一,另外两个是封装和继承。多态性使得代码更加灵活,能够处理不同类型的对象,提高代码的复用性。 在Java中,多态分为类多态和接口多态。类多态主要...
在Objective-C 2.0程序设计中,多态(Polymorphism)、动态类型(Dynamic Typing)和动态绑定(Dynamic Binding)是面向对象编程的重要概念,它们为代码提供了灵活性和可扩展性。本章主要围绕这三大主题展开,通过一...
1.4 运用多态取代与价格相关的条件逻辑 34 1.5 结语 52 第2章 重构原则 53 2.1 何谓重构 53 2.2 为何重构 55 2.3 何时重构 57 2.4 怎么对经理说 60 2.5 重构的难题 62 2.6 重构与设计 66 2.7 ...
Java程序设计中的继承、多态、重载与接口是面向对象编程的重要概念,它们构成了Java类体系的基础。让我们深入探讨一下这些主题。 1. **继承(Inheritance)** 继承是Java中一个核心特性,它允许一个类(子类)继承...
Java第8章 继承和多态含源代码 Java第8章 继承和多态含源代码Java第8章 继承和多态含源代码 Java第8章 继承和多态含源代码 Java第8章 继承和多态含源代码 Java第8章 继承和多态含源代码
Java编程语言以其强大的功能和广泛的应用而闻名,其中三大特性——封装、继承和多态是其核心概念,对于理解和编写高效、可维护的代码至关重要。 **封装**是面向对象编程的基础,它涉及到将数据(属性)和操作这些...
Java 语言程序设计第 5 章接口多态 本章主要讲解 Java 语言程序设计中接口和多态的概念、语法和应用。接口是 Java 语言中的一种抽象机制,它提供了一种定义类之间的“协议”的方式,允许类之间实现多继承,同时免除...
Java基础精品课11-多态录屏5.多态调用演示.mp4