मैं अक्सर इस समस्या में चलता हूं, खासकर जावा में, भले ही मुझे लगता है कि यह एक सामान्य ओओपी मुद्दा है। वह यह है: एक अपवाद बढ़ाने से एक डिजाइन समस्या का पता चलता है।
मान लीजिए कि मेरे पास एक वर्ग है जिसमें एक String name
क्षेत्र और एक String surname
क्षेत्र है।
फिर यह उन क्षेत्रों का उपयोग किसी व्यक्ति का पूरा नाम लिखने के लिए करता है ताकि उसे किसी प्रकार के दस्तावेज पर प्रदर्शित किया जा सके।
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
अब मैं एक त्रुटि को फेंककर अपनी कक्षा के व्यवहार को मजबूत करना चाहता हूं यदि displayCompleteNameOnInvoice
नाम निर्दिष्ट किए जाने से पहले बुलाया जाता है। यह एक अच्छा विचार है, है ना?
मैं getCompleteName
पद्धति में एक अपवाद बढ़ाने वाला कोड जोड़ सकता हूं । लेकिन इस तरह मैं कक्षा उपयोगकर्ता के साथ एक 'निहित' अनुबंध का उल्लंघन कर रहा हूं; यदि उनके मान सेट नहीं हैं, तो सामान्य गेटर्स अपवादों को फेंकना नहीं चाहते हैं। ठीक है, यह एक मानक गेट्टर नहीं है क्योंकि यह एक भी क्षेत्र नहीं लौटाता है, लेकिन उपयोगकर्ता के दृष्टिकोण से इसके बारे में सोचने के लिए भेद बहुत सूक्ष्म हो सकता है।
या मैं अंदर से अपवाद फेंक सकते हैं displayCompleteNameOnInvoice
। लेकिन ऐसा करने के लिए मुझे सीधे name
या surname
खेतों का परीक्षण करना चाहिए और ऐसा करने से मैं प्रतिनिधित्व की गई अमूर्तता का उल्लंघन करूंगा getCompleteName
। पूरा नाम जाँचने और बनाने के लिए यह विधि जिम्मेदारी है। यह अन्य आंकड़ों पर निर्णय को आधार बनाते हुए भी तय कर सकता है कि कुछ मामलों में यह पर्याप्त है surname
।
इसलिए एकमात्र संभावना यह है कि विधि के शब्दार्थ को बदल दिया getCompleteName
जाए composeCompleteName
, जो एक अधिक 'सक्रिय' व्यवहार का सुझाव देता है और, इसके साथ, एक अपवाद को फेंकने की क्षमता।
क्या यह बेहतर डिजाइन समाधान है? मैं हमेशा सादगी और शुद्धता के बीच सर्वश्रेष्ठ संतुलन की तलाश में हूं। क्या इस मुद्दे के लिए एक डिज़ाइन संदर्भ है?
displayCompleteNameOnInvoice
यदि getCompleteName
रिटर्न देता है तो क्या वह अपवाद छोड़ null
सकता है?