(मैंने इस प्रश्न को देखा है , लेकिन पहला उत्तर ऑटो प्रॉपर्टी के बारे में डिज़ाइन से अधिक है, और दूसरा कहता है कि उपभोक्ता से डेटा स्टोरेज कोड छिपाएं , जो मुझे यकीन नहीं है कि मुझे क्या चाहिए / मेरा कोड है) इसलिए मैं कुछ अन्य राय सुनना चाहूंगा)
मैं दो बहुत ही इसी तरह की संस्थाओं, है 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;
}
}
इंटरफ़ेस में एक एकल गेट्टर विधि है जिसे दो संस्थाएं लागू करती हैं, जो बेशक काम करती हैं, लेकिन मुझे संदेह है कि यह एक अच्छा डिजाइन है। यह किसी भी व्यवहार का प्रतिनिधित्व नहीं करता है, एक मूल्य पकड़े यह एक संपत्ति नहीं है। यह एक सरल मामला है, मेरे पास कुछ इसी तरह के और अधिक जटिल मामले हैं (3-4 गेटर्स के साथ)।
मेरा सवाल यह है कि क्या यह एक बुरा डिज़ाइन है? एक बेहतर तरीका क्या है?