2015-10-12 8 views
6

私はしばらくの間、スケーラーの学習を始め、現在はケーキパターンを見ています。私はそれがサービスに注入されたJPAリポジトリを取得するにはあまりにも多くの定型コードのように見えるhereスケッチのケーキパターンの重要性

trait UserRepositoryComponent { 
    def userLocator: UserLocator 

    trait UserLocator { 
    def findAll: List[User] 
    } 
} 

trait UserRepositoryJPAComponent extends UserRepositoryComponent { 
    val em: EntityManager 

    def userLocator = new UserLocatorJPA(em) 

    class UserLocatorJPA(val em: EntityManager) extends UserLocator { 
    def findAll = { 
     println("Executing a JPA query") 
     List(new User, new User) 
    } 
    } 
} 

trait UserServiceComponent { 
    def userService: UserService 

    trait UserService { 
    def findAll: List[User] 
    } 
} 

trait DefaultUserServiceComponent extends UserServiceComponent { 
    this: UserRepositoryComponent => 

    def userService = new DefaultUserService 

    class DefaultUserService extends UserService { 
    def findAll = userLocator.findAll 
    } 
} 

から私に例を得ました。

しかし、このコードでは、両方のシナリオをインスタンス化ライン

trait UserRepository { 
    def findAll 
} 

trait JPAUserRepository extends UserRepository { 
    val em: EntityManager 
    def findAll = { 
    em.createQuery 
    println("find using JPA") 
    } 
} 

trait MyService { 
    def findAll 
} 

trait MyDefaultService extends MyService { 
    this: UserRepository=> 
} 

のはるかに少ない数と同じことをするだろう。

val t1 = new DefaultUserServiceComponent with UserRepositoryJPAComponent { 
    val em = new EntityManager() 
} 
t1.userService.findAll 


val t2 = new MyDefaultService with JPAUserRepository { 
    val em = new EntityManager 
} 

t2.findAll 

第2のシナリオでは、はるかに少ないコードしか使用せず、DIを使用します。ケーキパターンがもたらした特別なメリットについて理解できますか?

+0

を見ることをお勧めScalaでDIのように、スプリングを使用するには、あなたの第二の例はまた、ケーキのパターンの変形です。 –

答えて

2

私はそれを理解し、何もあまり違いはありません。実際にケーキのパターンはIoCです。 IoCDIを別々のDIフレームワークなしで実装するという考え方ですが、スカラコードだけです。より多くの機能を必要としない限り、おそらく別のDIコンテナよりも優先してください。

また、あなたの例の両方がケーキパターンであるように見えます。少なくともそれは私がそれを理解する方法です。しかし、マーティンは彼の本で「ケーキパターン」と名をつけていませんでした。私はスカラー・モスリーの知識を単一の本に基づいています。私の理解では、ケーキのパターンは、私はマーティンは具体的には、ScalaでSpringなどDI -containersを使用することが大丈夫であることを、彼の著書で述べたが、私は残念ながらこの場所を見つけることができないと思いますDI

を達成するために、異なる特性をアイデア組み合わせているということです

更新

はそれを見つけた:http://www.artima.com/pins1ed/modular-programming-using-objects.html27.1 The problemの最後のサブパラグラフを参照してください。しかし、私は彼のアイデアは、あなたが、私はちょうど私の答えを読み直しました

アップデート2

を与え、私は必要なことを理解記事から同じに見えますが、ここでは「ケーキ」の話をされていない、言ったようにそれは完全に質問に答えていないので、それを改善する。

"ケーキパターン"は、よりシンプルであるため、好きなはずです。Springを使用する場合は、XMLでも注釈でも設定を維持する必要があります。クラスにはいくつかの要件があります(私はSpringを使用していないので、何かがあるかどうかはわかりません)。あなたと一緒に春を全部持って来る。ケーキパターンでは、単純なコードを書くだけです(2番目の例はシンプルですが、同意する必要があります)。スカラについては、多くのことをすることができ、いくつかのフレームワークを使用することができます - Javaと比較すれば、通常はもっと多くの外部ライブラリを使用します

さらに高度な機能が必要な場合は、あなたはSpringに切り替えるか、Scalaの使用を継続して言語そのものの問題を解決することができます。うまくいけば、scalaは非常に強力で複雑なケースもカバーするはずです。

指定した2つのコード片との差はわずか抽象である:最初のものは、リポジトリ・サービスで定義された操作を介して1つの以上の抽象化を有し、これらは、パターンの一部ではありません。私はこれが必要であるとは思わないが、著者はこれをこのように見せることにした。あなただけJPAUserRepositoryfindAll実装使用2番目の例では

2

IoCタイプのコードインジェクションシステムと比較してケーキパターンが得られるのは、コンパイル時に束縛に対してランタイムチェックを伴う設定とは対照的に、使用する実装に明示的な依存関係があることですXMLファイルまたはアノテーションのすなわち、コンパイル時間とランタイムの区別です。

テストでは、疑似インパクトを入れて混ぜ合わせるだけです。プロダクションでは、「本当の」インプリメントを使用してそれらを混ぜることができます。何か間違ったことをコンパイラが伝えます。

(現実ははるかに複雑な静的オブジェクトを混合し、一致する場合は、NULLポインタの問題や非決定論の様々な種類を得ることができるようです。)

+0

IoCは決してXMLに関するものではありません。通常、コンパイル時にコードの依存関係を設定することができます。私は個人的にそれを好む方法です。それはまだIoCです – Archeg

+0

@Archeg大量のXML構成ファイルを必要とするSpringや他の同様のIoCソリューションでの私の答えは私の答えです。 – wheaties

+0

2番目の方法では、モック/リアルの両方の実装を混在させることはできません。あなたが間違った種類のものを混ぜようとすると、Complierはエラーにフラグを付けます。まだ利点を見ていないケーキは、すべての余分なコードをもたらします。 –

1

。しかし、基本的には、私の意見では第二のアプローチの問題は、あなたが実際に公開すべきではないビジネスインタフェース(Serviceタイプt2のオブジェクトを使用する場合に別名UserRepositor APIが公開さshould't)

ケーキパターンを介してAPIを公開ということですいくつかのIoCフレームワークを使って書くことができるよりも少し多くのコードを導入しています。しかし、コードをやや異なる方法で構造化することもできます。たとえば、サービスごとではなく、論理的に関連するサービスのグループごとに、コンポーネント特性を記述します。 )一例として、リポジトリサービスのすべての種類はRespositoryComponent内に常駐することができるビジネスサービスのすべての種類は、BusinessLogicComponent内に常駐することができます。春と比較するために、コンポーネント実装の特性はBeanのXMLデカルレーションと同じものです。

が@Archegが言うように、私はあなたが MacWire

+0

ありがとう私は同意します。私はモジュールが鍵だと信じています。 DIだけではありません。 Cakeはモジュールを作成し、モジュールは互いに継承することができます。セルフタイプのアノテーションを使用すると、モジュールを関連付けることができます。私はモジュールについて読んでいますが、それに関する非常に興味深い議論があります。 –

関連する問題