यह न केवल POLA के बारे में है, बल्कि बग के संभावित स्रोत के रूप में अमान्य स्थिति को रोकने के बारे में भी है।
आइए देखें कि बिना ठोस कार्यान्वयन प्रदान किए हम आपके उदाहरण के लिए कुछ बाधाएँ कैसे प्रदान कर सकते हैं:
पहला चरण: किसी फ़ाइल को खोलने से पहले उसे कुछ भी कहने की अनुमति न दें।
CreateDataFileInterface
+ OpenFile(filename : string) : DataFileInterface
DataFileInterface
+ SetHeaderString(header : string) : void
+ WriteDataLine(data : string) : void
+ SetTrailerString(trailer : string) : void
+ Close() : void
अब यह स्पष्ट CreateDataFileInterface.OpenFile
होना चाहिए कि एक DataFileInterface
उदाहरण को पुनः प्राप्त करने के लिए कहा जाना चाहिए , जहां वास्तविक डेटा लिखा जा सकता है।
दूसरा चरण: सुनिश्चित करें, हेडर और ट्रेलर हमेशा सेट होते हैं।
CreateDataFileInterface
+ OpenFile(filename : string, header: string, trailer : string) : DataFileInterface
DataFileInterface
+ WriteDataLine(data : string) : void
+ Close() : void
अब आपको a DataFileInterface
: फ़ाइल नाम, हेडर और ट्रेलर प्राप्त करने के लिए सभी आवश्यक मापदंडों को पूरा करना होगा । यदि ट्रेलर स्ट्रिंग सभी पंक्तियों के लिखे जाने तक उपलब्ध नहीं है, तो आप इस पैरामीटर को Close()
(संभवतः विधि का नाम बदलकर WriteTrailerAndClose()
) भी स्थानांतरित कर सकते हैं, ताकि कम से कम फ़ाइल ट्रेलर स्ट्रिंग के बिना समाप्त न हो सके।
टिप्पणी का जवाब देने के लिए:
मुझे इंटरफ़ेस को अलग करना पसंद है। लेकिन मुझे लगता है कि आपका सुझाव प्रवर्तन के बारे में है (उदाहरण के लिए WriteTrailerAndClose ()) SRP के उल्लंघन पर फैसला कर रहा है। (यह एक ऐसी चीज है जिसे मैंने कई अवसरों पर संघर्ष किया है, लेकिन आपका सुझाव एक संभावित उदाहरण है।) आप कैसे प्रतिक्रिया देंगे?
सच। मैं अपनी बात मनवाने के लिए उदाहरण पर अधिक ध्यान केंद्रित नहीं करना चाहता था, लेकिन यह एक अच्छा सवाल है। इस मामले में मुझे लगता है कि मैं इसे कॉल करूंगा Finalize(trailer)
और तर्क दूंगा कि यह बहुत ज्यादा नहीं है। ट्रेलर लिखना और समापन केवल कार्यान्वयन विवरण हैं। लेकिन अगर आप असहमत हैं या एक समान स्थिति है जहां यह अलग है, तो यहां एक संभावित समाधान है:
CreateDataFileInterface
+ OpenFile(filename : string, header : string) : IncompleteDataFileInterface
IncompleteDataFileInterface
+ WriteDataLine(data : string) : void
+ FinalizeWithTrailer(trailer : string) : CompleteDataFileInterface
CompleteDataFileInterface
+ Close()
मैं वास्तव में इसे इस उदाहरण के लिए नहीं करूंगा, लेकिन यह दिखाता है कि तकनीक के माध्यम से कैसे आगे बढ़ें।
वैसे, मैंने यह माना कि इस क्रम में वास्तव में तरीकों को बुलाया जाना चाहिए, उदाहरण के लिए क्रमिक रूप से कई पंक्तियों को लिखना। यदि यह आवश्यक नहीं है, तो मैं हमेशा एक बिल्डर को पसंद करूंगा, जैसा कि बेन कॉट्रेल ने सुझाव दिया था ।