2010-01-18 10 views
6

कहें कि मैं कुछ फाइलों को कुछ फाइलों से निपटने के लिए चाहता हूं, और मैं 2 विकल्पों पर विचार कर रहा था।क्या मुझे फ़ंक्शंस की श्रेणी या फ़ंक्शंस का नामस्थान उपयोग करना चाहिए?

1) है कि एक उपयोगकर्ता इस तरह इस्तेमाल कर सकते हैं SavedDataHandler की तरह एक कक्षा बनाएं ....

// Note that SavedDataHandler has no members. It just has functions that operate on a 
// resource (the file) 
SavedDataHandler gameSave; 
gameSave.SaveData(arg1, arg2); // to save data 
gameSave.DeleteSave(); // Delete the save 
... 

2) कार्यों

namespace SavedDataHandler { 
    SaveData(...) { ... } 
    DeleteSave(...) { ... } 
    ... 
} 

है कि एक उपयोगकर्ता

की तरह कहेंगे की एक नाम स्थान बनाएं
SavedDataHandler::SaveData(arg1, arg 2); 
SavedDataHandler::DeleteSave(); 

क्या पसंद किया जाएगा?

पीएस मैंने इस बारे में सोचा जब मैं सदस्य कार्यों के लिए गैर-सदस्य गैर-मित्र कार्यों को प्राथमिकता देने के लिए स्कॉट मेयर की सिफारिश के बारे में सोच रहा था। मैंने उन निर्णयों में भाग लिया है जहां मेरे पास एक समारोह है (आमतौर पर कक्षा में सामान की मदद करने के लिए कुछ निजी सदस्य कार्य), जिसे आसानी से गैर-सदस्य में बनाया जा सकता है क्योंकि यह कक्षा के निजीकरण पर काम नहीं करता है।

हालांकि, समारोह केवल यह है कि एक वर्ग द्वारा किया जाता है। बेशक, कार्यक्रम उस बिंदु पर विकसित हो सकता है जहां किसी अन्य वर्ग की आवश्यकता हो सकती है, लेकिन मुझे इन गैर-सदस्य कार्यों के लिए जगह ढूंढना मुश्किल लगता है। यह आसान है जब आपके पास सामान्य उद्देश्य के साथ बहुत से कार्य होते हैं, लेकिन मुझे एक गैर-सदस्यीय कार्यों को एक विशिष्ट स्थान पर व्यवस्थित करने में कठिनाई होती है, और पाते हैं कि इसे सदस्य के रूप में छोड़कर चीजों को साफ रखा जाता है। इस मुद्दे के बारे में कोई सुझाव?

उत्तर

4

मैं निम्नलिखित सरल पैटर्न के लिए करते हैं:

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

लेकिन राय अलग-अलग हैं और अंत में आपके नियोक्ता की मार्गदर्शिकाएं अंतिम हैं।

संपादित करें:

... बेशक इसकी नहीं कि आसान है, लेकिन आप स्कॉट Meyers already covered विवरण उल्लेख किया।

संगठनात्मक समस्या के लिए के रूप में:
आप गुमनाम नामस्थान में सहायक कार्यों रखते हैं, वे पहले से ही ज्यादातर वर्ग से decoupled कर रहे हैं - अगर आप फिर बाद में उन्हें पुन: उपयोग करना चाहते हैं, यह भी उन्हें बाहर निकलने के लिए मुश्किल नहीं होना चाहिए एक आम नामस्थान में।
इस बिंदु पर आप भी संगठन है कि फिट बैठता है, जो कभी कभी पहले से कठिन हो सकता है पर एक बेहतर दृश्य होना चाहिए।

+0

मैं वही ह्यूरिस्टिक का उपयोग करता हूं :) –

+0

डीडीजे पर स्कॉट मेयर्स आलेख को जोड़ने के लिए धन्यवाद! – Pete

0

यह समझ में आता है कि कक्षा डेटा को सीधे सहेजने वाले वर्ग की सहेजने वाली विधि है, जो मीडिया को दर्शाती है कि डेटा को सहेजा जा रहा है, और मिटाने की विधि मीडिया क्लास पर ही है।

+0

स्कॉट मेयर के खिलाफ यह तर्क है। देखें http://www.ddj.com/cpp/184401197 –

1

मेरे व्यक्तिपरक जवाब है: एक वर्ग स्थिर तरीकों से युक्त पर एक नाम स्थान का उपयोग करें।

इसके लिए मेरा तर्क यह है कि घोषणा के आधार पर आप कोड के इस ब्लॉक के उद्देश्य को जान लेंगे।

यदि यह एक वर्ग है, तो उदाहरण विधियों से इसे रोकना कुछ भी नहीं है। यदि यह नामस्थान है, तो आप जानते हैं कि सभी कार्य निःशुल्क हैं।

सी # सीखते समय ये अवधारणाएं मेरे साथ घर पर आ गईं। सी # में आपके पास नि: शुल्क स्थायी कार्य नहीं हो सकते हैं।

internal static class SavedDataHandler 
{ 
    // Because this is a static class, the compiler will not let you create an instance method 

    internal static void ThisIsAStaticFunction() // This is fine 
    { 
    } 

    internal void ThisIsAnInstanceFunction() // Compiler error! 
    { 
    } 
} 

के रूप में सी ++ स्थिर कक्षाओं की अवधारणा नहीं है, नामस्थान होगा जाने का रास्ता: हालांकि, अगर आप स्थिर कक्षाओं हो सकता है।

0

यदि मुझे प्रश्न का उत्तर देना होगा, तो यह होगा: इससे कोई फर्क नहीं पड़ता। कोई कह सकता है कि कार्यों के नामस्थान और इस मामले में स्थैतिक कार्यों वाले वर्ग के बीच का अंतर सिर्फ वाक्य रचनात्मक है।

हालांकि, ऐसा लगता है कि आप "सहेजे गए गेम" ऑब्जेक्ट को मॉडल करने का प्रयास कर रहे हैं। क्या कोई कारण है कि इन कार्यों के साथ कोई राज्य नहीं है?

0

ऐसा लगता है कि यह प्रश्न प्रोग्राम के अन्य हिस्सों में कुछ अस्वास्थ्यकर डिज़ाइन से उत्पन्न होता है। मैं इन arg1 और arg2 चीजों के डिजाइन को देखता हूं जो आप हैंडलर को पास कर रहे हैं, वे संभवतः अमूर्त गायब हैं।

संबंधित मुद्दे