問題タブ [cake-pattern]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - Scala Cake パターンと自己型アノテーション
私はこのブログの例に従おうとしています。例は理解できますが、実装に問題があります。
この例では、完全なデータベース機能が EmailService から隠されることに言及しています。これは私が求めているものですが、これらの特性を正しく実装する方法がわかりません。
これは私が実装しようとしたものです:
MongoDatabase トレイトが実装を要求しなかったため、私には奇妙にfind
見えます。ここで何が欠けていますか?EmailService
find
EmailService
あなたのコメントを読んだ後、私が実際にやろうとしていることにより近い例で、理解しようとしていることを実装しようとしています。
最初のスニペットはコンパイルされませんが、2 番目のスニペットはコンパイルされます... 結局のところ、Repository
依存しているデータベースを切り替えることができるさまざまな実装が必要です。
scala - フィールドの問題をオーバーライドするScalaの自己型エイリアス名
自己型エイリアス名が拡張クラス フィールドを「オーバーライド」し、コンパイラがそれを示さない場合に問題が発生しました。
akka アクターを使用した私のシナリオ:
self
エイリアス名を使用する場合。MyActor
から他のアクターにメッセージを送信すると、送信者は になりdeadLetters
ます。代わりに別のエイリアスを使用すると、self
正常に動作します。
!
メソッドは暗黙的に Actor クラスの self フィールドを取得する必要があると思いますが、エイリアスによって隠されていますself
。
私の意見では、クラスを拡張する場合に自己型エイリアス名を使用するのは危険です。
私の質問: なぜコンパイラは重複したエイリアス/フィールド名について通知しないのですか? または、この問題をどのように処理しますか?
scala - Scala Cake パターン: 依存関係の衝突を回避するには?
私の質問はScala Cake Pattern と Dependency Collisionsに非常に似ています。しかし、ダニエル C の回答で提案されているように、具体的な解決策を見つけるのに苦労しています。
だからここに問題があります:
A ProductDetailsPage
(特性) には、2 つの独立したサービス モジュールProductServiceModule
およびが必要で、それぞれ およびSessionModule
によって実装されます。ProductServiceModuleWs
SessionModuleWs
両方のモジュールは に依存していRestServiceConfigurationProvider
ます。
このRestServiceConfigurationProvider
の場合、使用可能な具体的な実装は 1 つだけです: DefaultRestServiceConfigurationProvider
(atm)。
一方、は、どちらが aまたは aであるかDefaultRestServiceConfigurationProvider
によって異なります。RestEndpointProvider
HybrisEndpointProvider
ProductServiceEndpointProvider
つまり、リモート RESTful Web サービスに接続しますProductServiceModuleWs
。SessionModuleWs
特定のサービスの正確な IP アドレスは、RestEndpointProvider の実装によって提供されます。
さて、ここで衝突が発生します。以下のコードを試してみてください。依存関係の衝突が発生する厄介な場所はコメントでマークされています。
RestEndpointProvider
当然のことながら、コンパイラは の 2 つの競合する実装、つまりHybrisEndpointProvider
とについて不平を言います。ProductServiceEndpointProvider
ダニエルが彼の答えで述べたように、そのような衝突を避けるために、それぞれ独自の具体的な RestEndpointProvider 実装を使用して、ProductServiceModuleWs
と を別々に配線する必要があります。SessionModuleWs
しかし、ここで行き詰まりました。
ProductDetailsPage
これらの 2 つの個別に構成されたモジュールを、依存関係の衝突を回避しながらケーキ パターンを利用しながら、どのように挿入することができるでしょうか?
これがサンプルコードです。コードは自己完結型であり、IDE で実行する必要があります。
scala - Play フレームワークが提供するコンポーネントにケーキパターンベースの DI を使用することはできますか?
Cake パターンを使用した DI に関連する投稿をいくつか見ました。
そのうちの 1 つはhttp://jonasboner.com/real-world-scala-dependency-injection-di/で、同僚の 1 人が共有しています。
しかし、Play 2.5 の WSClient などを使用する必要がある場合、偽装せずにこれを手に入れることはできますか?
scala - Cake パターンでカプセル化を強制する方法
私は Scala の Cake パターンについて少し読んでいました (それが古いものであることは知っています)。具体的なクラスをロックダウンする方法を見たり想像したりできないため、依存関係が注入されたクラスから漏れることはありません。 .
シンプルで最新の例は、play-reactive-mongo-dbアクティベーター テンプレートからのものです。そのアプリでは、コントローラーはReactiveMongoComponents
トレイトを使用して driver のインスタンスを取得しますReactiveMongoApi
。
ここでの問題は、コントローラーの継承がインスタンスを返すパブリック メソッドを持っていることでreactiveMongoApi
あり、カプセル化と情報隠蔽という 2 つの基本原則を破っています。この例が良くないことはわかっていますが (コントローラーはデータ ストアにアクセスしてはならないため)、ドメイン サービスやリポジトリが存在する場合にも同じことが当てはまります。これらのクラス (ドメイン サービス、リポジトリなど) には、アクセス可能なメソッドを定義する特性があり、依存関係を取得するためのパブリック メソッド/属性がないことはわかっていますが、具体的な実装はリークします。
TL;DR: Cake パターンは具体的な実装から依存関係をリークします。これを回避するにはどうすればよいですか?
spring - Scala のオブジェクト コレクターのような Spring フレームワークと Java
Spring フレームワークと Java の世界では、私が使用する興味深いオブジェクト コレクター パターンがあります。たとえば、以下を検討してください-
これで、Spring DI を使用して別のクラスに簡単に注入できます
今の問題は、同じことをscalaでどのように達成できるかわかりません。私はいくつかの検索を行って、scala で使用されているケーキ パターン ( http://loicdescotte.github.io/posts/scala-di/ ) を見つけましたが、上記のようなオブジェクト コレクターと同じことを達成していないようです。また、ケーキパターンで違反されると思われるオープンクローズの原則に従いたいのですが、オブジェクトコレクターを使用すると簡単に達成できます。
scala での実装のように同じオブジェクト コレクターを実現する方法はありますか?
scala - Scala - 直接継承されたクラスまでのアクセス可能なメンバー
Cake パターンを使用して、直接継承されたトレイトのみがアクセスできるメンバーを設定できます
access modifier
ではなくを使用して、このメンバーアクセスロジックを適用したいself annotation
例えば、
解決策はありますか?
scala - Cakeパターンの別のコンポジションで依存オブジェクトを再利用する方法
以下のような2つのサービスクラスがあります...
ユーザーサービス:
グループサービス:
グループの所有者が有効なユーザーであるかどうかを検証しているだけです。そのために、ハードコーディングされた Dao 実装、つまり UserMySqlDao で userService.read メソッドを再利用しました。
ここで私の質問は、ハードコードされた Dao Impl を提供する代わりに、グループサービスの dao オブジェクトをどのように使用できるかということです。UserService と GroupService のタイプが同じであるためです。
私は以下を使用してみました
しかし、これは失敗しました。私はscalaが初めてなので、なぜこれが失敗したのかよくわかりません。これが合法ではない理由を誰かが明らかにしてくれると助かります。
前もって感謝します :)