(Я видел этот вопрос , но первый ответ касается автоматических свойств больше, чем дизайна, а второй говорит , что нужно скрыть код хранилища данных от потребителя , что я не уверен, что я хочу / мой код делает, так что хотелось бы услышать другое мнение)
У меня есть две очень похожие сущности, HolidayDiscount
и они RentalDiscount
представляют скидки на длину как «если это длится, по крайней мере numberOfDays
, percent
скидка применима». Таблицы имеют fks для различных родительских объектов и используются в разных местах, но там, где они используются, существует общая логика для получения максимальной применимой скидки. Например, у a 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;
}
}
Интерфейс имеет один метод получения, который реализуют две сущности, который, конечно, работает, но я сомневаюсь, что это хороший дизайн. Он не представляет никакого поведения, учитывая, что значение не является свойством. Это довольно простой случай, у меня есть еще пара подобных, более сложных случаев (с 3-4 получателями).
Мой вопрос, это плохой дизайн? Какой подход лучше?