2013-05-23 11 views
6

Scalaでオブジェクトをエイリアスする「正しい」方法は何ですか?例えば型/値エイリアスを提供する特性を持つScalaパッケージオブジェクト

、私は、のは、私が繰り返しRoleGroupコマンドをインポートしたくないので、私は(SBTサブプロジェクトに分割されて)私のアプリケーションのさまざまな部分

trait RoleGroup 
object RoleGroup { 
    case object ADMIN  extends RoleGroup 
    case object MEMBER extends RoleGroup 
    case object PUBLIC extends RoleGroup 
} 

スコープでRoleGroupコマンドを必要としましょう型に別名RoleGroupコマンドトレイトとオブジェクトに決めたので、同様のvalの対応:

package com.developer 
package controller 

trait ControllerBase { 
    type RoleGroup = controller.RoleGroup 
    val RoleGroup  = controller.RoleGroup 
    ... 
} 

、その後、サブプロジェクトパッケージオブジェクトは自由のための輸入を取得するためのヘルパー形質を拡張することができます。

package com.client 

package object member 
    extends com.developer.controller.ControllerBase 

スコープ内にある必要がある他のケースオブジェクトについても同じことを行います。これは賢明な解決策ですか?すなわち、私が気づく必要がある欠点/問題はありますか?すべてがコンパイルされ、ブラウザのテストページはプリリファクタリングされたアプリケーションと同じように動作しますが、これが最善のアプローチかどうかはわかりません。

答えて

6

これは分かりやすいアプローチです。実際にはit's being applied in the Scala libraryそのものです。

タイプ(つまり特性とクラス)と値(つまりオブジェクト、パッケージ、値)の2つのレベルに分かれています。あなたはその両方をカバーします。

+1

+興味深いことに、それはエイリアスレシピでなければなりません;-)オブジェクトのための特性/クラスとvalのタイプ。間違いなく、このアプローチで多くの輸入定例を減らすことができます – virtualeyes

関連する問題