2013-02-27 171 views
6

चलिए एक निर्माता पैटर्न का उपयोग करके निर्मित ऑब्जेक्ट मानते हैं।ऑब्जेक्ट के फ़ील्ड सत्यापन को संभालने का सबसे अच्छा तरीका => या तो/कोशिश करें (स्केल 2.10)/वैलिडेशननेल (स्केलज़)

इस बिल्डर पैटर्न लक्षित प्रकार के रूपांतरण पर खेतों मान्यता पर ध्यान केंद्रित कर एक build विधि होते हैं और उसके बाद होगा।

इस मान्यता का उपयोग कर लागू किया जा सकता:

मुझे लगता है कि में से एक को पढ़ने के लिए (स्काला 2.10 से नई सुविधा)

  • Either[FailureObject, TargetObject] प्रकार
  • Try[TargetObject]
  • Validation[FailureObject, TargetObject] या ValidationNEL[FailureObject, TargetObject] scalaz पुस्तकालय से Validation के Either से अधिक के मुख्य फायदेहै"बॉक्स से बाहर" विफलताओं को जमा कर सकता है।

    लेकिन "नया" Try तरीका के बारे में क्या? मैंने देखा है कि Try भी बॉक्स से बाहर "monadic" तरीकों, map, flatMap आदि की तरह ... क्या वास्तव में Projection की मदद के बिना किसी भी प्रकार के साथ याद आ रही थी।

    इस प्रकार, मैं एक Try[FieldType] और वापस लौटने वाले प्रत्येक क्षेत्र सत्यापन विधि कल्पना अधिक सटीक, किसी भी विफलता के मामले में, एक Try[SpecificFieldExceptionType]; इस नेस्टेड में String संदेश फ़ील्ड और एक रूटकॉज़ फ़ील्ड है जिसे build विधि में जमा किया जा सकता है।

    स्काला 2.10 का उपयोग करना, कर सकते थे या Try अभ्यास सरल सत्यापन के लिए scalaz सत्यापन पुस्तकालय बदलना चाहिए बिल्डर पैटर्न की तरह शामिल है?

    ** संपादित * ***

    Try स्रोत कोड को पढ़ने के द्वारा, यह लग रहा है कि Try कई अपवाद जमा नहीं कर सकता है और इस तरह उन्मुख है असफल फास्ट। भी Try.flatMap potentential पिछले विफलता देता है और इतने संचय की धारणा नहीं है:

    def flatMap[U](f: T => Try[U]): Try[U] = this.asInstanceOf[Try[U]] 
    

    ValidationNEL के विपरीत है कि संचय सुविधा संभालती पर।

    कोई पुष्टि?

उत्तर

11

समझौतों से कर रहे हैं:

  • scalaz.Validation एक Semigroup[E] उदाहरण दिए गए प्रकार E की त्रुटियों जमा करने में सक्षम है। ऐसा लगता है, एक Applicative के रूप में उपयोग के लिए है:

    (fragileFoo |@| fragileBar) { case (foo, bar) => doSomething(foo, bar) } 
    

    यह map और flatMap तरीकों, Success पक्ष के प्रति पक्षपाती है, तो आप इसे आसानी से एक for -comprehension में उपयोग कर सकते हैं।हालांकि, इसके लिए Monad उदाहरण परिभाषित नहीं किया गया है, इसलिए इसका उपयोग किसी भी उच्च-आदेश सामग्री में नहीं किया जा सकता है (उदाहरण के लिए, आप इसे मोनैड ट्रांसफार्मर के साथ उपयोग नहीं कर सकते हैं)। यह कमी ऐसा प्रतीत नहीं होती है कि यह आपके लिए एक समस्या होगी, हालांकि।

  • scalaz.\/ है, जो आप का उल्लेख नहीं था, के रूप में करता है एक Monad (फिर से, Right पक्ष की ओर पक्षपाती)। लेकिन जब Applicative के रूप में उपयोग किया जाता है, तो यह Validation करता है विफलताओं को जमा नहीं करता है।

  • util.Tryscalaz.\/ के समान है, Throwable के लिए विशिष्ट है। हालांकि इसमें फिर से त्रुटियों के संचय की कमी है, लेकिन इसमें त्रुटि वसूली की धारणा है। हालांकि, आपके "बिल्डर पैटर्न" केस केस के लिए, ऐसा लगता है कि यह बहुत उपयोगी नहीं हो सकता है।

  • अंत में, util.Either, पर विचार अन्य तीन विकल्पों की तुलना में लायक नहीं है: क्योंकि यह एक तरफ या अन्य की ओर पक्षपाती नहीं है, आप स्पष्ट रूप से और लगातार left या right प्रक्षेपण के लिए हर बार जब आप करना चाहते हैं पूछने के लिए कुछ monadic करो।

मेरे सबसे अच्छा अनुमान है कि अपनी स्थिति के लिए, scalaz.Validation सबसे उपयुक्त विकल्प है।

+0

एक बेहतर उत्तर => बहुत अच्छी तरह से समझाया नहीं जा सका! बहुत बहुत धन्यवाद :) वास्तव में, मैंने अपने बिल्डर के साथ काम करने के लिए सत्यापन चुना है। – Mik378

+0

@ मिक 378 धन्यवाद! – mergeconflict