এনাম প্রচুর বুলিয়ান বৈশিষ্ট্য সহ


11

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

প্রতিটি পৃষ্ঠায় একটি 4-অক্ষরের পৃষ্ঠা কোড দেওয়া হয় এবং এই পৃষ্ঠা কোডগুলি বর্তমানে স্ট্যাটিক স্ট্রিং হিসাবে শ্রেণিতে তালিকাভুক্ত হয়:

public class PageCodes {
    public static final String FOFP = "FOFP";
    public static final String FOMS = "FOMS";
    public static final String BKGD = "BKGD";
    public static final String ITCO = "ITCO";
    public static final String PURF = "PURF";
    // etc..
}

এবং প্রায়শই কোডগুলিতে আমরা এই জাতীয় কোড দেখতে পাই ( 1 ম ফর্ম ):

if (PageCode.PURF.equals(destinationPageCode) || PageCodes.ITCO.equals(destinationPageCode)) {
    // some code with no obvious intent
} 
if (PageCode.FOFP.equals(destinationPageCode) || PageCodes.FOMS.equals(destinationPageCode)) {
    // some other code with no obvious intent either
} 

যা পড়ার জন্য একধরণের ভয়াবহ কারণ এটি দেখায় না যে এই পৃষ্ঠাগুলির সাধারণ সম্পত্তি কী কোডের লেখককে এখানে একত্রিত করেছিল? আমাদের ifবুঝতে শাখায় কোডটি পড়তে হবে ।

বর্তমান সমাধান

এইগুলি ifবিভিন্ন শ্রেণীর বিভিন্ন ব্যক্তি দ্বারা ঘোষিত পৃষ্ঠাগুলির তালিকা ব্যবহার করে আংশিকভাবে সরল করা হয়েছে। এটি কোডটিকে ( 2 য় ফর্ম ) মতো দেখায় :

private static final List<String> pagesWithShoppingCart = Collections.unmodifiableList(Arrays.asList(PageCodes.ITCO, PageCodes.PURF));
private static final List<String> flightAvailabilityPages = Collections.unmodifiableList(Arrays.asList(PageCodes.FOMS, PageCodes.FOFP));

// later in the same class
if (pagesWithShoppingCart.contains(destinationPageCode)) {
    // some code with no obvious intent
} 
if (flightAvailabilityPages.contains(destinationPageCode)) {
    // some other code with no obvious intent either
} 

... যা অভিপ্রায়টি আরও ভালভাবে প্রকাশ করে। কিন্তু ...

বর্তমান সমস্যা

এখানে সমস্যাটি হ'ল আমরা যদি একটি পৃষ্ঠা যুক্ত করি তবে তাত্ত্বিকভাবে আমাদের কোড কোডটি if()বা সেই জাতীয় তালিকায় আমাদের পৃষ্ঠা যুক্ত করতে হবে কিনা তা অনুসন্ধানের জন্য আমাদের সমস্ত কোড বেসের মধ্য দিয়ে যেতে হবে ।

এমনকি যদি আমরা সেই সমস্ত তালিকা PageCodesস্থিতিশীল ধ্রুবক হিসাবে শ্রেণিতে স্থানান্তরিত করি , তবুও তাদের নতুন পৃষ্ঠাটি সেই তালিকার কোনওটিতে ফিট করে কিনা এবং এটি অনুসারে এটি যুক্ত করার জন্য এটি বিকাশকারীদের কাছ থেকে শৃঙ্খলার প্রয়োজন।

নতুন সমাধান

আমার সমাধানটি ছিল এনাম তৈরি করা (কারণ পৃষ্ঠা কোডগুলির একটি সুনির্দিষ্ট সুপরিচিত তালিকা রয়েছে) যেখানে প্রতিটি পৃষ্ঠায় এমন কিছু বৈশিষ্ট্য রয়েছে যা আমাদের সেট করতে হবে:

public enum Page {
    FOFP(true, false),
    FOMS(true, false),
    BKGD(false, false),
    PURF(false, true),
    ITCO(false, true),
    // and so on

    private final boolean isAvailabilityPage;
    private final boolean hasShoppingCart;

    PageCode(boolean isAvailabilityPage, boolean hasShoppingCart) {
        // field initialization
    }

    // getters
}

তারপরে শর্তসাপেক্ষ কোডটি এখন এটির ( 3 য় ফর্ম ) দেখাচ্ছে:

if (destinationPage.hasShoppingCart()) {
    // add some shopping-cart-related data to the response
}
if (destinationPage.isAvailabilityPage()) {
    // add some info related to flight availability
}

যা খুব পঠনযোগ্য। তদ্ব্যতীত, কারও যদি কোনও পৃষ্ঠা যুক্ত করার প্রয়োজন হয়, তবে সে প্রতিটি বুলিয়ান সম্পর্কে চিন্তা করতে বাধ্য হয় এবং এটি তার নতুন পৃষ্ঠার জন্য সত্য বা মিথ্যা কিনা।

নতুন সমস্যা

একটি সমস্যা আমি দেখতে পাচ্ছি যে সম্ভবত এটির মতো 10 টি বুলিয়ান থাকতে পারে যা নির্মাতাকে সত্যই বড় করে তোলে এবং আপনি কোনও পৃষ্ঠা যুক্ত করার সাথে সাথে ডিকোলেশনটি পেতে খুব কঠিন হতে পারে। কারও কি এর চেয়ে ভাল সমাধান আছে?

উত্তর:


13

আপনি ধারণাটি আরও একধাপ এগিয়ে নিয়ে যেতে পারেন এবং বুলিয়ান ব্যবহারের পরিবর্তে আপনার পৃষ্ঠা বৈশিষ্ট্যের জন্য একটি এনাম সংজ্ঞায়িত করতে পারেন।

এটি কোনও পৃষ্ঠায় কোনও বৈশিষ্ট্য যুক্ত / সরানো সহজ করে তোলে এবং 30-40 সম্ভাব্য বৈশিষ্ট্য থাকা সত্ত্বেও পৃষ্ঠা সংজ্ঞাটি তাত্ক্ষণিকভাবে পাঠযোগ্য করে তোলে।

public enum PageFeature {
    AVAIL_PAGE,
    SHOPPING_CART;
}

public enum Page {
    FOFP(AVAIL_PAGE),
    FOMS(AVAIL_PAGE),
    BKGD(),
    PURF(SHOPPING_CART, AVAIL_PAGE),

    private final EnumSet<PageFeature> features;

    PageCode(PageFeature ... features) {
       this.features = EnumSet.copyOf(Arrays.asList(features));
    }

    public boolean hasFeature(PageFeature feature) {
       return features.contains(feature);
    }
 }

আমি এটি সম্পর্কে ভেবেছিলাম, তবে এখানে, বিকাশকারী সমস্ত প্রশ্নের উত্তর দিতে বাধ্য হয় না "এটি কোনও উপাত্ত পৃষ্ঠা?", "এটির কি শপিংয়ের কার্ট আছে?" ইত্যাদি যখন তাদের প্রচুর পরিমাণ থাকে তখন আপনি সহজেই একটিটি ভুলে যান।
জোফ্রে

5
@ জোফ্রে আপনি যখন এটি সম্পর্কে চিন্তা করেন, দশটি বুলিয়ান থাকার কারণে তারা কোনও উত্তর দিতে বাধ্য করেন না, কমপক্ষে কোনও উত্তর তারা ভাবেন না। সর্বাধিক সম্ভবত পরিস্থিতিটি হ'ল তারা কেবল অন্য পৃষ্ঠার সংজ্ঞাটি অনুলিপি করবেন বা আইডিইকে সমস্ত পরামিতি পূরণ করতে দিন false, তারপরে একটি বা দুটি সংশোধন করুন (সম্ভবত ভুলটি, কারণ এটি ট্র্যাক রাখা এত কঠিন)। মূ .় থেকে কোনও নিখুঁত সুরক্ষা নেই, এবং একটি পয়েন্ট আসে যেখানে আপনাকে অবশ্যই আপনার বিকাশকারীকে সঠিক কাজ করতে বিশ্বাস করতে হবে।
বিজিকলপ

ঠিক আছে, আমি এটি সম্পর্কে এইভাবে ভাবিনি :) এবং আমি মনে করি না যে বুলিয়ান প্রদত্ত ছোট অতিরিক্ত "বোকা-প্রমাণ" উপযুক্ততার ক্ষেত্রে ক্ষয়-মূল্যহীন, সুতরাং আমি সম্ভবত ভারারগ সমাধানটি নিয়ে যাব। আপনার অন্তর্দৃষ্টি জন্য ধন্যবাদ!
জোফ্রে

1
ভাল সমাধান, upvated। যদিও আমার যে অংশটি 6502 এ কোড করা হয়েছে সেগুলি বিটগুলিতে ক্র্যাম করতে চায়। :-)
user949300

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