2012-07-12 20 views
8

beni aşağıda her iki sınıf Buradaki sorun ile hiçbir ad ayrılık olmadığı için bu YÖNETİCİ belirsiz olduğuscala vaka nesne kirliliği

RoleGroup.scala 
abstract class RoleGroup 
case object ADMIN extends RoleGroup 
case object MEMBER extends RoleGroup 

MailSender.scala 
abstract class MailSender 
case object ADMIN extends MailSender 
case object STAFF extends MailSender 
case object ACCOUNTANT extends MailSender 

paket com.company.foo içindedir ;-)

açıklayalım durum nesneleri. Paket başına yalnızca tek bir isimlendirilmiş vaka nesnesi olabileceği görülüyor.

Sanırım bir mail.ADMIN, roleADMIN vb. Ya da sadece uygun Enumlar yaratmalı ve vaka nesnelerini unutmalı mıyım? Ya da başka bir yaklaşım mı? MailSender için

object RoleGroup { 
    sealed trait RoleGroup 
    case object ADMIN extends RoleGroup 
    case object MEMBER extends Rolegroup 
} 

ve benzer:

+1

Bu durumda, ad alanı kirliliği hakkında endişelenmeden 'RoleGroup.Admin' vs. 'MailSender.Admin' öğesini belirleyebileceğiniz için numaralandırmaların kullanılması iyi bir fikir olacaktır. – adelbertc

+0

Evet, bu sadece seçeneklerin ne olduğunu görmeye çalışmak gibi görünüyor. Belki de vaka nesneleri, sadece yerel kapsamda veya isim çarpışması şansının olmadığı yerlerde kullanılmak üzere tasarlanmıştır. – virtualeyes

cevap

13

gibi bir şey yapabilirdi. Eğer numaralamalar bu yaklaşım ya da kullanmak istediğiniz olsun

çoğunlukla bağlıdır vb hem siz RoleGroup.ADMIN onlara bakın kullanırken Sonra sadece birini kullanıyorsanız durumlarda, sen import MailSender._ veya bunun tersi, ama yapabileceği onları kullanmak niyetindesin. Bu yaklaşımda, her "enum" bir tiptir, Enums ile her bir enum bir değerdir. Birincisi, desen eşleştirmesi için daha iyi çalışır çünkü derleyici, maçlarınızın eksiksiz olup olmadığını kontrol edebilir, ikincisi, serileştirme ile çalışmak için daha iyi (IMO).

+0

+ 1 hasta, güzel bir çözüm, bu hile yapması gereken – virtualeyes

+0

hile yapmaz, kirlilik gitti ;-) teşekkürler! – virtualeyes

+0

Evet, sadece yorum yapabilmek için, özelliğin uygun bir ilişki ilişkisini tanımlamak için sıklıkla nesneninkiyle aynı düzeyde tanımlanmasını istemiş olmanızdır. Bu örnekte gerçekten önemli değil, ancak türlerin işlevselliğini genişletirseniz yararlı olabilir. –

8

Her yerde olduğu gibi burada da enumlara ihtiyacınız yok. Tek ihtiyacın olan şey doğru isim. Ayrıca Scala güçlü size sunarken bu şekilde kullanılması

sealed abstract class RoleGroup 
object RoleGroup { 
    case object Admin extends RoleGroup 
    case object Member extends RoleGroup 
    // also just in case 
    sealed case class SomeParameterizedGroup (
    param1: Any, 
    param2: Int 
) extends RoleGroup 
} 

çok Java'nın çeteleler hatırlatır:

def foo (roleGroup: RoleGroup) = 
    roleGroup match { 
    case RoleGroup.Admin => 
    case RoleGroup.SomeParameterizedGroup(param1, param2) => 
    } 

unutmayın ben en benefitial için arkadaşı nesne yaklaşımı bulmak Dan'in çözümünde, roleGroup'un türü, doğal olmayan bir his olan RoleGroup.RoleGroup olacaktır. Ayrıca büyük harfli isimlerin Scala'nın stil kurallarını ihlal ettiğini ve yukarıdaki örneklerden neden olduğunu anlayabileceğinizi unutmayın.

+0

+1, görüyorum, bu nedenle eşlik nesnesinin dışındaki özelliği hareket ettirin, mantıklı. Dan'in çözüm nesnesindeki – virtualeyes

+0

, eşlik eden bir nesne değildi, bu (nesne), onun dışındaki hareket özelliğinden sonra arkadaş olur. – aeracode

İlgili konular