2008-08-27 8 views
11

मुझे सी ++ में स्थिर कार्यों का उपयोग करने के तरीके के रूप में वर्गीकृत करना पसंद है, जैसे सी # करता है।बहुत अधिक स्थिर या अच्छा उपयोग कर रहा है?

Console::WriteLine("hello") 

क्या यह अच्छा या बुरा है? यदि कार्यों का उपयोग अक्सर किया जाता है तो मुझे लगता है कि इससे कोई फर्क नहीं पड़ता, लेकिन यदि नहीं, तो वे स्मृति पर दबाव डालते हैं?

static const के बारे में क्या?

+0

क्या आप सिर्फ नामस्थान का उपयोग कर सकते हैं? –

उत्तर

24

(यह एक कारण कुछ वर्गों के बजाय नामस्थान उपयोग करने के लिए लोगों का तर्क है में से एक है।) लेकिन यह अच्छा है या बुरा

पहले विशेषण जो मन में आता "अनावश्यक" है। सी ++ में नि: शुल्क फ़ंक्शंस और नेमस्पेस हैं, तो आपको उन्हें कक्षा में स्थिर कार्य करने की आवश्यकता क्यों होगी?

सी # और जावा में uninstantiable कक्षाओं में स्थिर तरीकों का उपयोग एक समाधान है, क्योंकि उन भाषाओं मुक्त कार्यों की जरूरत नहीं है (जो है, कार्यों कि सीधे नाम स्थान में रहते हैं, के बजाय एक वर्ग का हिस्सा के रूप में) । सी ++ में वह दोष नहीं है। बस एक नामस्थान का उपयोग करें।

+0

मैं सहमत हूं। +1। "स्थैतिक" विधियों का उपयोग हो सकता है, लेकिन मैं एक प्रदान करने में असमर्थ हूं, या सभी पदों में से किसी एक को ढूंढने में असमर्थ हूं, जो पहले से ही नामस्थानों द्वारा कवर नहीं है। NAMESPACES जाओ। :-) – paercebal

10

मैं स्थिर फ़ंक्शंस का उपयोग करने के लिए सभी हूं। ये सिर्फ समझ में आता है जब मॉड्यूल में व्यवस्थित किया जाता है (static class सी # में)।

हालांकि, पल उन कार्यों को किसी प्रकार के बाहरी (गैर संकलन-समय कांस्ट) डेटा की आवश्यकता होती है, तो उस फ़ंक्शन को एक आवृत्ति विधि और कक्षा में अपने डेटा के साथ encapsulated किया जाना चाहिए।

संक्षेप में: स्थैतिक कार्य ठीक है, स्थिर डेटा खराब है।

1

फ्रैंक के साथ सहमत हैं, स्थिर (वैश्विक) कार्यों (निश्चित रूप से उन्हें व्यवस्थित करने के साथ) में कोई समस्या नहीं है .. समस्याएं केवल तब सोचने लगती हैं जब लोग सोचते हैं "ओह मैं इस पर दायरा बनाउंगा डेटा एक छोटे से व्यापक ".. फिसलन ढलान :)

परिप्रेक्ष्य में वास्तव में कहें .. Functional Programming की बिट;)

1

एक विशेष कारण स्थिर डेटा बुरा है, जो C++ का आरंभीकरण आदेश के बारे में कोई गारंटी नहीं देता है विभिन्न अनुवाद इकाइयों में स्थिर वस्तुओं। अभ्यास में यह समस्या पैदा कर सकता है जब एक वस्तु एक अलग अनुवाद इकाई में दूसरे पर निर्भर करती है। स्कॉट मेयर्स ने अपनी पुस्तक मोर इफेक्टिव सी ++ की मद 26 में इसकी चर्चा की।

1

मैं कक्षाएं बनाना चाहता हूं जिसमें स्थैतिक कार्य होते हैं, लेकिन कुछ कहते हैं कि ऐसा करने के लिए "सही तरीका" आमतौर पर नामस्थानों का उपयोग करना होता है। (मैंने सी ++ नामों से पहले अपनी आदतें विकसित की थीं।)

बीटीडब्लू, यदि आपके पास ऐसी कक्षा है जिसमें केवल स्थिर डेटा और फ़ंक्शंस हैं, तो आपको कन्स्ट्रक्टर को निजी होने की घोषणा करनी चाहिए, इसलिए कोई भी इसे तुरंत चालू करने का प्रयास नहीं करता है।

1

स्थिर कार्यों के साथ समस्या यह है कि वे एक ऐसे डिज़ाइन का कारण बन सकते हैं जो encapsulation को तोड़ देता है। उदाहरण के लिए, यदि आप स्वयं को कुछ लिखते हैं जैसे:

public class TotalManager 
{ 
    public double getTotal(Hamburger burger) 
    { 
     return burger.getPrice() + burget.getTax(); 
    } 
} 

... तो आपको अपने डिज़ाइन पर पुनर्विचार करना पड़ सकता है। स्टेटिक फ़ंक्शन अक्सर आपको सेटर्स और गेटर्स का उपयोग करने की आवश्यकता होती है जो कक्षा के एपीआई को अव्यवस्थित करते हैं और चीजों को सामान्य रूप से अधिक जटिल बनाते हैं।मेरे उदाहरण में, हैम्बर्गर के गेटर्स को हटाना बेहतर होगा और getTotal() क्लास को हैम्बर्गर में ही ले जाएं।

namespace Console { 
    void WriteLine(...) // ... 
} 

स्मृति के रूप में, काम करता है, एक समारोह के बाहर एक ही राशि का उपयोग एक स्थिर सदस्य समारोह के रूप में या एक नाम स्थान में:

2

उपयोग नामस्थान कार्यों का एक संग्रह बनाने के लिए। यही है: कोई स्मृति अन्य कोड नहीं है।

0

संगठन के लिए, पहले से बताए गए नामस्थानों का उपयोग करें।

वैश्विक डेटा के लिए मैं singleton पैटर्न का उपयोग करना चाहता हूं क्योंकि यह स्थिर वस्तुओं के अज्ञात प्रारंभिक क्रम की समस्या में मदद करता है। दूसरे शब्दों में, यदि आप ऑब्जेक्ट को सिंगलटन के रूप में उपयोग करते हैं तो इसका उपयोग होने पर प्रारंभ होने की गारंटी है।

यह भी सुनिश्चित करें कि आपके स्थिर कार्य स्टेटलेस हैं ताकि वे थ्रेड सुरक्षित हों।

0

मैं आमतौर पर केवल मित्र प्रणाली के संयोजन के साथ statics का उपयोग करता हूं।

उदाहरण के लिए, मेरे पास एक कक्षा है जो निजी डेटा पर संचालन सहित सामान की गणना करने के लिए बहुत से (इनलाइन) आंतरिक सहायक कार्यों का उपयोग करती है।

यह निश्चित रूप से कक्षा इंटरफेस के कार्यों की संख्या को बढ़ाता है। इससे छुटकारा पाने के लिए, मैं मूल कक्षाओं में एक सहायक वर्ग घोषित करता हूं। सीपीपी फ़ाइल (और इस प्रकार बाहरी दुनिया से अनदेखा), इसे मूल वर्ग का मित्र बनाते हैं, और फिर पुराने सहायक कार्यों को स्थैतिक (इनलाइन) में स्थानांतरित करते हैं। पुराने पैरामीटर के अलावा पुरानी कक्षा प्रति संदर्भ पारित करने वाले सहायक वर्ग के सदस्य कार्य।

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

3

जो लोग कहते हैं कि स्थिर कार्यों नामस्थान द्वारा बदला जा सकता है गलत कर रहे हैं, यहाँ एक सरल उदाहरण है:

class X 
{ 
    public: 
    static void f1() 
    { 
     ... 
     f2(); 
    } 

    private: 
    static void f2() {} 
}; 

जैसा कि आप देख सकते हैं, सार्वजनिक स्थैतिक फ़ंक्शन f1 एक और स्थिर कहता है, लेकिन निजी फ़ंक्शन f2

यह केवल कार्यों का संग्रह नहीं है, बल्कि अपने स्वयं के encapsulated तरीकों के साथ एक स्मार्ट संग्रह है। नामस्थान हमें यह कार्यक्षमता नहीं देंगे।

कई लोग "सिंगलटन" पैटर्न का उपयोग करते हैं, सिर्फ इसलिए कि यह एक आम प्रथा है, लेकिन कई मामलों में आपको कई स्थैतिक तरीकों और केवल एक स्थिर डेटा सदस्य के साथ कक्षा की आवश्यकता होती है। इस मामले में सिंगलटन की बिल्कुल आवश्यकता नहीं है। विधि instance() को कॉल करना भी स्थिर कार्यों/सदस्यों को सीधे एक्सेस करने से धीमा है।

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