(আমি এই প্রশ্নটি দেখেছি , তবে প্রথম উত্তরটি নকশার চেয়ে অটো বৈশিষ্ট্য সম্পর্কে আরও বেশি যায় এবং দ্বিতীয়টি বলে যে গ্রাহকের কাছ থেকে ডেটা স্টোরেজ কোডটি লুকান , যা আমি নিশ্চিত / আমার কোডটি যা চায় তা নিশ্চিত নয়), সুতরাং আমি কিছু অন্য মতামত শুনতে চাই)
আমি দুই অনুরূপ সত্ত্বা, আছে 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;
}
}
ইন্টারফেসটির একটি একক গেটর পদ্ধতি রয়েছে যা দুটি সত্তা বাস্তবায়ন করে, কোনটি অবশ্যই কাজ করে তবে আমি সন্দেহ করি এটি একটি ভাল নকশা। এটি কোনও আচরণের প্রতিনিধিত্ব করে না, প্রদত্ত কোনও মান হ'ল সম্পত্তি নয়। এটি একটি বরং সহজ কেস, আমার আরও কয়েকটি অনুরূপ, আরও জটিল কেস রয়েছে (৩-৪ গেটার সহ)।
আমার প্রশ্ন, এটি কি একটি খারাপ নকশা? এর চেয়ে ভাল পন্থা কী?