मैं अभी पहले एक पैटर्न में आया हूं जो मैंने पहले देखा है, और इस पर राय प्राप्त करना चाहता था। सवाल में कोड इस तरह एक अंतरफलक शामिल है:गुप्त हैंडशेक एंटी-पैटर्न
public interface MyCrazyAnalyzer {
public void setOptions(AnalyzerOptions options);
public void setText(String text);
public void initialize();
public int getOccurances(String query);
}
और उम्मीद उपयोग इस तरह है:
MyCrazyAnalyzer crazy = AnalyzerFactory.getAnalyzer();
crazy.setOptions(true);
crazy.initialize();
Map<String, Integer> results = new HashMap<String, Integer>();
for(String item : items) {
crazy.setText(item);
results.put(item, crazy.getOccurances);
}
इस में से कुछ के लिए कारणों है। सेटटेक्स्ट (...) और getOccurances (...) वहां हैं क्योंकि डेटा पर एक ही महंगे विश्लेषण करने के बाद आप कई प्रश्न पूछ सकते हैं, लेकिन इसे परिणाम वर्ग में दोबारा किया जा सकता है।
मुझे क्यों लगता है कि यह इतना बुरा है: कार्यान्वयन राज्य को ऐसे तरीके से संग्रहीत कर रहा है जो इंटरफ़ेस द्वारा स्पष्ट रूप से इंगित नहीं किया गया है। मैंने कुछ ऐसा इंटरफ़ेस भी शामिल किया है जिसमें "readyResult" को कॉल करने की आवश्यकता है, फिर "getResult"। अब, मैं अच्छी तरह से डिज़ाइन किए गए कोड के बारे में सोच सकता हूं जो इनमें से कुछ सुविधाओं को नियोजित करता है। हैडोप मैपर इंटरफेस जॉब कॉन्फिगर करने योग्य और बंद करने योग्य है, लेकिन मुझे एक बड़ा अंतर दिखाई देता है क्योंकि यह एक ढांचा है जो उन इंटरफेस को लागू करने वाले उपयोगकर्ता कोड का उपयोग करता है, एक ऐसी सेवा बनाम जिसमें कई कार्यान्वयन हो सकते हैं। मुझे लगता है कि एक "करीबी" विधि को शामिल करने से संबंधित कुछ भी उचित है, क्योंकि इसे करने का कोई अन्य उचित तरीका नहीं है। कुछ मामलों में, जेडीबीसी की तरह, यह एक रिसाव अमूर्तता का एक परिणाम है, लेकिन कोड के दो टुकड़ों में मैं सोच रहा हूं, यह स्पष्ट रूप से प्रोग्रामर का एक परिणाम है जो इसे साफ़ करने के लिए स्पेगेटी कोड कक्षा में एक इंटरफ़ेस जोड़ रहा है।
मेरे प्रश्न हैं:
- हर कोई इस बात से सहमत है कि यह एक खराब तरीके से तैयार इंटरफ़ेस है?
- क्या यह एक वर्णित विरोधी पैटर्न है?
- क्या इस प्रकार की शुरुआत कभी इंटरफ़ेस में होती है?
- क्या यह केवल मेरे लिए गलत लगता है क्योंकि मुझे कार्यात्मक शैली और अपरिवर्तनीयता के लिए प्राथमिकता है?
यदि यह पर्याप्त आम एक नाम के लायक है, मैं "गुप्त सहभागिता" एक अंतरफलक है कि बलों आप एक विशेष क्रम में विभिन्न तरीकों कॉल करने के लिए विरोधी पैटर्न का सुझाव जब इंटरफ़ेस स्वाभाविक स्टेटफुल नहीं है (जैसे संग्रह)।
ईमानदारी से कहूं तो यह "पैटर्न" ADO.NET में DataReaders को मुझे याद दिलाता है। इसका मतलब यह नहीं है कि यह एक अच्छा विचार है, लेकिन इसका उपयोग गंभीर एपीआई में भी किया जाता है। –
अच्छा विरोधी पैटर्न। अगर वस्तुओं को इस तरह शुरू किया जाना था तो हम इंटरफेस में कन्स्ट्रक्टर निर्दिष्ट करने में सक्षम होंगे। मुझे 'गुप्त हैंडशेक' शब्द भी पसंद है। – CurtainDog
कम से कम यह स्पष्ट रूप से खराब है, java.util.MessageFormat के विपरीत जो एकल विधि कॉल के दौरान अस्थायी आंतरिक स्थिति का उपयोग करता है। –