SORU
6 AĞUSTOS 2010, Cuma


Scala vs kompozisyon Mixins

Java dünyası (eğer birden çok devralma varsa daha doğrusu/mixins) başparmak kuralı çok basit: "sınıfı miras üzerinden kompozisyon". İyilik nesne

Ayrıca mixins düşünürsek değişti nasıl olduğunu/bilmek, özellikle scala istiyorum?
Mixins birden çok devralma veya daha fazla sınıf kompozisyon bir yol olarak değerlendiriliyor?
Orada da "sınıf bileşimi bileşimi" (ya da tersi) kılavuz? İyilik nesnedir

İnsanların kullanımı (veya kötüye) nesne kompozisyonu da bu işi yapabileceğini mixins zaman zaman oldukça bazı örnekler gördüm ve her zaman daha iyi olduğunu emin değilim. Onlarla çok benzer şeyler elde edebilirsiniz, ama aynı zamanda bazı farklılıklar vardır, bazı örnekler: gibi geliyor bana

  • görünürlük - mixins ile her şey kompozisyon konusu da ortak apı parçası haline gelir.
  • ayrıntı - çoğu durumda mixins daha ayrıntılı ve biraz daha kolay, ama her zaman böyle değil (eğer sen de karmaşık hiyerarşileri kendi türlerini kullanmak gibi)

Kısa cevabı biliyorum "duruma göre değişir", ama muhtemelen bu daha iyi olduğunda bazı tipik durum var.

Şu ana kadar bulabildiğim kuralları bazı örnekler (A ve B ve B bazı yöntemler kullanmak istediği iki özellik var varsayarak):

  • Eğer B mixins yöntemleri ile Bir API uzatmak istiyorsanız, aksi takdirde kompozisyon. Ama eğer yaratıyorum sınıf/örnek bir ortak API parçası değilse yardımcı olmuyor.
  • Eğer mixins () örneğin Stackable Trait Pattern sonra bazı desenler kullanmak istiyorsanız kolay bir karar değil.
  • Eğer dairesel bağımlılıkları varsa o zaman kendi türleri ile mixins yardımcı olabilir. (Bu durumu önlemek için çalışıyorum, ama her zaman kolay değil)
  • Eğer kompozisyon nasıl dinamik, zamanı bazı kararları istiyorsanız o zaman kompozisyon nesne.

Birçok durumda mixins galiba daha kolay (ve/veya daha az ayrıntılı) ama gayet eminim onlar da bazı tuzaklar gibi "Tanrı sınıf" ve diğerleri açıklanan iki artima makaleler: part 1, part 2 (BTW bana öyle geliyor ki, en çok da diğer sorunlar değil ilgili değil, çok ciddi scala).

Bu gibi ipuçları var mı?

CEVAP
6 AĞUSTOS 2010, Cuma


Bir çok sorunları olan insanlar var mix-ins olabilir önlendi içinde Scala eğer sadece mix-soyut özellikleri içine sınıf tanımları ve sonra karışımı ilgili somut özellikleri de nesne örnekleme zaman. Örneğin

trait Locking{
   // abstract locking trait, many possible definitions
   protected def lock(body: =>A):A
}

class MyService{
   this:Locking =>
}

//For this time, we'll use a java.util.concurrent lock
val myService:MyService = new MyService with JDK15Locking 

Bu yapıyı tavsiye etmek için birkaç şey vardır. İlk olarak, özellik işlevleri farklı kombinasyonları gereken dersleri orada bir patlama engeller. İkinci bir oluşturmak gibi, kolay test için izin verir, ve karıştırmak-"do-hiçbir şey" beton özellikleri, alay nesnelere benzer. Son olarak, tamamen kilit özelliği kullanılan gizli ettik ve hatta o kilitleme, hizmetimizin tüketicilerin oluyor.

Mix-ins iddia sakıncaları en son geldiğimizden beri, hala bir tercih yapmak zorunda kaldık -mix ve kompozisyon arasında. Kendim için, ben normalde karar varsayımsal bir temsilci nesnesi tamamen içeren nesne tarafından saklanmış olup olmayacağı, ya da ortak olabilir potansiyel olarak bağlı olun ve kendi bir ömrü var. Kilitleme sağlar tamamen kapsüllü delege iyi bir örnek. Eğer sınıf kullanan bir kilit nesnesi için yönetmek eş zamanlı erişim için kendi iç durumu, kilit ile tamamen kontrol edilebilir içeren nesne, ve ne o ne de onun işlemleri duyurulan bir parçası olarak sınıfları ortak arabirim. Tamamen kapsüllenmiş işlevselliği için böyle, mix-ins ile gidiyorum. Bir veri kaynağı gibi bir şey paylaştı, kompozisyon kullanın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006
  • LimeFire

    LimeFire

    2 ŞUBAT 2012