मैं वर्तमान में एक वेबएप पर काम कर रहा हूं, जहां हमें अक्सर उस पेज के आधार पर कुछ सर्वर लॉजिक को कंडीशन करने की आवश्यकता होती है जो उपयोगकर्ता को वापस करने जा रहे हैं।
प्रत्येक पृष्ठ को 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..
}
और अक्सर कोड में हम कोड को इस तरह से देखते हैं ( प्रथम रूप ):
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
उन पृष्ठों की सूची का उपयोग करके आंशिक रूप से सरल किए गए हैं जो विभिन्न वर्गों में विभिन्न लोगों द्वारा घोषित किए गए हैं। यह कोड जैसा दिखता है ( दूसरा रूप ):
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
}
तब सशर्त कोड अब इस तरह दिखता है ( तीसरा रूप ):
if (destinationPage.hasShoppingCart()) {
// add some shopping-cart-related data to the response
}
if (destinationPage.isAvailabilityPage()) {
// add some info related to flight availability
}
जो बहुत पठनीय है। इसके अलावा, अगर किसी को एक पृष्ठ जोड़ने की जरूरत है, तो उसे प्रत्येक बूलियन के बारे में सोचने के लिए मजबूर किया जाता है और क्या यह उसके नए पृष्ठ के लिए सही या गलत है।
नई समस्या
एक समस्या जो मैं देख रहा हूं वह यह है कि इस तरह के 10 बूलियन हो सकते हैं, जो निर्माणकर्ता को वास्तव में बड़ा बनाता है और जब आप एक पृष्ठ जोड़ते हैं तो घोषणा को प्राप्त करना कठिन हो सकता है। क्या किसी के पास बेहतर उपाय है?