2009-06-25 19 views
8

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

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

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

मेरा विशिष्ट कार्यक्रम सी # में है लेकिन यह काफी सामान्य "सर्वोत्तम अभ्यास" प्रश्न जैसा दिखता है और मुझे यकीन है कि मुझे इसका जवाब पता होना चाहिए। किसी भी सलाह आभारी रूप से प्राप्त किया।

उत्तर

5

मैं शायद बिटमैप-विकल्प के लिए जाऊंगा।सीधे शब्दों में

[Flags] 
public enum ValidationError { 
    None = 0, 
    SomeError = 1, 
    OtherError = 2, 
    ThirdError = 4 
} 

... और में बुला कोड, बस:

ValidationError errCode = employee.Validate(); 
if(errCode != ValidationError.None) { 
    // Do something 
} 

अच्छा और मेरे लिए कॉम्पैक्ट लगता है।

+0

+1 - आपने मुझे इसे हराया। –

+0

आप सही हैं, मुझे अपने त्रुटि संदेशों के बारे में संरचित किया जाना चाहिए और उनके लिए केंद्रीय भंडार होना चाहिए जहां मैं उन्हें "उपयोगकर्ता के अनुकूल" संस्करण आदि के लिए देख सकता हूं। – Frans

+0

केवल इस समाधान के साथ मुझे नाइट-पिक है कि मैं नहीं चाहता '[ध्वज]' के साथ सजाए गए पहले enum के मान के रूप में '0' का उपयोग करें ... – IAbstract

6

मैं बस, इस विधि से वापस जाने के लिए एक bool और त्रुटि संदेश के साथ एक स्ट्रिंग सरणी सहित एक संरचना बना सकते हैं, लेकिन सिर्फ भद्दा लगता है।

ऐसा क्यों लगता है? जानकारी को समाहित करने के लिए एक उचित प्रकार बनाना सही है। हालांकि, मैं इस तरह की जानकारी को एन्कोड करने के लिए जरूरी नहीं है। एक enum बेहतर अनुकूल हो सकता है।

एक विकल्प वापसी प्रकार को उपclass करना होगा और प्रत्येक मामले के लिए एक अतिरिक्त बाल वर्ग प्रदान करना होगा - यदि यह उचित है। यदि एक से अधिक विफलताओं को संकेत दिया जा सकता है, तो एक सरणी ठीक है। लेकिन मैं इसे अपने आप में भी समाहित कर दूंगा।

सामान्य पद्धति ऐसा दिखाई दे सकता:

class ValidationInfo { 
    public bool Valid { get; private set; } 
    public IEnumerable<Failure> Failures { get; private set; } 
} 
1

मैं TryParse तरीकों के पैटर्न का पालन करें और इस हस्ताक्षर के साथ एक विधि का प्रयोग करेंगे:

public bool TryValidate(out IEnumerable<string> errors) { ... } 

एक अन्य विकल्प सत्यापन खींचने के लिए है वस्तु से बाहर अपनी कक्षा में कोड, संभवतः विशिष्टता पैटर्न पर निर्माण।

public class EmployeeValidator 
{ 
    public bool IsSatisfiedBy(Employee candidate) 
    { 
     //validate and populate Errors 
    } 
    public IEnumerable<string> Errors { get; private set; } 
} 
0

हम एक विंडोज फॉर्म त्रुटि प्रदाता के साथ वसंत सत्यापन का उपयोग कर रहे हैं।

तो हमारा सत्यापन फ़ंक्शन एक नियंत्रण आईडी और एक त्रुटि संदेश (प्रत्येक सत्यापन त्रुटि के लिए) के साथ एक शब्दकोश देता है। त्रुटि प्रदाता नियंत्रण के पास एक पॉप अप फ़ील्ड में त्रुटि संदेश दिखाता है जो त्रुटि उत्पन्न करता है।

मैंने अतीत में कुछ अन्य सत्यापन योजनाओं का उपयोग किया - लेकिन यह वास्तव में अच्छी तरह से काम करता है।

1

मुझे यह एक विधि (या एक संपत्ति, क्योंकि सी # के लिए अच्छा समर्थन है) के लिए यह एक अच्छा दृष्टिकोण मिला है, जो किसी भी प्रकार के समझदार, उपयोग में आसान प्रारूप, जैसे सूची में सभी सत्यापन त्रुटि संदेश देता है तारों का

इस तरह आप अपनी वैध विधि को वापस लौटने वाले बूल भी रख सकते हैं।

public sealed class ValidationResult<T> 
{ 
    private readonly bool _valid; // could do an enum {Invalid, Warning, Valid} 
    private readonly T _result; 
    private readonly List<ValidationMessage> _messages; 

    public ValidationResult(T result) { _valid = true; _result = result; _messages = /* empty list */; } 

    public static ValidationResult<T> Error(IEnumerable<ValidationMessage> messages) 
    { 
     _valid = false; 
     _result = default(T); 
     _messages = messages.ToList(); 
    } 

    public bool IsValid { get { return _valid; } } 
    public T Result { get { if(!_valid) throw new InvalidOperationException(); return _result; } } 
    public IEnumerable<ValidationMessage> Messages { get { return _messages; } } // or ReadOnlyCollection<ValidationMessage> might be better return type 

    // desirable things: implicit conversion from T 
    // an overload for the Error factory method that takes params ValidationMessage[] 
    // whatever other goodies you want 
    // DataContract, Serializable attributes to make this go over the wire 
} 
2

लग रहा है।

www.lhotka.net

+0

मैं शायद असफल होने का संदर्भ जोड़ूंगा, अगर यह विशेषता स्तर नियम था जो तब उस संपत्ति के संदर्भ में असफल रहा, अगर यह इकाई व्यापक था तो इकाई के संदर्भ में इत्यादि। – epitka

1

आप जो इसे में व्यापक व्यापार नियम/सत्यापन ट्रैकिंग forr व्यापार वस्तुएं हैं रॉकफोर्ड Lhotka के CSLA पर एक नज़र ले सकता है: जैसे आप एक सामान्य वर्ग की जरूरत

1

मैं क्रिस डब्ल्यू के साथ सहमत मैं एक ही सवाल पूछा, Rocky`s विशेषज्ञ सी # व्यापार वस्तुओं को पढ़ने से पहले।

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

आपकी व्यावसायिक श्रेणी IDataError इंटरफ़ेस को कार्यान्वित कर सकती है। अपने यूआई नियंत्रण को अपने व्यावसायिक ऑब्जेक्ट गुणों पर बाध्य करने से आपके ऑब्जेक्ट पर किसी भी टूटी हुई नियमों के आपके त्रुटि प्रदाता नियंत्रण को सूचित किया जाएगा।

मैं वास्तव में आपको समय लेने और सत्यापन अनुभाग को देखने की सलाह दूंगा।

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