मान लीजिए, उदाहरण के लिए, आपके पास एक व्यापक रूप से साझा वर्ग के साथ एक एप्लिकेशन है जिसे कॉल किया जाता है User। यह वर्ग उपयोगकर्ता के बारे में सभी जानकारी, उनकी आईडी, नाम, प्रत्येक मॉड्यूल तक पहुंच के स्तर, टाइमज़ोन आदि को उजागर करता है।
उपयोगकर्ता डेटा को स्पष्ट रूप से पूरे सिस्टम में व्यापक रूप से संदर्भित किया जाता है, लेकिन जो भी कारण के लिए, सिस्टम को सेट किया जाता है ताकि इस उपयोगकर्ता ऑब्जेक्ट को कक्षाओं में पारित करने के बजाय जो इस पर निर्भर हो, हम सिर्फ इसमें से व्यक्तिगत गुणों में गुजर रहे हैं।
एक वर्ग जिसे उपयोगकर्ता आईडी की आवश्यकता होती है, बस userIdएक पैरामीटर के रूप में GUID की आवश्यकता होगी , कभी-कभी हमें उपयोगकर्ता नाम की भी आवश्यकता हो सकती है, ताकि एक अलग पैरामीटर के रूप में पारित हो। कुछ मामलों में, इसे व्यक्तिगत तरीकों से पारित किया जाता है, इसलिए मानों को कक्षा स्तर पर बिल्कुल भी आयोजित नहीं किया जाता है।
हर बार जब मुझे उपयोगकर्ता वर्ग से जानकारी के एक अलग टुकड़े तक पहुंच की आवश्यकता होती है, तो मुझे मापदंडों को जोड़कर परिवर्तन करना होगा और जहां एक नया अधिभार जोड़ना उचित नहीं है, मुझे हर संदर्भ को विधि या वर्ग निर्माता के साथ भी बदलना होगा।
उपयोगकर्ता सिर्फ एक उदाहरण है। यह हमारे कोड में व्यापक रूप से प्रचलित है।
क्या मैं यह सोचने में सही हूं कि यह ओपन / बंद सिद्धांत का उल्लंघन है? न केवल मौजूदा कक्षाओं को बदलने का कार्य, बल्कि उन्हें पहले स्थान पर स्थापित करना ताकि भविष्य में व्यापक परिवर्तन की आवश्यकता हो?
यदि हम अभी Userऑब्जेक्ट में पास हुए हैं , तो मैं जिस वर्ग के साथ काम कर रहा हूं, उसमें थोड़ा बदलाव कर सकता हूं। अगर मुझे कोई पैरामीटर जोड़ना है, तो मुझे कक्षा के संदर्भ में दर्जनों बदलाव करने पड़ सकते हैं।
क्या इस प्रथा से कोई अन्य सिद्धांत टूट गए हैं? निर्भरता शायद? हालांकि हम एक अमूर्त का संदर्भ नहीं दे रहे हैं, केवल एक प्रकार का उपयोगकर्ता है, इसलिए उपयोगकर्ता इंटरफ़ेस के लिए कोई वास्तविक आवश्यकता नहीं है।
क्या अन्य, गैर-ठोस सिद्धांतों का उल्लंघन किया जा रहा है, जैसे कि बुनियादी रक्षात्मक प्रोग्रामिंग सिद्धांत?
क्या मेरे निर्माता को इस तरह दिखना चाहिए:
MyConstructor(GUID userid, String username)
या यह:
MyConstructor(User theUser)
इसे पोस्ट किया:
यह सुझाव दिया गया है कि इस प्रश्न का उत्तर "पास आईडी या वस्तु?" में दिया गया है। यह इस सवाल का जवाब नहीं देता है कि किसी भी तरह से जाने का निर्णय SOLID सिद्धांतों का पालन करने की कोशिश को प्रभावित करता है, जो इस सवाल के मूल में है।
Iमें SOLID? MyConstructorमूल रूप से अब कहते हैं "मुझे एक Guidऔर एक की आवश्यकता है string"। तो क्यों नहीं एक इंटरफ़ेस प्रदान कर रहा है एक Guidऔर एक string, Userउस इंटरफ़ेस को लागू करने और MyConstructorउस इंटरफ़ेस को लागू करने वाले उदाहरण पर निर्भर करते हैं? और यदि MyConstructorपरिवर्तन की आवश्यकता है , तो इंटरफ़ेस को बदलें। - इसने मुझे प्रदाता के बजाय उपभोक्ता से "संबंधित" होने के लिए इंटरफेस के बारे में सोचने में बहुत मदद की । इसलिए सोचें कि "एक उपभोक्ता के रूप में मुझे कुछ ऐसा चाहिए जो ऐसा करता है और" इसके बजाय "एक प्रदाता के रूप में मैं यह और वह कर सकता हूं"।