एक वस्तु का आरंभीकरण छोड़ रहा है निर्माता में एक अपवाद फेंक द्वारा किया जाता है, और अमान्य इनपुट अस्वीकार करने के लिए सिफारिश की है।
public class User
{
public User(String name) {
if (String.IsNullOrWhiteSpace(name)) {
if (name == null) {
throw new System.ArgumentNullException("Cannot be null.", "name");
}
else {
throw new System.ArgumentException("Cannot be empty.", "name");
}
}
}
}
व्यापार तर्क आप निर्माता में परिभाषित करने के लिए वहाँ से मेल नहीं खाती कामना करते हैं। रचनाकारों को हल्के, और तात्कालिकता होना चाहिए। कुछ डेटा स्रोत पूछना एक कन्स्ट्रक्टर के लिए बहुत महंगा है। इसके कारण, आपको इसके बजाय फैक्ट्री पैटर्न का उपयोग करना चाहिए। कारखाने के पैटर्न के साथ, एक कॉलर ऑब्जेक्ट सृजन के साथ कुछ भारी उठाने की उम्मीद कर सकता है।
public class User
{
private User(String name) {
if (String.IsNullOrWhiteSpace(name)) {
if (name == null) {
throw new System.ArgumentNullException("Cannot be null.", "name");
}
else {
throw new System.ArgumentException("Cannot be empty.", "name");
}
}
}
public static User CreateUser(String name) {
User user = new User(name); // Lightweight instantiation, basic validation
var matches = allUsers.Where(q => q.Name == name).ToList();
if(matches.Any())
{
throw new System.ArgumentException("User with the specified name already exists.", "name");
}
Name = name;
}
public String Name {
get;
private set; // Optionally public if needed
}
}
आप देख सकते हैं कि कारखाना पैटर्न बेहतर फिट बैठता है, और क्योंकि यह एक विधि है एक फोन करने वाले कुछ काम यह लागू द्वारा चल रहा होने की उम्मीद कर सकते हैं। जबकि एक कन्स्ट्रक्टर के साथ एक हल्का वजन होने की उम्मीद करेगा।
आप निर्माता मार्ग जाना चाहते थे, तो आप इस तरह के जब डेटा स्रोत में वास्तविक डालने का प्रयास किया है के रूप में अपने व्यापार के नियमों को लागू करने के कुछ अन्य विधि की कोशिश करना चाहते हैं। आप `किसी भी करने के लिए एक विधेय आपूर्ति कर सकते हैं:
public class User
{
public User(String name) {
if (String.IsNullOrWhiteSpace(name)) {
if (name == null) {
throw new System.ArgumentNullException("Cannot be null.", "name");
}
else {
throw new System.ArgumentException("Cannot be empty.", "name");
}
}
}
}
public class SomeDataSource {
public void AddUser(User user) {
// Do your business validation here, and either throw or possibly return a value
// If business rules pass, then add the user
Users.Add(user);
}
}
स्रोत
2012-05-08 15:11:53
एक जानवर बल भी तरह से, को शून्य अशक्त क्षेत्रों के साथ वस्तु जोड़ने के लिए, वस्तु – RhysW
को दूर यह सिर्फ नमूना कोड हो सकता है लेकिन इस मामले में ऐसा नहीं है करने के लिए सभी क्षेत्रों सेट ', इसलिए आपको' कहां 'से गुज़रना पड़ेगा। –
@BrianRasmussen दोनों का एक ही परिणाम है, इसलिए यह वास्तव में व्यक्तिगत वरीयता है जिसका आप उपयोग करते हैं। दूसरी तरफ 'ToList' कॉल पूरी क्वेरी का मूल्यांकन न करने से 'किसी भी' की छोटी सर्किटिंग को रोकती है। – Servy