শুধুমাত্র গেটারদের সাথে একটি ইন্টারফেস কি কোডের গন্ধ হয়?


10

(আমি এই প্রশ্নটি দেখেছি , তবে প্রথম উত্তরটি নকশার চেয়ে অটো বৈশিষ্ট্য সম্পর্কে আরও বেশি যায় এবং দ্বিতীয়টি বলে যে গ্রাহকের কাছ থেকে ডেটা স্টোরেজ কোডটি লুকান , যা আমি নিশ্চিত / আমার কোডটি যা চায় তা নিশ্চিত নয়), সুতরাং আমি কিছু অন্য মতামত শুনতে চাই)

আমি দুই অনুরূপ সত্ত্বা, আছে 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;
    }
}

ইন্টারফেসটির একটি একক গেটর পদ্ধতি রয়েছে যা দুটি সত্তা বাস্তবায়ন করে, কোনটি অবশ্যই কাজ করে তবে আমি সন্দেহ করি এটি একটি ভাল নকশা। এটি কোনও আচরণের প্রতিনিধিত্ব করে না, প্রদত্ত কোনও মান হ'ল সম্পত্তি নয়। এটি একটি বরং সহজ কেস, আমার আরও কয়েকটি অনুরূপ, আরও জটিল কেস রয়েছে (৩-৪ গেটার সহ)।

আমার প্রশ্ন, এটি কি একটি খারাপ নকশা? এর চেয়ে ভাল পন্থা কী?


4
একটি ইন্টারফেসের উদ্দেশ্য আচরণের প্রতিনিধিত্ব না করে সংযোগের একটি প্যাটার্ন প্রতিষ্ঠা করা। এই দায়িত্ব বাস্তবায়নের পদ্ধতিগুলির মধ্যে পড়ে।
রবার্ট হার্ভে

আপনার প্রয়োগ হিসাবে, একটি প্রচুর পরিমাণে বয়লারপ্লেট রয়েছে (কাঠামো সরবরাহ ব্যতীত এমন কোড যা আসলে কিছুই করে না)। আপনি কি নিশ্চিত যে আপনার এটির সমস্ত প্রয়োজন?
রবার্ট হার্ভে

এমনকি ইন্টারফেসের পদ্ধতিগুলি কেবল 'গেটারস' এর অর্থ এই নয় যে আপনি বাস্তবায়নের জন্য 'সেটার' প্রয়োগ করতে পারবেন না (যদি সকলের
সেটটার থাকে

উত্তর:


5

আমি বলব আপনার নকশাটি একটু বিভ্রান্ত।

একটি সম্ভাব্য সমাধান হ'ল বলা একটি ইন্টারফেস তৈরি করা IDiscountCalculator

decimal CalculateDiscount();

এখন যে কোনও শ্রেণীর ছাড়ের প্রয়োজন তা এই ইন্টারফেসটি বাস্তবায়ন করবে। যদি ছাড়টি দিনের সংখ্যা ব্যবহার করে, তবে তা হউক, ইন্টারফেসটি বাস্তবিক বিবেচনা করে না কারণ এটি বাস্তবায়নের বিশদ।

সমস্ত ডিসকাউন্ট ক্লাসে এই ডেটা সদস্যের প্রয়োজন হলে দিনের সংখ্যা সম্ভবত কোনও প্রকারের বিমূর্ত বেস শ্রেণীর অন্তর্ভুক্ত। যদি এটি শ্রেণি নির্দিষ্ট হয় তবে কেবলমাত্র এমন একটি সম্পত্তি ঘোষণা করুন যা প্রয়োজনের উপর নির্ভর করে সর্বজনীন বা ব্যক্তিগতভাবে অ্যাক্সেস করা যেতে পারে।


1
আমি নিশ্চিত নই যে আমি তা প্রয়োগ HolidayDiscountএবং RentalDiscountপ্রয়োগের সাথে সম্পূর্ণ একমত IDiscountCalculator, কারণ তারা ক্যালকুলেটর ছাড় নয়। গণনাটি অন্যান্য পদ্ধতিতে করা হয় getMaxApplicableLengthDiscountHolidayDiscountএবং RentalDiscountছাড় হয়। ছাড়টি গণনা করা হয় না, প্রযোজ্য ছাড়ের এক প্রকার যা গণনা করা হয়, বা কেবলমাত্র ছাড়ের সংখ্যার মধ্যে নির্বাচন করা হয়।
user3748908

1
হতে পারে ইন্টারফেসকে আইডিসকাউন্টযোগ্য বলা উচিত। ক্লাস যা কিছু বাস্তবায়ন করতে পারে তা করতে পারে। যদি ছুটি / ভাড়া ছাড়ের ক্লাসগুলি কেবল ডিটিও / পোকো হয় এবং ফলাফলটি ভাল করে গণনা করার পরিবর্তে সঞ্চয় করে।
জন রেয়নর

3

আপনার প্রশ্নের উত্তর দেওয়ার জন্য: যদি কোনও ইন্টারফেসে কেবল গেট থাকে তবে আপনি একটি কোড গন্ধ শেষ করতে পারবেন না।

কোড গন্ধের জন্য একটি अस्पष्ट মেট্রিকের উদাহরণ হ'ল বহু পদ্ধতির ব্লাটেড ইন্টারফেসগুলি (যদি গ্রাহকরা না হয় তবে না)। তারা ইন্টারফেস বিভাজন নীতি লঙ্ঘন করে।

শব্দার্থক স্তরে একক দায়িত্বের নীতিটিও লঙ্ঘন করা উচিত নয়। যদি আপনি ইন্টারফেস চুক্তিতে একটি বিষয় নয় এমন বেশ কয়েকটি ভিন্ন সমস্যা হ্যান্ডল করে দেখেন তবে আমি লঙ্ঘন করেছি tend এটি সনাক্ত করা কখনও কখনও কঠিন এবং এটি সনাক্ত করার জন্য আপনার কিছু অভিজ্ঞতা প্রয়োজন।

অন্যদিকে আপনার সচেতন হওয়া উচিত যদি আপনার ইন্টারফেস সেটারগুলি সংজ্ঞায়িত করে। এটি কারণ সেটাররা রাষ্ট্র পরিবর্তন করতে পারে, এটি তাদের কাজ। এখানে জিজ্ঞাসা করার প্রশ্ন: ইন্টারফেসের পিছনের বস্তুটি কি বৈধ রাষ্ট্র থেকে অন্য বৈধ অবস্থায় রূপান্তর করে। তবে এটি মূলত ইন্টারফেসের সমস্যা নয় বরং বাস্তবায়নকারী অবজেক্টের ইন্টারফেস চুক্তির বাস্তবায়ন।

আপনার পদ্ধতির সাথে আমার কেবল উদ্বেগ হ'ল আপনি ওআর-ম্যাপিংগুলিতে কাজ করেন। এই সামান্য ক্ষেত্রে এটি কোনও সমস্যা নয়। প্রযুক্তিগতভাবে এটি ঠিক আছে। তবে আমি ওআর-ম্যাপযুক্ত বস্তুগুলিতে পরিচালনা করব না। তাদের অনেকগুলি ভিন্ন রাজ্য থাকতে পারে আপনি তাদের উপর পরিচালিত ক্রিয়াকলাপগুলিতে অবশ্যই তা বিবেচনা করবেন না ...

অর-ম্যাপযুক্ত অবজেক্টগুলি (পূর্বনির্ধারিত জেপিএ) ক্ষণস্থায়ী, ধ্রুবক বিচ্ছিন্ন অপরিবর্তিত, ধ্রুবক সংযুক্ত অপরিবর্তিত, ধ্রুবক বিচ্ছিন্ন পরিবর্তিত, ধ্রুবক সংযুক্ত পরিবর্তিত হতে পারে ... আপনি যদি সেই বিষয়গুলিতে শিমের বৈধতা ব্যবহার করেন তবে আপনি আরও দেখতে পারবেন না যে অবজেক্টটি চেক করা হয়েছে কি না। সর্বোপরি আপনি ওআর-ম্যাপযুক্ত অবজেক্টের 10 টিরও বেশি রাজ্য সনাক্ত করতে পারবেন। আপনার সমস্ত ক্রিয়াকলাপ কি এই রাজ্যগুলি সঠিকভাবে পরিচালনা করে?

আপনার ইন্টারফেস চুক্তিটি সংজ্ঞায়িত করে এবং বাস্তবায়ন এটি অনুসরণ করে তবে এটি অবশ্যই কোনও সমস্যা নয়। তবে ওআর-ম্যাপযুক্ত সামগ্রীর জন্য আমার যুক্তিযুক্ত সন্দেহ আছে যে এই জাতীয় চুক্তিটি পূর্ণ করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.