实体设计建议

时间:2016-07-05 03:52:50

标签: java entity

我需要设计某种优惠券的实体,该实体具有截止日期属性供使用。问题是到期日可以是在用户获得优惠券之后从一段时间(例如60天)分配或计算的特定日期。所以我的问题是如何设计优惠券实体以满足这一要求,以便我可以轻松获得不同类型优惠券的截止日期?任何建议将不胜感激。

这是一个例子。现在我有2个实体ready()User,以及这2个对象的关系实体。

Coupon

@Entity @Table(name = "user") public class User { @Id @GeneratedValue private Long id; private String name; // .... } @Entity @Table(name = "coupon") public class Coupon { @Id @GeneratedValue private Long id; private Date dueDate; private Integer periodDays; // ... } @Entity @Table(name = "user_coupon") public class UserCoupon { @Id @GeneratedValue private Long id; @ManyToOne(fetch = FetchType.Lazy, optional = false) private User user; @ManyToOne(fetch = FetchType.Lazy, optional = false) private Coupon coupon; private Date dueDate; /** * Constructor */ public UserCoupon(User user, Coupon coupon) { this.user = user; this.coupon = coupon; if (coupon.getDueDate() != null) { this.dueDate = coupon.getDueDate(); } else if (coupon.getPeriodDays() != null) { this.dueDate = DateUtils.addDays(new Date(), coupon.getPeriodDays()); } } // .... } 类中填充的dueDateperiodDays是业务逻辑独有的mutualyl。也就是说,一旦用户获得优惠券,优惠券就会有固定的截止日期或整数属性(Coupon)来计算截止日期。

现在我可以将{2}字段放在periodDays类中,但是当我需要在Coupon课程中设置dueDate字段时,我发现它有点单调乏味且不方便检查UserCoupon类中哪些互斥字段为Coupon,最后计算出null类中的dueDate(请参阅UserCoupon类构造函数)

因此,我想知道是否有一些好的实体设计策略可以在计算截止日期时避免繁琐的字段空检查,并确保UserCoupon类中的2个字段在同时它们是由业务逻辑而不是代码互斥的。

2 个答案:

答案 0 :(得分:1)

我认为您可以将计算逻辑放在Coupon类中:

public class Coupon {

    private Date dueDate;

    private Integer periodDays;

    public Date getExpirationDate() { // name this whatever makes sense

        // assuming you can guarantee that one and only one is null == mutually exclusive
        return (dueDate != null) ? dueDate : DateUtils.addDays(new Date(), periodDays);
    }
}

然后在UserCoupon

public class UserCoupon {

    private Date dueDate;

    public UserCoupon(User user, Coupon coupon) {

        dueDate = coupon.getExpirationDate();
    }
}

这看起来清晰可读(对我来说),同时在设计方面有意义。这是因为"到期日期"计算仅取决于Coupon数据,因此应该是实现逻辑的数据。另一种看待它的方法是:其他课程不关心计算是如何完成的,他们只想要最终的结果。 Coupon"签订合同"提供该结果,因此它应该对此负责。

答案 1 :(得分:-1)

您可以使用截止日期和激活日期,并在激活时设置截止日期。