मैं खुद को डीडीडी विशेषज्ञ नहीं मानता लेकिन, एक समाधान वास्तुकार के रूप में, जब भी संभव हो, सर्वोत्तम प्रथाओं को लागू करने का प्रयास करता हूं। मुझे पता है कि डीडीडी में नो (पब्लिक) सेटर "स्टाइल" के प्रो और कोन की बहुत चर्चा है और मैं दोनों पक्षों के तर्क देख सकता हूं। मेरी समस्या यह है कि मैं कौशल, ज्ञान और अनुभव में व्यापक विविधता के साथ एक टीम पर काम करता हूं जिसका अर्थ है कि मुझे भरोसा नहीं है कि हर डेवलपर चीजों को "सही" तरीके से करेगा। उदाहरण के लिए, यदि हमारी डोमेन ऑब्जेक्ट डिज़ाइन किए गए हैं, तो ऑब्जेक्ट की आंतरिक स्थिति में परिवर्तन एक विधि द्वारा किया जाता है, लेकिन सार्वजनिक संपत्ति प्रदान करने वालों को प्रदान करता है, कोई अपरिहार्य तरीके से कॉल करने के बजाय संपत्ति सेट करेगा। इस उदाहरण का उपयोग करें:
public class MyClass
{
public Boolean IsPublished
{
get { return PublishDate != null; }
}
public DateTime? PublishDate { get; set; }
public void Publish()
{
if (IsPublished)
throw new InvalidOperationException("Already published.");
PublishDate = DateTime.Today;
Raise(new PublishedEvent());
}
}
मेरा समाधान संपत्ति बसने वालों को निजी बनाने के लिए रहा है जो संभव है क्योंकि ओआरएम हम वस्तुओं को हाइड्रेट करने के लिए उपयोग कर रहे हैं प्रतिबिंब का उपयोग करता है इसलिए यह निजी बसने वालों तक पहुंचने में सक्षम है। हालांकि, यह इकाई परीक्षण लिखने की कोशिश करते समय एक समस्या प्रस्तुत करता है। उदाहरण के लिए, जब मैं एक इकाई परीक्षण लिखना चाहता हूं जो उस आवश्यकता की पुष्टि करता है जिसे हम पुन: प्रकाशित नहीं कर सकते हैं, तो मुझे यह संकेत देना होगा कि वस्तु पहले ही प्रकाशित हो चुकी है। मैं इसे दो बार पब्लिश कहकर निश्चित रूप से कर सकता हूं, लेकिन फिर मेरा परीक्षण मान रहा है कि पहली कॉल के लिए पब्लिश को सही तरीके से लागू किया गया है। जो थोड़ा बदबूदार लगता है।
चलो निम्नलिखित कोड के साथ परिदृश्य को थोड़ा और वास्तविक बनाते हैं:
public class Document
{
public Document(String title)
{
if (String.IsNullOrWhiteSpace(title))
throw new ArgumentException("title");
Title = title;
}
public String ApprovedBy { get; private set; }
public DateTime? ApprovedOn { get; private set; }
public Boolean IsApproved { get; private set; }
public Boolean IsPublished { get; private set; }
public String PublishedBy { get; private set; }
public DateTime? PublishedOn { get; private set; }
public String Title { get; private set; }
public void Approve(String by)
{
if (IsApproved)
throw new InvalidOperationException("Already approved.");
ApprovedBy = by;
ApprovedOn = DateTime.Today;
IsApproved = true;
Raise(new ApprovedEvent(Title));
}
public void Publish(String by)
{
if (IsPublished)
throw new InvalidOperationException("Already published.");
if (!IsApproved)
throw new InvalidOperationException("Cannot publish until approved.");
PublishedBy = by;
PublishedOn = DateTime.Today;
IsPublished = true;
Raise(new PublishedEvent(Title));
}
}
मैं यूनिट परीक्षण लिखना चाहता हूं जो सत्यापित करें:
- मैं तब तक प्रकाशित नहीं कर सकता जब तक कि दस्तावेज़ को स्वीकृति नहीं मिल जाती
- मैं एक दस्तावेज़ को फिर से प्रकाशित नहीं कर सकता
- प्रकाशित होने पर, WinBy और PublishedOn मान ठीक से सेट हो जाते हैं
- जब पबलाइज़ किया जाता है, तो PublishedEvent उठाया जाता है
बसने वालों तक पहुंच के बिना, मैं परीक्षण करने के लिए आवश्यक वस्तु को राज्य में नहीं रख सकता। बसने वालों के लिए पहुंच को खोलना पहुंच को रोकने के उद्देश्य को हरा देता है।
आप (डी) इस समस्या का समाधान (कैसे) करते हैं?