重构分析21: 被拒绝的遗赠(Refused Bequest)

子类和父类的关系开始很简单,但是随着时间的推移有可能会变的越来越复杂。一个子类通常需要紧密的依赖其父类,但是有时会矫枉过正。

这就是继承的两面性,下面我们看看继承可能代码的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
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值