問題タブ [clean-architecture]
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.
go - 「Clean Architecture」Go プログラムの汎用 ID タイプ
Uncle Bob Martin の「Clean Architecture」を使用して設計された Go プログラムで、ID の適切なタイプを見つけようとしています。
私は Uncle Bob Martin の「クリーン アーキテクチャ」に従っています。ここでは、コードが一連のレイヤーとして編成されています (外部から:インフラストラクチャ、インターフェイス、ユースケース、およびドメイン)。原則の 1 つは依存関係の規則です。ソース コードの依存関係は内側のみを指すことができます。
私のUser
タイプはドメイン層の一部であるため、ID
タイプは のために選択されたデータベースに依存することはできませんUserRepository
。MongoDB を使用している場合、ID はObjectId
( string
) である可能性がありますが、PostgreSQL では整数を使用する可能性があります。ドメイン層のUser
型は、実装する型が何であるかを知ることができません。
依存性注入により、実際の型 (例: ) がインターフェイスMongoUserRepository
を実装し、メソッドを提供します。これはインターフェイスまたはインフラストラクチャ層で定義されるため、(より内側の) ドメイン層での定義に依存する可能性があります。UserRepository
FindByID
MongoUserRepository
UserRepository
使用を検討しました
ただし、外側の層のいずれかのコードが誤った実装型を割り当てようとすると、コンパイラはあまり役に立ちません。
データベースが指定されているインターフェイス レイヤーまたはインフラストラクチャ レイヤーで特定のタイプを決定して要求したいのですUserID
が、ドメイン レイヤー コードにその情報をインポートさせることはできません。依存関係の規則に違反するからです。
私も検討しました(そして現在使用しています)
ただし、これは、データベースが ID に文字列を使用するという知識を前提としています (私は MongoDB をObjectId
-- の型シノニムで使用していますstring
)。
コンパイラが最大限の型安全性を提供し、依存関係の規則に違反しないようにしながら、慣用的な方法でこの問題を処理するにはどうすればよいですか?
android - アプリがバックグラウンドにあるときにFirebase通知の音を設定するには?
Firebase クラウド メッセージングを使用しているアプリを開発しています。そして、私はクリーンなアーキテクチャを使用しています。FirebaseMessaging クラスはデータ層にあります。そのクラスは次のようになります。
ご覧のとおり、関数 sendNotification は、メッセージがデバイスに届いたときに通知を作成するためのものです。そして、この関数をレイヤーを介してプレゼンテーション レイヤーにプッシュし、通知を行うためのすべてのロジックを実行する必要があります。しかし、関数 sendNotification はリモート メッセージである引数を持っており、ドメイン レイヤーは Google Play サービスをサポートしていないため、ドメイン レイヤーを介してリモート メッセージをプッシュできないため、その方法がわかりません。この関数 sendNotification をプレゼンテーション層にプッシュする方法を知っている人はいますか?
java - クリーンなアーキテクチャとキャッシュの無効化
クリーン アーキテクチャに従おうとするアプリがあり、キャッシュの無効化を行う必要がありますが、どのレイヤーでこれを行うべきかわかりません。
この例のために、と のOrderInteractor
2 つのユース ケースがあるgetOrderHistory()
としsendOrder(Order)
ます。
最初の使用例は を使用してOrderHistoryRepository
おり、2 番目の使用例は を使用していOrderSenderRepository
ます。これらのリポジトリは、複数の実装 (MockOrderHistoryRepository
およびInternetOrderHistoryRepository
最初の実装) とのインターフェイスです。OrderInteractor
実際の実装を隠すために、インターフェイスを介してこれらのリポジトリとのみ対話します。
Mock
バージョンは非常にダミーですが、履歴リポジトリのバージョンInternet
は、パフォーマンスを向上させるために一部のデータをキャッシュに保持しています。
今、私は次のことを実装したいと考えています: 注文が正常に送信されたら、履歴のキャッシュを無効にしたいのですが、実際のキャッシュの無効化をどこで実行する必要があるのか わかりません。
invalidateCache()
私の最初の推測は、 に aを追加し、このメソッドをインタラクター内のメソッドOrderHistoryRepository
の最後で使用することです。sendOrder()
ではInternetOrderHistoryRepository
、キャッシュの無効化を実装するだけで十分です。しかし、私は実際にメソッドを内部に実装することを余儀なくされ、MockOrderHistoryRepository
一部のキャッシュ管理がリポジトリによって実行されているという事実を外部に公開しています。のバージョンのOrderInteractor
実装詳細なので、このキャッシュ管理は意識しなくていいと思います。Internet
OrderHistoryRepository
私の2番目の推測はInternetOrderSenderRepository
、注文が正常に送信されたことを知っているときに内部でキャッシュの無効化を実行することですInternetOrderHistoryRepository
が、キャッシュ管理のためにこのリポジトリで使用されるキャッシュキーを取得するために、このリポジトリに を強制的に認識させます。OrderSenderRepository
そして、私は私のものとの依存関係を持ちたくありませんOrderHistoryRepository
。
最後に、私の 3 番目の推測は、リポジトリがモックされたときに使用される実装と、リポジトリが使用されているときの実装を備えた、ある種のCacheInvalidator
(名前が何であれ) インターフェースを持つことです。これは に注入され、選択された実装は、リポジトリを構築している とによって提供されます。これは、 と を構築している - と と を構築している - を持つことを意味します。しかし、ここでも、これを の最後に使用するか、直接使用するかはわかりません。Dummy
Real
Interactor
Internet
CacheInvalidator
Interactor
Factory
CacheInvalidator
MockedOrderHistoryRepositoryFactory
MockedOrderHistoryRepository
DummyCacheInvalidator
InternetOrderHistoryRepositoryFactory
InternetOrderHistoryRepository
RealCacheInvalidator
CacheInvalidator
Interactor
sendOrder()
InternetOrderSenderRepository
(インタラクターは内部にキャッシュ管理があることをおそらく知らないはずなので、後者の方が優れていると思いますが)。
これを構築するためのあなたの好みの方法は何ですか?
どうもありがとうございました。ピエール
java - Android クリーン アーキテクチャの二重実装
私は Android のクリーン アーキテクチャを学習中です。これを例として使用しています https://github.com/dmilicic/Android-Clean-Boilerplate
コードをよりよく理解するために、いくつかのコードのクラス図を作成しましたが、これは私を襲いました。アーキテクチャの使用方法に関する著者の説明を使用すると、Interactor インターフェイスは「二重」に実装されます。彼は、作成されたすべてのインタラクターは、AbstractInteractor を拡張する必要があり、別のインターフェイスも実装する必要があると述べています (この場合は、Interactor インターフェイスも拡張している WelcomingInteractor.
これは作者側の単なるミスでしょうか。またはこれには正当な理由がありますか?
よろしくモーテン