子类和父类的关系开始很简单,但是随着时间的推移有可能会变的越来越复杂。一个子类通常需要紧密的依赖其父类,但是有时会矫枉过正。
这就是继承的两面性,下面我们看看继承可能代码的Code Smell。
01 场景复现
需求描述
这是关于活动(Activity)和票(Ticket)的业务需求:
活动的主题(ActityType): session | workshop | read | TDD
活动(Activity)包含属性:日期、主题、基础价格
票有两种:普通票(Ticket)、VIP票(VIPTicket)
普通票(Ticket)的业务描述:
(1)是否有Session活动:如果主题是session且活动日期是工作日则返回true,否则返回false。
(2)获得票价:如果是如果周一到周四票价=原价,如果周五返回则票价=原价x2
(3)退款:活动开始前可以进行退款。
VIP票(VIPTicket)的业务需求:
(1)是否有Session活动:如果主题是session则返回true,否则返回false。
(2)获得票价:票价 = 如果是如果周一到周四票价=原价+100,如果周五返回则票价=原价x2+100
(3)是否有附加活动:如果活动主题为TDD或者制定了附加活动则返回true,否则返回false。
基于上面的业务需求,下面是一段具有“被拒绝的遗赠”Smell的代码,如下:
Activity.java
@Getter
public class Activity {
private final ActivityType type;
private final LocalDate date;
private final int price;
public Activity(ActivityType type, LocalDate date, int price) {
this.type = type;
this.date = date;
this.price = price;
}
public enum ActivityType {
WORKSHOP, TDD, SESSION}
}
Ticket.java
package com.page.refactoring