9

हमारे परीक्षण डाटा बनाने के लिए, हम बिल्डर पैटर्न के निम्नलिखित भिन्नता का उपयोग (सरलीकृत उदाहरण!):किसी अन्य वर्ग के आधार पर कोड कैसे उत्पन्न करें?

नमूना वर्ग:

public class Person 
{ 
    public string Name { get; set; } 
    public string Country { get; set; } 
} 

बिल्डर:

public class PersonBuilder 
{ 
    private string name; 
    private string country; 

    public PersonBuilder() 
    { 
     SetDefaultValues(); 
    } 

    private void SetDefaultValues() 
    { 
     name = "TODO"; 
     country = "TODO"; 
    } 

    public Person Build() 
    { 
     return new Person 
        { 
         Name = name, 
         Country = country 
        }; 
    } 

    public PersonBuilder WithName(string name) 
    { 
     this.name = name;    
     return this; 
    } 

    public PersonBuilder WithCountry(string country) 
    { 
     this.country = country; 
     return this; 
    } 
} 

नोट: उदाहरण का संदर्भ स्वयं प्रासंगिक नहीं है। यहां महत्वपूर्ण बात यह है कि उदाहरण में, व्यक्ति बिल्डर जैसे बिल्डर वर्ग पूरी तरह से इकाई वर्ग (व्यक्ति) को देखकर और उसी पैटर्न को लागू करके उत्पन्न किया जा सकता है - नीचे देखें।

अब कल्पना करें कि व्यक्ति वर्ग में 2 के बजाय 15 गुण हैं। यह बिल्डर वर्ग को लागू करने के लिए कुछ बंदरगाह लेगा, जबकि सैद्धांतिक रूप से, यह व्यक्तिगत रूप से व्यक्ति वर्ग से उत्पन्न हो सकता है। हम बिल्डर वर्ग को जल्दी से स्थापित करने के लिए कोड जनरेशन का उपयोग कर सकते हैं, और आवश्यकता होने पर बाद में कस्टम कोड जोड़ सकते हैं।

कोड जनरेशन प्रक्रिया को संदर्भ (व्यक्ति वर्ग के नाम और गुण) के बारे में अवगत होना होगा, इसलिए सरल टेक्स्ट-आधारित कोड जनरेशन या रेगेक्स जादू यहां सही महसूस नहीं करता है। एक समाधान जो गतिशील है, टेक्स्ट-आधारित नहीं है और अंदरूनी दृश्य स्टूडियो से जल्दी से ट्रिगर किया जा सकता है।

मैं इस तरह के परिदृश्यों के लिए कोड जनरेशन करने का सबसे अच्छा तरीका ढूंढ रहा हूं। प्रतिबिंब? Codesmith? टी 4 टेम्पलेट्स? मैक्रोज़ के साथ Resharper लाइव टेम्पलेट्स?

मैं आगे देख रहा हूँ कुछ महान जवाब :)

उत्तर

2

टी -4 समाधान एक अच्छी तरह से दृश्य स्टूडियो एकीकृत विकल्प है देखने के लिए। वास्तव में कोड उत्पन्न करने के लिए आप टी 4 टेम्पलेट के अंदर प्रतिबिंब का उपयोग कर सकते हैं।

0

यदि यह केवल परीक्षण के लिए है, RhinoMocks की तरह एक मजाक ढांचे पर विचार करें:

internal class PersonBuilder 
{ 
    private MockRepository _mockRepository; 
    private IPerson _person; 

    public PersonBuilder() 
    { 
     _mockRepository = new MockRepository(); 
     _person = _mockRepository.Stub<IPerson>(); 
    } 

    public PersonBuilder WithName(string name) 
    { 
     _person.Name = name; 
     return this; 
    } 

    public PersonBuilder WithCountry(string Country) 
    { 
     _person.Country= Country; 
     return this; 
    } 

    public IPerson Build() 
    { 
     _mockRepository.ReplayAll(); 
     return _person; 
    } 

} 

इस तरह आप अपने बिल्डर अपनी जरूरत के साथ विकसित कर सकते हैं। इसके अलावा, आपको अपनी बिल्ड विधि बदलने की आवश्यकता नहीं है। बस "WithX" विधियों को जोड़ें।

+0

हम पहले से ही हमारे यूनिट परीक्षणों में बड़े पैमाने पर मॉकिंग का उपयोग करते हैं, लेकिन मैंने कभी इसके लिए मैक्स का उपयोग करने का विचार नहीं किया :)। मुझे लगता है कि यह इस विशेष समस्या को हल करने का एक शानदार तरीका होगा, लेकिन सामान्य प्रश्न नहीं, जिसमें केवल परीक्षणों की तुलना में व्यापक दायरा है। लेकिन वैसे भी इस जवाब के लिए बहुत बहुत धन्यवाद! –

2

हमने CodeSmith Generator 5.x में एक सुविधा जोड़ा जो आपको मौजूदा कोड से उत्पन्न करने की अनुमति देता है। कृपया documentation here पर एक नज़र डालें। इसके अलावा आप कोडस्मिथ जेनरेटर टेम्पलेट में प्रतिबिंब या किसी भी .NET लाइब्रेरी का उपयोग कर सकते हैं।

धन्यवाद -Blake Niemyjski

0

ABSE मॉडलिंग दृष्टिकोण और उसके आईडीई, AtomWeaver में एक नज़र डालें। एबीएसई एक टेम्पलेट-आधारित मॉडलिंग और कोड जनरेशन फ्रेमवर्क है, जहां एक मॉडल (यूएमएल या एमडीए के साथ कुछ लेना देना नहीं है) "बिल्डिंग ब्लॉक" (परमाणु) लागू करके बनाया गया है। ये परमाणु टेम्पलेट/प्रोग्राम हाइब्रिड हैं और संदर्भ-जागरूक हैं: एक एटम पेड़ पर और कुछ परमाणुओं की उपस्थिति/अनुपस्थिति के आधार पर कोड उत्पन्न कर सकता है।

मॉडल होस्ट (इस मामले में AtomWeaver) वांछित स्रोत कोड प्राप्त करने के लिए मॉडल को "निष्पादित" करेगा। मॉडल "स्रोत" हो सकता है: मॉडल को बदलें और जितनी बार आवश्यक हो उतनी बार पुन: उत्पन्न करें।

एटमवेवर विजुअल स्टूडियो में एकीकृत नहीं है, लेकिन बिना किसी समस्या के इसके साथ काम कर सकता है।

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