2015-04-18 17 views
7

Log4j'yi koduma uyguladığımdan beri kesişen kaygılar hakkında çevrimiçi okuyorum. Bazıları AspectJ kullanarak söylüyorlar, bazıları ise işlevsel programlamayı bozduğuna işaret ediyor. Bu karışımlar, çapraz kesim endişeleri için Scala'nın çözümü. Bununla birlikte, kendisiyle ilgili olmayan bir nesneye/sınıfa bir özellik ekleyeceğimi düşündüğüm zaman, ben de bir saçmalıyorum.Çapraz kesim endişeleriyle nasıl başa çıkılır Scala yolu

örn. new Database with Logger

Logger burada Database ile ilgisi yok, ancak nasıl kayıt sağlamak için karıştırma yapması gerekiyor. Bunu Scala yolunu yapmayı tercih ederim, bu yüzden insanların mikslerle ne demek istediğini öğrenmek istiyorum.

Birisi bana bu konuda Scala'da nasıl hızlı bir örnek gösterebilir?

cevap

5

Bu, pek çok olası "doğru" yanıtla birlikte büyük bir konudur. Benim kişisel favorim, "ad parametrelerine göre" veya daha yüksek mertebeden işlevler kullanıyor olabilir.

Hem bunun çok basit bir örnek: kendisi (çapraz kesim endişe hakkında java şeyle bir yöntem çağrısı sarma annotating gibi bir şey bildiği bir nesne hem uygulamak için izin verecek

object Logging { 
    def logCall[T](name: String)(block: => T): T = { 
    log.info(s"Invoking: $name") 
    block 
    } 
} 

):

import Logging._ 
def businessLogic() { 
    val user = ??? 
    val result = logCall("insert user")(DB.insert(user)) 
    println(result) 
} 
:
class DB { 
    import Logging._ 
    def insert(item: Something) = logCall("insert") { 
    ??? 
    } 
} 

Ya çağrı yerinde Bununla ilgili en güzel şey, çok açık ve kendini açıklayıcı (ki, yine de yüksek değere sahip olabileceğiniz şeyler olabilir).

+1

Bu, Java'da genel bir değişkene sahip olmakla aynı şeydir. Ve bağımlılık enjeksiyonunun amacını reddeder. –

+1

Bu, Java'da global bir değişkene sahip olmakla aynı şey değildir, eğer çapraz bağlanma kaygısına sahip olmak istediğiniz bağımlılıkları varsa, bunları çapraz veya kesikli parametrelere çapraz kesim yöntemine geçirebilirsiniz. Hiçbir şey şart değildir Tek bir günlüğün kaydedilmesi, yalnızca kod örneği özetini yapmak için yapıldı (ve nadiren bir kaydediciyi enjekte edeceğinizden). – johanandren

+0

yeterince adil. Şimdi anladım. –

İlgili konular