2013-02-27 20 views
6

Bir oluşturucu deseni kullanılarak oluşturulan bir nesne varsayalım.Nesnenin alanlarını doğrulamanın en iyi yolu => Ya/Try (scala 2.10)/DoğrulamaNEL (scalaz)

Bu oluşturucu modeli, alanların doğrulanmasını ve ardından hedeflenen türe dönüştürmeyi odaklayan bir build yöntemini içerir.

Bu doğrulama kullanılarak uygulanabilir

: ı bir okumak

(Scala 2.10 yeni özellik)

  • Either[FailureObject, TargetObject] tip
  • Try[TargetObject] scalaz kütüphanesinden
  • Validation[FailureObject, TargetObject] veya ValidationNEL[FailureObject, TargetObject]Either türünde Validation'un ana avantajları, Validation "kutunun dışında" arızaları biriktirebilir.

    Peki ya "yeni" Try yolu nedir? Ben Trymap, flatMap vb gibi kutusunun dışında "monadic" yöntemleri vardır fark ettim ... gerçekten ne Projection yardımı olmadan yazın ya eksikti. Bu nedenle, her bir saha doğrulama yönteminin Try[FieldType] ve daha doğrusu, herhangi bir arıza durumunda, Try[SpecificFieldExceptionType]; Bu, String ileti alanı ve build yönteminde birikebilecek bir rootCause alanı içeren iç içe geçmiş.

    Scala 2.10'u kullanarak, Try uygulamasının yapıcı modelinde olduğu gibi basit doğrulama için scalaz doğrulama kitaplığının yerini alabilir mi?

    ** DÜZENLEME * *** Try kaynak kodunu okuyarak

    , bu Try birkaç istisna birikir ve böylece yönlendirilmiş başarısız hızlı olamayacağını geliyor.

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

    birikim özelliği kolları ValidationNEL ait Aksine: bile Try.flatMap birikim kavramını yok bu yüzden potentential önceki başarısızlık döner ve.

    Herhangi bir onay?

cevap

11

ödünleşmeler vardır:

  • scalaz.Validation bir Semigroup[E] örneği verilen tip E hataları birikir edebilmektedir. Bir for -comprehension içinde rahatlıkla kullanabilirsiniz, böylece Success tarafa karşı önyargılı map ve flatMap yöntemleri var

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

    : Sanki, bir Applicative olarak kullanılmak üzere tasarlanmıştır oluyor.Bununla birlikte, bunun için tanımlanan Monad örneği yoktur, bu nedenle daha yüksek sıralı herhangi bir öğede kullanılamaz (örneğin, bunu monad trafolarıyla kullanamazsınız). Bu eksiklik sizin için bir problem gibi görünmüyor. Eğer söz etmedi

  • scalaz.\/, meydana bir Monad (yine Right tarafa doğru önyargılı) yapar. Ancak, Applicative olarak kullanıldığında, Validation'un yaptığı gibi hata yapmaz.

  • util.Tryscalaz.\/ benzeri, Throwable ürününe özeldir. Yine hataların birikiminden yoksun olmasına rağmen, hata düzeltme kavramı var. Ancak, "oluşturucu desen" kullanım durumunuz için, bu durum çok kullanışlı olmayabilir.

  • Son olarak, util.Either diğer üç seçenekten kıyasla dikkate değer değildir: bir tarafı veya diğer önyargılı değildir çünkü, açıkça ve tutarlı left veya right projeksiyon için istediğiniz her zaman sormak zorunda monadik bir şey yapmak.

En iyi tahminle durumunuza, scalaz.Validation en uygun seçenek olmasıdır.

+0

Daha iyi bir cevap hayal edemezsiniz => çok iyi açıklanmış! Çok teşekkürler :) Gerçekten, Builder'ım ile çalışmak için Doğrulama'yı seçtim. – Mik378

+0

@ Mik378 Teşekkürler! – mergeconflict

İlgili konular