আমি বর্তমানে একটি ওয়েবঅ্যাপে কাজ করছি যেখানে আমাদের প্রায়শই সেই পৃষ্ঠার উপর ভিত্তি করে কিছু সার্ভার যুক্তি শর্ত করা দরকার যা ব্যবহারকারীর কাছে ফেরত যেতে চলেছে।
প্রতিটি পৃষ্ঠায় একটি 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 টি বুলিয়ান থাকতে পারে যা নির্মাতাকে সত্যই বড় করে তোলে এবং আপনি কোনও পৃষ্ঠা যুক্ত করার সাথে সাথে ডিকোলেশনটি পেতে খুব কঠিন হতে পারে। কারও কি এর চেয়ে ভাল সমাধান আছে?