2014-04-22 23 views
8

Kerkenez'i kullanarak bir kodun yan etki bölümünü bir kenara bırakmanın neden bu kadar yararlı olduğunu merak ediyorum. Kimsede tecrübesi var mı? ve gerçek motivasyonu açıklayabilir ve tam olarak nasıl yardımcı olur.kestrel fonksiyonel programlama Tasarım Kalıbının katma değeri nedir? (Scala)

Saf işlevli programlamanın sıfır yan etki ve bundan sonra kodun daha iyi hata ayıklama ve tahmin edilebilirliği olduğunu anlamasa da. Ancak Kestrel durumunda, bunun nasıl yapılmasına gerçekten yardımcı olduğunu görmüyorum?

iyisi,

MM

cevap

17

nokta muhtemelen etrafta olması istemiyoruz, ya da bir şey sen' için yeni bir blok oluşturmak zorunda kalmamak için bir ara değişken oluşturmak kaçınmaktır geçerken yapıyoruz. en biz Ruby gibi kerkenez olduğunu varsayalım:

xs.map(_ + 7).filter(foo).take(n) 

ve filtreden sonra hata giderme mesajı yazdırmak istiyorum:

implicit class RubyKestrel[A](val repr: A) extends AnyVal { 
    def tap[B](f: A => B) = { f(repr); repr } 
} 

Şimdi de kod bazı satır olduğunu kabul edelim.

{ 
    val temp = xs.map(_ + 7).filter(foo) 
    println(temp) 
    temp.take(n) 
} 

Ugh: tap olmadan biz bu çizgiyi refactor. Şimdi tap olduğunu varsayalım:

xs.map(_ + 7).filter(foo).tap(println).take(n) 

Whew, yolu daha iyi!

Bir ekleme yöntemine sahip bir yığına sahip olduğumuzu ve başka bir yerde kullanmadan önce yığına bir şeyler eklemek istediğimizi varsayalım. ( ). Ama tap ile:

def newStack = (new Stack).tap(_ add "whatever") 

Oldukça kullanışlı - gerçekten sadece sağlayan bir şeye herhangi bir normal yan etkileyen yöntemini açmak olduğunu yapabilirsiniz zincir aramaları için. Zincirli aramalar genellikle daha düşük çaplı olduğundan, genellikle büyük bir kazançtır.

+0

Çok teşekkürler, anladım! – MaatDeamon

+0

Ayrıca, doğal olarak beni bir _tap_ istemeye itmeme ihtiyacı vardı: Değişkenler yaratmaktan kaçınmak istedim ve sonra bloğun sonunda bunları tekrarlamak istedim. Kod, _tap_ ile daha kısa ve daha okunabilir (Scala'nın kendisinin bir parçası olması gerektiğine inanıyorum). – Frank