सिद्धांत बताओ मत पूछो कहते हैं:
आपको वस्तुओं को यह बताने का प्रयास करना चाहिए कि आप उन्हें क्या करना चाहते हैं; उनसे उनके राज्य के बारे में सवाल न पूछें, निर्णय लें और फिर उन्हें बताएं कि क्या करना है।
समस्या यह है कि, कॉल करने वाले के रूप में, आपको उस ऑब्जेक्ट की स्थिति के आधार पर निर्णय नहीं लेना चाहिए, जिसके परिणामस्वरूप आप तब वस्तु की स्थिति को बदलते हैं। आप जिस तर्क को लागू कर रहे हैं, वह संभवतः आपके लिए नहीं बल्कि ऑब्जेक्ट की ज़िम्मेदारी है। आपके लिए वस्तु के बाहर निर्णय लेना इसके अतिक्रमण का उल्लंघन करता है।
"बताओ, मत पूछो" का एक सरल उदाहरण है
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
और बताओ संस्करण है ...
Widget w = ...;
w.removeFromParent();
लेकिन क्या होगा अगर मुझे रिमूवफ्रेमप्रेंट विधि से परिणाम जानने की आवश्यकता है? मेरी पहली प्रतिक्रिया सिर्फ हटाने के लिए थी कि अगर माता-पिता को हटा दिया गया था या नहीं तो एक बूलियन को वापस करने के लिए फ़ॉरप्रोमेंट को बदल दें।
लेकिन फिर मुझे कमांड क्वेरी सेपरेशन पैटर्न मिला, जो कहता है कि ऐसा नहीं करना चाहिए।
यह बताता है कि हर विधि या तो एक कमांड होनी चाहिए जो एक क्रिया करती है, या एक क्वेरी जो कॉल करने वाले को डेटा लौटाती है, लेकिन दोनों नहीं। दूसरे शब्दों में, प्रश्न पूछने से उत्तर नहीं बदलना चाहिए। अधिक औपचारिक रूप से, विधियों को केवल तभी मूल्य वापस करना चाहिए जब वे संदर्भात्मक रूप से पारदर्शी हों और इसलिए कोई साइड इफेक्ट न हो।
क्या ये दोनों वास्तव में एक-दूसरे के साथ हैं और मैं दोनों के बीच कैसे चयन करूं? क्या मैं इस पर व्यावहारिक प्रोग्रामर या बर्ट्रेंड मेयर के साथ जाता हूं?