आइए विकल्पों को देखें, जहां हम सत्यापन कोड डाल सकते हैं:
- बिल्डर में बसे अंदर।
build()
विधि के अंदर ।
- निर्मित इकाई के अंदर: यह
build()
विधि में लागू किया जाएगा जब इकाई बनाई जा रही है।
विकल्प 1 हमें पहले समस्याओं का पता लगाने की अनुमति देता है, लेकिन जटिल मामले हो सकते हैं जब हम इनपुट को केवल पूर्ण संदर्भ में मान्य कर सकते हैं, इस प्रकार, build()
विधि में सत्यापन का कम से कम हिस्सा कर सकते हैं । इस प्रकार, विकल्प 1 चुनने से एक जगह और दूसरे भाग में किए जा रहे सत्यापन के हिस्से के साथ असंगत कोड हो जाएगा।
विकल्प 2 विकल्प 1 से काफी बदतर नहीं है, क्योंकि, आमतौर पर, बिल्डर में बसने से पहले build()
, विशेष रूप से, धाराप्रवाह इंटरफेस में, आह्वान किया जाता है। इस प्रकार, अभी भी ज्यादातर मामलों में जल्दी समस्या का पता लगाना संभव है। हालाँकि, यदि बिल्डर ऑब्जेक्ट बनाने का एकमात्र तरीका नहीं है, तो यह सत्यापन कोड के दोहराव की ओर ले जाएगा, क्योंकि आपको हर जगह जहाँ आप एक ऑब्जेक्ट बनाते हैं, वहाँ इसकी आवश्यकता होगी। इस मामले में सबसे तार्किक समाधान संभव के रूप में बनाई गई वस्तु के करीब के रूप में सत्यापन करना होगा, अर्थात, इसके अंदर। और यह विकल्प 3 है ।
ठोस दृष्टिकोण से, बिल्डर में सत्यापन डालने से भी एसआरपी का उल्लंघन होता है: बिल्डर वर्ग के पास ऑब्जेक्ट बनाने के लिए डेटा एकत्र करने की जिम्मेदारी पहले से ही होती है। सत्यापन अपने स्वयं के आंतरिक स्थिति पर अनुबंध स्थापित कर रहा है, किसी अन्य वस्तु की स्थिति की जांच करना एक नई जिम्मेदारी है।
इस प्रकार, मेरे दृष्टिकोण से, न केवल डिजाइन के दृष्टिकोण से देर से विफल होना बेहतर है, बल्कि निर्माणकर्ता के अंदर ही नहीं बल्कि बिल्डर में भी असफल होना बेहतर है।
UPD: इस टिप्पणी ने मुझे एक और संभावना की याद दिला दी, जब बिल्डर के अंदर सत्यापन (विकल्प 1 या 2) समझ में आता है। इसका कोई मतलब नहीं है कि बिल्डर के पास अपने द्वारा बनाए गए ऑब्जेक्ट पर अपने अनुबंध हैं। उदाहरण के लिए, मान लें कि हमारे पास एक बिल्डर है जो विशिष्ट सामग्री के साथ एक स्ट्रिंग का निर्माण करता है, कहते हैं, संख्या सीमाओं की सूची 1-2,3-4,5-6
। इस बिल्डर की तरह एक विधि हो सकती है addRange(int min, int max)
। परिणामी स्ट्रिंग को इन नंबरों के बारे में कुछ भी नहीं पता है, न ही इसे जानना चाहिए। बिल्डर स्वयं स्ट्रिंग के प्रारूप को परिभाषित करता है और संख्याओं पर दबाव बनाता है। इस प्रकार, विधि addRange(int,int)
को इनपुट संख्याओं को मान्य करना होगा और अधिकतम से कम न्यूनतम होने पर अपवाद को फेंकना होगा।
उस ने कहा, सामान्य नियम केवल बिल्डर द्वारा परिभाषित अनुबंधों को मान्य करना होगा।