2016-07-05 3 views
0

쿠폰 일종의 엔티티를 디자인 할 필요가 있습니다. 사용 예정일 속성이 있습니다. 문제는 기한이 사용자가 쿠폰을받은 후 60 일과 같이 특정 날짜가 할당되거나 계산 된 날짜 일 수 있다는 것입니다. 그래서 내 질문은 어떻게 다른 쿠폰의 기한을 쉽게 얻을 수 있도록이 요구 사항을 충족시키기 위해 쿠폰 엔티티를 디자인 할 수 있습니까? 모든 제안을 주시면 감사하겠습니다.엔티티 디자인 제안

다음은 예입니다. 지금 나는 UserCoupon의 두 엔티티와이 두 객체의 관계 엔티티를 가지고 있습니다.

@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()); 
     } 
    } 

    // .... 
} 
dueDate

Coupon 클래스 작성 periodDays 비즈니스 로직에 의해 mutualyl 배타적입니다. 즉, 쿠폰은 사용자가 쿠폰을 받으면 만기일을 계산하기 위해 고정 만기 날짜 또는 정수 속성 (periodDays)을가집니다.

오른쪽 지금은 Coupon 클래스에서 모두 2 개 필드를 넣을 수 있습니다,하지만 난 UserCoupon 클래스의 dueDate 필드를 설정해야 할 때, 나는 Coupon에서 상호 배타적 필드의 어떤을 확인하는 것이 조금 지루하고 불편 발견 클래스는 null이고 마지막으로 UserCoupon 클래스의 dueDate을 계산합니다 (UserCoupon 클래스 생성자 참조).

따라서 기한을 계산할 때 지루한 필드 Null 검사를 피할 수있는 좋은 엔티티 디자인 전략이 있는지 알고 싶습니다. Coupon 클래스의 2 개의 필드가 동시에 배타적인지 확인하십시오. 코드가 아니라 비즈니스 로직에 의해.

+0

질문에 약간의 차이가 있습니다. 아마도 당신의 시도를 (심지어 의사 코드로) 추가하여 당신이 달성하고자하는 것을 보여줄 수 있습니다. – user1803551

+0

@ user1803551 몇 가지 코드와 내 질문에 대한 자세한 설명을 추가했습니다. 그것이 당신에게 분명 희망입니다. :) – lute

+0

'dueDate'와'periodDays'를 기반으로'dueDate' 값을 계산하는'Coupon' 메서드를 만들 수 없습니까? – user1803551

답변

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 "그 결과를 제공하는 계약"을 가지고 있으므로 책임을 져야합니다.

+0

와우, 그런 간단한 방법으로 코드를 개선 할 수 있다는 것을 알지 못했습니다. 확실히 객체 지향 프로그래밍을 다시 검토해야합니다. 캡슐화를 완전히 잊었다는 사실을 상기시켜 주셔서 감사합니다. 이것은 좋은 대답이지만,'Coupon' 클래스는'dueDate'와'periodDays'가 상호 배제된다는 것을 보장 할 수 없습니다. '상호 배제'요건을 충족시키기 위해 '쿠폰'클래스가 개선 될 수 있다는 것은 완벽 할 것입니다. 당신의 시간과이 좋은 대답에 대해 많은 시간을 가져 주셔서 감사합니다. :) – lute

+0

@lute 상호 배제가 이미 외부에서 보장되고 있다고 생각했습니다. 그것이 아니기 때문에 나는 그것이 당신이 그것을 보장 할 수있는 곳이기 때문에 어떻게'Coupon'이 만들어 졌는지 알 필요가 있습니다. – user1803551

-1

만기 날짜와 활성화 날짜를 사용할 수 있으며 활성화되었을 때 만기 날짜를 설정할 수 있습니다.

+0

당신을 완전히 이해하지 못해서 미안합니다. 좀 더 자세히 설명해 주시겠습니까? – lute

+0

더 잘 생각하면 User/Cupom에 참여하기 위해 다른 엔티티/테이블을 매핑하면 더 좋을 것 같습니다. 이것은 사용자가 하나 이상의 cupom을 가질 수있는 경우에 유용 할 수 있습니다.이 새로운 엔티티에서 만기 날짜도 지정할 수 있습니다. –

+0

네, 그게 제가 지금까지 해왔 던 것입니다.기한이있는 법인/테이블에 기한을 기재했습니다. 그러나 기한의 가치를 어떻게 얻을 수 있을지 궁금합니다. 왜냐하면 2 가지 다른 출처에서 올 수 있기 때문입니다. 하나는 사용자가 쿠폰을받는 날짜와 상관없이 쿠폰이 작성 될 때 지정된 고정 만기 날짜입니다. 다른 하나는 쿠폰 활성화 후 90 일 동안과 같이 쿠폰을 활성화 한 후 고정 기간 동안 계산 한 동적 날짜입니다. 따라서 쿠폰은 고정 기한 날짜 또는 90 일과 같은 기간을 갖습니다. 쿠폰 엔티티에이 2 개의 상호 제외 된 속성을 정렬하는 방법은 내가 갇혀있는 것입니다. – lute