(내가 본 이 질문을 하지만, 첫 번째 대답이 더 많은 설계에 대한보다 자동 속성에 대한 가고, 두 번째는 말한다 소비자의 데이터 저장 코드를 숨길 수 있는지 내가 원하는 것입니다 아니에요, / 내 코드 않습니다, 그래서 다른 의견을 듣고 싶습니다)
나는이 매우 유사 엔티티가 HolidayDiscount
와 RentalDiscount
'는 적어도 지속되는 경우로 길이 할인을 대표 numberOfDays
하는 percent
할인 적용을'. 테이블에는 다른 상위 엔터티에 대한 fks가 있으며 다른 위치에서 사용되지만 사용되는 경우 최대 적용 가능한 할인을 얻는 일반적인 논리가 있습니다. 예를 들어,의 HolidayOffer
수는 개 HolidayDiscounts
이며 비용을 계산할 때 적용 가능한 할인을 계산해야합니다. 렌탈과 동일합니다 RentalDiscounts
.
논리가 동일하기 때문에 단일 위치에 유지하고 싶습니다. 이것이 다음 방법, 술어 및 비교기의 기능입니다.
Optional<LengthDiscount> getMaxApplicableLengthDiscount(List<LengthDiscount> discounts, int daysToStay) {
if (discounts.isEmpty()) {
return Optional.empty();
}
return discounts.stream()
.filter(new DiscountIsApplicablePredicate(daysToStay))
.max(new DiscountMinDaysComparator());
}
public class DiscountIsApplicablePredicate implements Predicate<LengthDiscount> {
private final long daysToStay;
public DiscountIsApplicablePredicate(long daysToStay) {
this.daysToStay = daysToStay;
}
@Override
public boolean test(LengthDiscount discount) {
return daysToStay >= discount.getNumberOfDays();
}
}
public class DiscountMinDaysComparator implements Comparator<LengthDiscount> {
@Override
public int compare(LengthDiscount d1, LengthDiscount d2) {
return d1.getNumberOfDays().compareTo(d2.getNumberOfDays());
}
}
필요한 유일한 정보는 일 수이므로 인터페이스는 다음과 같습니다.
public interface LengthDiscount {
Integer getNumberOfDays();
}
그리고 두 개체
@Entity
@Table(name = "holidayDiscounts")
@Setter
public class HolidayDiscount implements LengthDiscount {
private BigInteger percent;
private Integer numberOfDays;
public BigInteger getPercent() {
return percent;
}
@Override
public Integer getNumberOfDays() {
return numberOfDays;
}
}
@Entity
@Table(name = "rentalDiscounts")
@Setter
public class RentalDiscount implements LengthDiscount {
private BigInteger percent;
private Integer numberOfDays;
public BigInteger getPercent() {
return percent;
}
@Override
public Integer getNumberOfDays() {
return numberOfDays;
}
}
인터페이스에는 두 엔티티가 구현하는 단일 getter 메소드가 있지만 물론 작동하지만 좋은 디자인인지는 의문입니다. 값을 보유하는 것이 속성이 아닌 경우 동작을 나타내지 않습니다. 이것은 다소 간단한 경우이며, 비슷하고 복잡한 몇 가지 사례가 더 있습니다 (3-4 게터 포함).
내 질문은 이것이 나쁜 디자인입니까? 더 나은 방법은 무엇입니까?