2009-05-25 11 views
35

मैं डीडीडी + टीडीडी वर्ल्ड में नौसिखिया हूं। लेकिन मैं लगभग 9 वर्षों तक प्रोग्रामिंग में रहा हूं।दृढ़ता अज्ञानता के क्या फायदे हैं?

क्या कोई मुझे लगातार निरंतरता के लाभों की व्याख्या कर सकता है? विशिष्ट nHibernate एप्लिकेशन बस फ़ाइलों को मैप करने के लिए कक्षा और डेटाबेस के बीच निर्भरता को धक्का देता है।

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

अंत में मैपिंग फ़ाइलों का परीक्षण कैसे कर सकता हूं? मैपिंग फाइलों से संभावनाएं बग दिखाई देगी, मैं उनका परीक्षण कैसे कर सकता हूं?

+0

मैंने अपने उत्तर में परीक्षण के बारे में एक अनुभाग जोड़ा। –

+0

मैं [आर्किटेक्चर: द लॉस्ट इयर्स] (http://www.confreaks.com/videos/759-rubymidwest2011-keynote-architecture-the-lost-years) सुनने के बाद रिपोजिटरी पैटर्न से प्यार में पड़ गया। प्रत्येक गंभीर ऐप को रिपोजिटरी पैटर्न को नियोजित करना चाहिए। – Mario

उत्तर

46

मुझे इसे एक उदाहरण के साथ समझाएं। आइए मान लें कि आप क्लासिकल एसक्यूएल दृष्टिकोण का उपयोग कर एक एप्लीकेशन को कार्यान्वित कर रहे हैं। आप रिकॉर्ड खोलते हैं, डेटा बदलते हैं और इसे प्रतिबद्ध करते हैं।

छद्म कोड:

trx = connection.CreateTransaction(); 
query = connection.CreateQuery("Select * from Employee where id = empid"); 
resultset = query.Run(); 
resultset.SetValue("Address_Street", "Bahnhofstrasse"); 
resultset.SetValue("Address_City", "Zürich"); 
trx.Commit(); 

NHibernate के साथ यह कुछ इस तरह दिखेगा:

emp = session.Get<Employee>(empid); 

// persistence ignorant 'logic' 
emp.Address.Street = "Bahnhofstrasse"; 
emp.Address.City = "Zürich"; 

session.Commit(); 

हठ अज्ञान का अर्थ है कि व्यापार तर्क ही दृढ़ता के बारे में पता नहीं है। या दूसरे शब्दों में, दृढ़ता तर्क से अलग होती है। यह इसे और अधिक पुन: प्रयोज्य बनाता है।

ले जाएँ 'तर्क' एक पुन: प्रयोज्य विधि करने के लिए:

void MoveToZuerichBahnhofstrasse(Employee emp) 
{ 
    // doesn't have anything to do with persistence 
    emp.Address.Street = "Bahnhofstrasse"; 
    emp.Address.City = "Zürich"; 
} 

कोशिश ऐसी पद्धति resultsets का उपयोग कर लिखने के लिए और आप जानते हैं कि हठ अज्ञान है।

Employee emp = new Employee(); 
MovingService.MoveToZuerichBahnhofstreasse(emp); 
Assert.AreEqual("Bahnhofstrasse", emp.Address.Street); 
Assert.AreEqual("Zürich", emp.Address.City); 

DDD कुछ अलग है:

अपने आश्वस्त नहीं कर रहे हैं, क्योंकि वहाँ से संबंधित सामान की हठ किसी भी निर्भरता नहीं हैं देखते हैं कि कैसे सरल एक इकाई परीक्षण किया जाएगा। वहां आप अपना डोमेन मॉडल पहले (क्लास मॉडल) बनाते हैं और इसके अनुसार डेटाबेस डिज़ाइन बनाते हैं। एनएच के साथ यह बहुत आसान है, क्योंकि - दृढ़ता अज्ञानता के लिए धन्यवाद - आप एक (निश्चित) डेटाबेस मॉडल होने से पहले मॉडल और तर्क का परीक्षण और इकाई परीक्षण कर सकते हैं।


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

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

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

+1

धन्यवाद आपके महान उत्तर के लिए Stefan। – cbrcoder

+0

क्या कुछ दृढ़ता-अज्ञान पुस्तक या संसाधन सीखने के लिए है? –

2

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

मैंने हाल ही में एनएचबर्ननेट का उपयोग करना शुरू किया, इसलिए - इसके बारे में अधिक जानकारी प्रदान नहीं कर सकता। लेकिन मुझे एक टिप मिली जो आपके लिए उपयोगी हो सकती है - अगर आपने पहले से ऐसा नहीं किया है तो Fluent NHibernate आज़माएं।

+0

धन्यवाद अरनिस, मैं पीआई = एन हाइबरनेट नहीं कह रहा हूं। मैं बस इसे एक उदाहरण के रूप में उपयोग कर रहा हूँ। Fluent Nhibernate अच्छा है, मैं इसे देख लूंगा। लेकिन सवाल यह है कि क्या nHibernate का उपयोग करने के कोई वास्तविक लाभ हैं तो विशेष रूप से यदि मैं डेटाबेस के रूप में SQL सर्वर के लिए प्रतिबद्ध हूं? – cbrcoder

+0

मुझे यह पसंद है कि NHibernate दृढ़ता प्रदान करने के लिए काफी साफ तरीका प्रदान करता है (कम से कम - अब तक)। लेकिन सबसे अधिक, मुझे यह पसंद है कि यह सीधे मेरे पीओसीओ (http://en.wikipedia.org/wiki/POCO) पर डेटा (लगभग) मानचित्र करता है। मेरा मानना ​​है कि यह डीडीडी सर्वश्रेष्ठ फिट बैठता है। –

6

मैंने हमेशा डोमेन की अवधि में सोचा है और जब मैंने अतीत में संग्रहित प्रक्रियाओं, ADO.NET का उपयोग किया है, तो यह केवल तभी हुआ जब मैं अंततः एनएचबर्ननेट में गया कि मैं अपनी दृढ़ता तंत्र से संतुष्ट हूं।

डोमेन संचालित डिजाइन (डीडीडी) डोमेन मॉडल पर जोर से जोर देता है। इसका मतलब है कि मुख्य फोकस एक वैचारिक मॉडल बना रहा है जो उपयोगकर्ताओं और प्रोग्रामर दोनों के लिए एक आम भाषा बनाता है। उपयोगकर्ताओं को लगभग कभी भी दिलचस्पी नहीं है कि आप उनकी जानकारी को कैसे बनाए रखते हैं। NHibernate आपको इस मानसिकता को एक चिंता बनाकर प्राप्त करने में मदद करता है जो व्यापार नियमों को पकड़ने और समझने के लिए माध्यमिक है कि उपयोगकर्ता वास्तव में सिस्टम से क्या चाहता है।

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

अपने मैपिंग का परीक्षण करने के संबंध में, आप परीक्षण लिखेंगे (या आपको होना चाहिए) इससे कोई फर्क नहीं पड़ता कि आप दृढ़ता को लागू करने के लिए किस विधि का उपयोग करते हैं। यह अतिरिक्त काम नहीं है जो केवल इसलिए दिखाई देता है क्योंकि आप NHibernate का उपयोग कर रहे हैं। बस अपने मैपिंग का परीक्षण करने के बारे में सोचें कि आपका दृढ़ता सही तरीके से काम करता है।

इस Fluent NHibernate के लिए फिर से अमूल्य है। यह Persistence Specification Testing है जो ज्यादातर मामलों के लिए उपयोग करना वास्तव में आसान है।

+0

अरे तुम ... तुमने मुझे निश्चित रूप से हराया। : डी –

+0

DI का उपयोग करते समय मैपिंग फ़ाइलों का परीक्षण कैसे कर सकता हूं? एक नकली कोड और डेटाबेस के बीच वास्तविक मैपिंग कभी भी गारंटी नहीं दे सकता है? मेरे लिए एकमात्र विकल्प मैपिंग के बिना परीक्षणों में वास्तविक दृढ़ता का उपयोग करना है? – cbrcoder

+0

FluentNHibernate NHibernate का आधिकारिक हिस्सा नहीं है। वे इसे योगदान देने से इनकार करते हैं। एनएचबेर्नेट के अगले प्रमुख संस्करण (3.0) में अपनी प्रोग्रामेटिक मैपिंग कॉन्फ़िगरेशन की संभावना होगी। एफएनएच ऑटोमैपिंग के लिए –