क्या किसी वस्तु का निर्माण निहित या स्पष्ट रूप से एक फ़ाइल बनाना चाहिए?


9

मैं एक ऐसी वस्तु बना रहा हूँ जिसका एकमात्र उद्देश्य एक प्रारूप की एक फ़ाइल में पढ़ना और एक अन्य प्रारूप बनाना है।

क्या ऑब्जेक्ट इनिशियलाइज़ेशन के दौरान आउटपुट फ़ाइल को स्पष्ट रूप से बनाना या एक सार्वजनिक विधि है जो उपयोगकर्ता को यह विकल्प देता है कि यह फ़ाइल कब बनाई जाएगी?

जवाबों:


12

यदि आप ऐसी भाषा में काम कर रहे हैं जो इसका समर्थन करती है, तो मैं एक सेव विधि प्रदान करता हूँ जो स्ट्रीम लेती है। इस तरह, उपयोगकर्ता जहां चाहे या जहां चाहे डेटा सहेज सकता है।

केवल एक फ़ाइल को सहेजने की तुलना में लिखने में 20 सेकंड अधिक समय लगता है, लेकिन यह एक प्रोग्रामर द्वारा आसानी से समझा जाता है, और कॉलिंग साइट पर यह बहुत स्पष्ट है कि वास्तव में क्या होता है।

जिस तरह से आपने इसे वर्णित किया (एक ऑब्जेक्ट जो इनपुट पढ़ता है, और दूसरी फ़ाइल को आउटपुट करता है) अन्यथा अजीब लगता है। एक वस्तु के निर्माण का उद्देश्य क्या है जो निर्माण के दौरान सब कुछ करता है?

क्या आप इसे इस तरह कहेंगे?

var stuff = DoStuff();
new SaveFileWeirdClass(stuff);
return;

SaveFileWeirdClass के किसी भी उचित कार्यान्वयन के लिए, मैं इसे बनाने से कोई दुष्प्रभाव नहीं होने की उम्मीद करूंगा। फ़ाइल पढ़ना - ठीक है। एक फ़ाइल बनाना? नहीं।

मेरे लिए यह इस तरह से स्पष्ट है:

var stuff = new StuffReader(); //Better name needed...
string filePath = this.whatever;

using(Stream stream = new FileStream(filePath))
    stuff.Save(stream);

1
यह अच्छा है। एक अन्य, समान, विकल्प सिर्फ एक वस्तु को लागू करना है जो आवेदन के आधार पर जो भी धारा है उसे लागू करता है और इसे किसी अन्य धारा के रूप में मानता है।
स्टीवन एवर्स

3

यदि आप इसे कक्षा में करने पर तुले हुए हैं, तो इसे आरंभीकरण के दौरान बनाएं। उस स्टेप को डिलीट करने से दो बुरे काम होते हैं: पहला, यह कॉलर के लिए एक अतिरिक्त, स्पष्ट कदम जोड़ता है, जिन्होंने पहली बार ऑब्जेक्ट तब तक नहीं बनाया होगा जब तक कि वे इसका इस्तेमाल आउटपुट का उत्पादन करने के लिए नहीं करते। दूसरा, यह कम से कम दो बिंदुओं को जोड़ता है जहां कक्षा में कोड के बारे में निर्णय लेना है कि फ़ाइल खुली है या नहीं और उस स्थिति को संभालें: एक बार जब आप आउटपुट लिखने के लिए जाते हैं और एक बार विनाश के दौरान जब आप इसे बंद करने जाते हैं। पूर्व का मतलब है कि आपको हर लिखने के दौरान उस चेक को बनाना होगा , जो कि बेकार हो सकता है यदि आप उनमें से बहुत कुछ कर रहे हैं।

व्यक्तिगत रूप से, मैं न तो करना चाहूंगा और न ही निर्माणकर्ता को कॉल-पूर्व पास फ़ाइल हैंडल को पास करने का विकल्प चुनूंगा। कक्षा के अंदर फ़ाइल बनाना, कॉल करने वालों को अनुमतियाँ सेट करने या डिवाइस पर लिखने पर, डिवाइस-विशिष्ट इनिशियलाइज़ेशन करने जैसे विकल्प देने का प्रस्ताव देता है। यदि आप अपनी FooConverterकक्षा का एक संस्करण रखना चाहते हैं, जो फाइलों पर काम करता है और सृजन का काम करता है, तो इसे एक में लपेटें FooFileConverter


2

स्पष्ट रूप से।

आप यह सुनिश्चित करना चाहते हैं कि आप चतुर साइड इफेक्ट नियमों पर भरोसा नहीं करते हैं जो या तो भविष्य के रिलीज में टूट सकते हैं या असामान्य आर्किटेक्चर पर। बेशक, आपके पास एक डिफ़ॉल्ट फ़ाइल होनी चाहिए जिसे उपयोगकर्ता अधिलेखित कर सकता है जिसे उन्हें चुनना चाहिए।


1

एक स्पष्ट विधि के लिए अन्य तर्कों के अलावा: यदि आप निर्माणकर्ता में काम करते हैं, तो आप अपनी कक्षा के प्रत्येक उपयोगकर्ता को केवल ऑब्जेक्ट बनाने के लिए अपवाद हैंडलिंग करने के लिए मजबूर करते हैं। इससे बहुत सारे बॉयलरप्लेट कोड हो सकते हैं।

उस चर्चा के लिए /programming/6086334/is-it-good-ults-to-make-the-constructor-throw-an-exception देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.