2010-11-18 15 views
5

के शीर्ष पर कोई ऑब्जेक्ट बनाएं जो घोषणा/तत्काल बेहतर है और क्यों?कन्स्ट्रक्टर में या कक्षा

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow() 
    { 
     _test = new Test(); 
    } 
} 

या

public class MainWindow 
{ 
    private Test _test = new Test(); 

    public MainWindow() 
    { 

    } 
} 
+1

एक डुप्लिकेट का डुप्लिकेट .... देखें http://stackoverflow.com/questions/298183/c-member-variable-initialization-best-practice – Tony

उत्तर

2

अपने आप से यह प्रश्न पूछें: क्या होता है जब आप MainWindow पर अन्य रचनाकार जोड़ते हैं? क्या आप यह सुनिश्चित करने के लिए अन्य रचनाकारों को संदर्भित करना चाहते हैं कि _test सही ढंग से प्रारंभ किया गया है? या यह _test के लिए ठीक है, यदि कोई अन्य कन्स्ट्रक्टर उपयोग नहीं किया जाता है?

निजी तौर पर जब एक UI घटक बनाने मैं संभव के रूप में निर्माता से बाहर की विफलता के रूप में कई बिंदुओं के लिए कदम होगा, और मैं है कि या तो Loaded ईवेंट हैंडलर के लिए की तरह कुछ कदम होगा, या रखने के लिए यह रूप में आप विकल्प 2.

में किया था
0

बाद, क्योंकि घोषणा और प्रारंभ एक ही लाइन पर होते हैं ... आसान एक गलती करते हैं करने के लिए पढ़ने के लिए, कठिन।

2

मैं एक तीसरा विकल्प के लिए जाना चाहते हैं:

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow(Test test) 
    { 
     _test = test; 
    } 
} 

निर्भरता इंजेक्शन लगाने के द्वारा आप अपने कोड इकाई परीक्षण करने के लिए आसान बनाते हैं।

+0

ओपी के सदस्य चर के रूप में '_test' था कक्षा, जिसका अर्थ है कि इसे 'मेनविंडो' से अलग से टेस्ट करने योग्य नहीं होना चाहिए, इसके बजाय परीक्षण 'मेनविंडो' के उद्देश्य से होना चाहिए। IOW: IoC '_test' के लिए अनुचित है। – slugster

+0

इस तरह से आप इसे परीक्षण में नकल करने की अनुमति देता है। –

+0

@ स्लगस्टर: यह इस बात पर निर्भर करता है कि टेस्ट क्या करता है। अगर यह मेनविंडो को किसी प्रकार का डेटा प्रदान करता है तो इसे इंजेक्शन दिया जाना चाहिए। आपको पूर्वनिर्धारित (टेस्टेबल) परिणाम मिलता है यदि आप उस डेटा को अपने परीक्षण (स्टब/मॉक ऑब्जेक्ट के माध्यम से) – jgauffin

1

यह

int i; 
... 
i = 0; 

और

int i = 0; 

मेरे राय है कि प्रारंभ इसे का एक हिस्सा घोषणा के करीब यदि संभव हो तो, आदर्श मामले में होना चाहिए के बीच अंतर के समान है। पठनीयता में बोनस के अलावा आपको प्रारंभिकरण को भूलने के लिए छोटे अवसर मिलते हैं। तो दूसरा संस्करण एक बेहतर है।

2

ऑब्जेक्ट बनने पर क्या हो रहा है, यह विशेष रूप से जब आप सबक्लास लिखने के लिए जाते हैं तो इसे बनाने के लिए यह बेहतर है।

आम तौर पर यह स्वाद का विषय है और सबसे महत्वपूर्ण बात आपकी पसंद में होना चाहिए।

1

मुझे नहीं लगता कि आप कह सकते हैं कि एक घोषणा बेहतर है, तो यह आपके फॉर्म के तर्क के बारे में है, अगर आप फॉर्म स्टार्ट-अप पर टेस्ट शुरू नहीं करना चाहते हैं, लेकिन एक बटन पर क्लिक करें तो पहली घोषणा बेहतर है।

+0

+1: आलसी तात्कालिकता वास्तव में उपयोगी हो सकती है। – Tony

+0

यह सही है, अगर "नए टेस्ट()" में भारी मेमोरी उपयोग शामिल है, तो केवल एक बटन ईवेंट की तरह या केवल टेस्ट क्लास बनाने के लिए जरूरी होने पर कॉल करना बुद्धिमान है। –

0

दूसरा सबसे साफ इमो है। मैं आमतौर पर केवल कन्स्ट्रक्टर में ऑब्जेक्ट्स बनाते हैं जब उन्हें पैरामीटर के साथ प्रारंभ करने की आवश्यकता होती है।

कोई पैरामीटर

public class MainWindow 
{ 
    private Test _test = new Test(); 

    public MainWindow() 
    { 

    } 
} 

मानकों के साथ:

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow() 
    { 
     _test = new Test("abc") 
    } 
} 

रूप जैक्सन पोप ने कहा, यह आसान उपयोग शुरू करने के बनाने के लिए वस्तु के लिए एक निर्माता को जोड़ने के लिए एक अच्छा विचार हो सकता है डीआई बाद में। आप यहां DI/IoC के बारे में पढ़ सकते हैं: http://www.codeproject.com/KB/architecture/DependencyInjection.aspx

0

उदाहरण में आपने जो विकल्प दिया है, उनमें से कोई भी विकल्प बेहतर नहीं है। इन दोनों स्निपेट कक्षा के निर्माण के दौरान एक सदस्य परिवर्तनीय को तत्काल बनाते हैं। एकमात्र असली अंतर यह है कि, दूसरे मामले में, सदस्य को से पहले कन्स्ट्रक्टर निष्पादित किया गया है।

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

उदाहरण के लिए:

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow(int i) 
    { 
     _test = new Test(i); 
    } 
} 
0

यह बिल्कुल भी कोई फर्क नहीं करता, क्योंकि संकलक बिल्कुल ही आईएल उत्पन्न करता है। पठनीयता के मामले में यह सिर्फ व्यक्तिगत स्वाद का मामला है।

public class MainWindow 
{ 
    private readonly Test _test = new Test(); 

    public MainWindow() 
    { 

    } 
} 

यह विशेष रूप से पढ़ने के लिए और जब कक्षा एक से अधिक निर्माता है रेख करना आसान है: मैं बाद के संस्करण लेकिन readonly संशोधक के साथ पसंद करते हैं।

+0

दिए गए उदाहरण में यह सच है, लेकिन जब 'मेनविंडो' किसी अन्य वर्ग से लिया जाएगा, तो एक अंतर है: दूसरे मामले में 'टेस्ट' का निर्माण बेस निर्माता के नाम से किया जाएगा। – Vlad

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

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