DDD、六角圢、タマネギ、クリヌン、CQRS ...すべおをどのようにたずめるか





この蚘事は、゜フトりェアアヌキテクチャに関する䞀連の蚘事であるChronicle of Software Architectureの䞀郚です。 それらには、゜フトりェアアヌキテクチャに぀いお孊んだこず、それに぀いおどう思うか、知識をどのように䜿うかに぀いお曞いおいたす。 この蚘事の内容は、シリヌズの以前の蚘事を読んだ方が意味がありたす。



倧孊を卒業埌、高校の教垫ずしお働き始めたしたが、数幎前に蟞めおフルタむムの゜フトりェア開発者に行きたした。



それ以来、「倱われた」時間を回埩し、できるだけ早く、できるだけ早く芋぀ける必芁があるず垞に感じおいたした。 したがっお、私は゜フトりェアの蚭蚈ずアヌキテクチャに特に泚意を払いながら、少し実隓に関䞎し始め、たくさんの読み曞きをしたした。 それが、私が研究に圹立぀ようにこれらの蚘事を曞いおいる理由です。



前回の蚘事では、私が孊んだ倚くの抂念ず原則に぀いお、そしおそれらに぀いおどのように掚論するかに぀いお少し話したした。 しかし、私はそれらを1぀の倧きなパズルの断片ず考えおいたす。



この蚘事では、これらすべおのフラグメントをどのようにたずめるかに぀いお説明したす。 それらに名前を付ける必芁があるようですので、 明瀺的なアヌキテクチャず呌びたす。 さらに、これらの抂念はすべお「戊闘テスト枈み」であり、信頌性の高いプラットフォヌムで実皌働で䜿甚されおいたす。 それらの1぀は、䞖界䞭に数千のオンラむンストアを持぀SaaS eコマヌスプラットフォヌムであり、もう1぀は、2か囜で動䜜し、1か月あたり2,000䞇を超えるメッセヌゞを凊理するメッセヌゞバスを備えた取匕プラットフォヌムです。





システムの基本ブロック



たず、EBIずポヌトずアダプタヌのアヌキテクチャヌを思い出しおみたしょう。 どちらも、アプリケヌションの内郚コヌドず倖郚コヌド、および内郚コヌドず倖郚コヌドを接続するためのアダプタヌを明確に分離しおいたす。



さらに、 PortsAdaptersアヌキテクチャは、システム内の3぀の基本的なコヌドブロックを明瀺的に定矩したす。









アプリケヌションの䞭栞は、考える最も重芁なこずです。 このコヌドにより、システムで実際のアクションを実行できたす。぀たり、これがアプリケヌションです。 耇数のナヌザヌむンタヌフェむスプログレッシブWebアプリケヌション、モバむルアプリケヌション、CLI、APIなどを䜿甚でき、すべおが1぀のコアで実行されたす。



ご想像のずおり、䞀般的な実行フロヌはUIのコヌドからアプリケヌションコアを経由しおむンフラストラクチャコヌドに進み、アプリケヌションコアに戻り、最埌に応答がUIに配信されたす。







ツヌル



最も重芁なカヌネルコヌドずはほど遠い、アプリケヌションが䜿甚するツヌルはただありたす。 たずえば、デヌタベヌス゚ンゞン、怜玢゚ンゞン、Webサヌバヌ、CLIコン゜ヌル埌者2぀は配信メカニズムでもありたす。







CLIコン゜ヌルをDBMSず同じテヌマセクションに配眮するのは、目的が異なるため、奇劙に思えたす。 しかし実際には、䞡方ずもアプリケヌションで䜿甚されるツヌルです。 䞻な違いは、CLIコン゜ヌルずWebサヌバヌがアプリケヌションに䜕かを行うように指瀺するこずです 。逆に、DBMSカヌネルはアプリケヌションからコマンドを受け取りたす 。 これは、これらのツヌルをアプリケヌションコアに接続するコヌドの蚘述方法に倧きく圱響するため、非垞に重芁な違いです。



ツヌルず配信メカニズムをアプリケヌションコアに接続する



ツヌルをアプリケヌションコアに接続するコヌドのブロックは、アダプタヌ ポヌトずアダプタヌアヌキテクチャ ず呌ばれたす。 これらは、ビゞネスロゞックが特定のツヌルず盞互䜜甚するこずを可胜にし、その逆も可胜です。



アプリケヌションに䜕かを行うように指瀺するアダプタヌは、 プラむマリヌたたは制埡アダプタヌず呌ばれ、アプリケヌションが䜕かを行うように指瀺するアダプタヌは、 セカンダリヌたたは管理察象アダプタヌず呌ばれたす。



ポヌト



ただし、これらのアダプタは偶然䜜成されたものではなく、アプリケヌションコアの特定の゚ントリポむントportに察応するためのものです 。 ポヌトは、ツヌルがアプリケヌションコアを䜿甚する方法、たたはその逆の方法の仕様にすぎたせん 。 ほずんどの蚀語および最も単玔な圢匏では、このポヌトはむンタヌフェヌスになりたすが、実際にはいく぀かのむンタヌフェヌスずDTOで構成できたす。



ポヌトむンタヌフェヌスはビゞネスロゞック内にあり、アダプタヌは倖郚にあるこずに泚意するこずが重芁です。 このテンプレヌトが適切に機胜するためには、ツヌルAPIを暡倣するだけでなく、アプリケヌションコアのニヌズに応じおポヌトを䜜成するこずが非垞に重芁です。



プラむマリたたは制埡アダプタヌ



プラむマリたたは制埡アダプタヌはポヌトをラップし、それを䜿甚しおアプリケヌションカヌネルに䜕をするかを指瀺したす。 これらは、配信メカニズムからのすべおのデヌタをアプリケヌションコアのメ゜ッド呌び出しに倉換したす。







぀たり、コントロヌルアダプタヌはコントロヌラヌたたはコン゜ヌルコマンドであり、コントロヌラヌたたはコン゜ヌルコマンドが必芁ずするむンタヌフェむスポヌトを実装するクラスを持぀オブゞェクトを持぀コンストラクタヌに埋め蟌たれたす。



より具䜓的な䟋では、ポヌトは、コントロヌラヌが必芁ずするサヌビスむンタヌフェむスたたはリポゞトリむンタヌフェむスである堎合がありたす。 その埌、サヌビス、リポゞトリ、たたはリク゚ストの特定の実装が実装され、コントロヌラヌで䜿甚されたす。



さらに、ポヌトはコマンドバスたたはク゚リバスむンタヌフェむスにするこずができたす。 この堎合、コマンドたたは芁求バスの特定の実装がコントロヌラヌに入力され、コントロヌラヌはコマンドたたは芁求を䜜成しお、察応するバスに枡したす。



セカンダリたたはマネヌゞアダプタヌ



ポヌトをラップするコントロヌルアダプタヌずは異なり、 マネヌゞアダプタヌはポヌトずむンタヌフェむスを実装し、ポヌトが必芁なアプリケヌションカヌネルに入りたすタむプ付き。







たずえば、デヌタを保存する必芁があるネむティブアプリケヌションがありたす。 デヌタ配列を保存するメ゜ッドず、IDによっおテヌブル内の行を削陀するメ゜ッドを䜿甚しお、氞続性むンタヌフェむスを䜜成したす。 これ以降、アプリケヌションがデヌタを保存たたは削陀する必芁がある堎合は、コンストラクタヌで、定矩した氞続化むンタヌフェむスを実装するオブゞェクトが必芁になりたす。



次に、このむンタヌフェむスを実装するMySQL専甚のアダプタヌを䜜成したす。 配列を保存し、テヌブル内の行を削陀するためのメ゜ッドがあり、氞続化むンタヌフェむスが必芁な堎所にそれを導入したす。



ある時点でデヌタベヌスプロバむダヌを、たずえばPostgreSQLやMongoDBに倉曎する堎合、PostgreSQLに固有の氞続性むンタヌフェむスを実装する新しいアダプタヌを䜜成し、叀いアダプタヌの代わりに新しいアダプタヌを導入するだけです。



反転を制埡する



このテンプレヌトの特城的な機胜は、アダプタヌが特定のツヌルず特定のポヌトに䟝存するこずですむンタヌフェヌスを実装するこずにより。 ただし、ビゞネスロゞックは、ビゞネスロゞックのニヌズを満たすように蚭蚈されたポヌトむンタヌフェむスのみに䟝存し、特定のアダプタヌやツヌルに䟝存したせん。







これは、䟝存関係が䞭心に向けられおいるこずを意味したす 。 ぀たり、アヌキテクチャレベルでの制埡原理の反転がありたす 。



ただし、 ツヌルAPIを暡倣するだけでなく、アプリケヌションコアのニヌズに応じおポヌトを䜜成するこずが䞍可欠です 。



アプリケヌションコアの構成



Onionアヌキテクチャは、DDDレむダヌを遞択し、それらをポヌトおよびアダプタヌアヌキテクチャに組み蟌みたす。 これらのレベルは、ポヌトずアダプタヌの「六角圢」の内郚であるビゞネスロゞックに䜕らかの秩序をもたらすように蚭蚈されおいたす。 前ず同様に、䟝存関係の方向は䞭心に向かっおいたす。



アプリケヌションレベルアプリケヌションレベル



ナヌスケヌスは、1぀以䞊のナヌザヌむンタヌフェむスによっおカヌネルで実行できるプロセスです。 たずえば、CMSには、通垞のナヌザヌ甚の1぀のUI、CMS管理者甚の別の独立したUI、別のCLIおよびWeb APIがありたす。 これらのUIアプリケヌションは、固有たたは䞀般的なナヌスケヌスをトリガヌできたす。



ナヌスケヌスは、アプリケヌションレベルDDDの最初のレベルずOnionアヌキテクチャで定矩されたす。







このレむダヌには、アプリケヌションサヌビスおよびそのむンタヌフェむスがファヌストクラスオブゞェクトずしお含たれ、ORMむンタヌフェむス、怜玢゚ンゞンむンタヌフェむス、メッセヌゞングむンタヌフェむスなどを含むポヌトおよびアダプタヌポヌトも含たれたす。このレベルでのコマンドバスおよび/たたはリク゚ストバスは、察応するコマンドおよびリク゚ストハンドラです。



アプリケヌションサヌビスやコマンドハンドラには、ナヌスケヌス、ビゞネスプロセスのデプロむメントロゞックが含たれおいたす。 原則ずしお、それらの圹割は次のずおりです。



  1. リポゞトリを䜿甚しお、1぀以䞊の゚ンティティを怜玢したす。
  2. これらの゚ンティティにドメむンロゞックの実行を䟝頌したす。
  3. ストレヌゞを䜿甚しお゚ンティティを再保存し、デヌタの倉曎を効果的に保存したす。


コマンドハンドラは、次の2぀の方法で䜿甚できたす。



  1. ナヌスケヌスを実行するためのロゞックを含めるこずができたす。
  2. これらは、コマンドを受信し、アプリケヌションサヌビスに存圚するロゞックを単玔に呌び出す、アヌキテクチャの接続の単玔な郚分ずしお䜿甚できたす。


どのアプロヌチを䜿甚するかは、コンテキストによっお異なりたす。たずえば、次のずおりです。





このレむダヌには、ナヌスケヌスの結果であるアプリケヌションむベントの開始も含たれたす。 これらのむベントは、電子メヌルの送信、サヌドパヌティAPIぞの通知、プッシュ通知の送信、アプリケヌションの別のコンポヌネントに属する別のナヌスケヌスの起動など、ナヌスケヌスの副䜜甚であるロゞックをトリガヌしたす。



ドメむンレベル



さらに内郚にはドメむンレベルがありたす。 このレベルのオブゞェクトには、このデヌタを管理するためのデヌタずロゞックが含たれおいたす。これらはドメむン自䜓に固有であり、このロゞックをトリガヌするビゞネスプロセスずは無関係です。 これらは独立しおおり、アプリケヌションレベルを完党に認識しおいたせん。







ドメむンサヌビス



前述したように、アプリケヌションサヌビスの圹割は次のずおりです。



  1. リポゞトリを䜿甚しお、1぀以䞊の゚ンティティを怜玢したす。
  2. これらの゚ンティティにドメむンロゞックの実行を䟝頌したす。
  3. ストレヌゞを䜿甚しお゚ンティティを再保存し、デヌタの倉曎を効果的に保存したす。


しかし、同じたたは異なるタむプのさたざたな゚ンティティを含むいく぀かのドメむンロゞックに出くわすこずがありたす。このドメむンロゞックぱンティティ自䜓には属したせん。぀たり、ロゞックは盎接的な責任ではありたせん。



したがっお、最初の反応は、アプリケヌションサヌビスの゚ンティティの倖郚にこのロゞックを配眮するこずです。 ただし、これは、他の堎合にはドメむンロゞックが再利甚されないこずを意味したす。ドメむンロゞックはアプリケヌションレベルの倖偎に留たる必芁がありたす。



解決策は、ドメむンサヌビスを䜜成するこずです。その圹割は、䞀連の゚ンティティを取埗し、それらに察しおいく぀かのビゞネスロゞックを実行するこずです。 ドメむンサヌビスはドメむンレベルに属しおいるため、アプリケヌションサヌビスやリポゞトリなど、アプリケヌションレベルのクラスに぀いおは䜕も知りたせん。 䞀方、他のドメむンサヌビスず、もちろんドメむンモデルオブゞェクトを䜿甚できたす。



ドメむンモデル



たさにその䞭心にあるのがドメむンモデルです。 この円の倖偎には䟝存せず、ドメむン内の䜕かを衚すビゞネスオブゞェクトが含たれおいたす。 そのようなオブゞェクトの䟋は、たず、゚ンティティ、倀オブゞェクト、列挙、およびドメむンモデルで䜿甚されるオブゞェクトです。



ドメむンむベントは、ドメむンモデルにも存圚したす。 特定のデヌタセットが倉曎されるず、これらのむベントがトリガヌされ、倉曎されたプロパティの新しい倀が含たれたす。 これらのむベントは、たずえば、むベント゜ヌシングモゞュヌルでの䜿甚に最適です。



コンポヌネント



これたでのずころ、レむダヌでコヌドを分離したしたが、これはあたりにも詳现なコヌド分離です。 同様に、より䞀般的な倖芳で写真を芋るこずが重芁です。 私たちは、ロバヌト・マヌティンが叫ぶアヌキテクチャで衚珟されたアむデアに埓っお、コヌドをサブドメむンず関連コンテキストに分割するこずに぀いお話しおいる[぀たり、アヌキテクチャは、䜿甚するフレヌムワヌクに぀いおではなく、アプリケヌション自䜓に぀いお「叫ぶ」べきです。 トランス。]。 レむダヌではなく、機胜たたはコンポヌネントごずにパッケヌゞを敎理するこずに぀いお話したす。SimonBrownは、ブログの蚘事「コンポヌネントパッケヌゞずアヌキテクチャのテスト」でそれを非垞によく説明しおいたす 。







私はコンポヌネントパッケヌゞを敎理するこずを支持しおおり、Simon Brownの図を次のように恥知らずに倉曎したいず考えおいたす。







コヌドのこれらのセクションは、前述のすべおのレむダヌを暪断するものであり、これらはアプリケヌションのコンポヌネントです。 コンポヌネントの䟋は、請求、ナヌザヌ、確認、たたはアカりントですが、それらは垞にドメむンに関連付けられおいたす。 蚱可や認蚌などの制限されたコンテキストは、アダプタヌを䜜成しおポヌトの埌ろに隠す倖郚ツヌルず芋なされる必芁がありたす。







コンポヌネントの切断



现かいコヌド単䜍クラス、むンタヌフェむス、特性、ミックスむンなどの堎合ず同様に、倧きな単䜍コンポヌネントは匱い結合ず緊密な接続の恩恵を受けたす。



クラスを分離するには、クラス内で䟝存関係を䜜成するのではなく、クラスに䟝存関係を導入し、特定のクラスの代わりに抜象化むンタヌフェむスおよび/たたは抜象クラスに䟝存するように䟝存関係を反転させたす。 これは、䟝存クラスが䜿甚する特定のクラスに぀いお䜕も知らず、䟝存するクラスのフルネヌムぞの参照を持たないこずを意味したす。



同様に、完党に切断されたコンポヌネントでは、各コンポヌネントは他のコンポヌネントに぀いお䜕も知りたせん。 蚀い換えるず、他のコンポヌネントからの现かなコヌドブロック、さらにはむンタヌフェむスぞのリンクはありたせん これは、䟝存関係の泚入ず䟝存関係の反転だけではコンポヌネントを分離するのに十分ではないこずを意味し、䜕らかのアヌキテクチャの構築が必芁になりたす。 むベント、共通コア、結果敎合性、さらにはディスカバリヌサヌビスが必芁になる堎合がありたす。







他のコンポヌネントのトリガヌロゞック



コンポヌネントコンポヌネントBの1぀が別のコンポヌネントコンポヌネントAで䜕か他のこずが起こるたびに䜕かをする必芁がある堎合、コンポヌネントAからコンポヌネントBのクラス/メ゜ッドぞの盎接呌び出しを行うこずはできたせん。その埌、AはBに関連付けられたす。



ただし、むベントマネヌゞャヌを䜿甚しおアプリケヌションむベントをディスパッチできたす。アプリケヌションむベントは、Bを含むそれをリッスンするすべおのコンポヌネントに配信され、Bのむベントリスナヌが目的のアクションをトリガヌしたす。 ぀たり、コンポヌネントAはむベントマネヌゞャヌに䟝存したすが、コンポヌネントBずは別のものになりたす。



それでも、むベント自䜓がAで「生きおいる」堎合、これはBがAの存圚を認識し、それに関連付けられおいるこずを意味したす。 この䟝存関係を削陀するために、すべおのコンポヌネントで共有されるアプリケヌションコアの機胜セット 共通コアを備えたラむブラリを䜜成できたす。 これは、䞡方のコンポヌネントが共通のコアに䟝存するが、互いに分離されるこずを意味したす。 共通のコアには、アプリケヌションむベントやドメむンむベントなどの機胜が含たれおいたすが、仕様オブゞェクトや共有する意味のあるものを含めるこずもできたす。 同時に、共通カヌネルの倉曎はすべおのアプリケヌションコンポヌネントに圱響するため、最小サむズにする必芁がありたす。 さらに、倚蚀語システム、たずえば異なる蚀語のマむクロサヌビスの゚コシステムがある堎合、すべおのコンポヌネントが理解できるように、共通のコアは蚀語に䟝存するべきではありたせん。 たずえば、むベントクラスを持぀䞀般的なカヌネルの代わりに、すべおのコンポヌネント/マむクロサヌビスがそれを解釈できるように、JSONのような汎甚蚀語でむベントの説明぀たり、名前、プロパティ、おそらくメ゜ッドでさえも、仕様オブゞェクトではより䟿利ですがが含たれたすおそらく、独自の実装を自動的に生成するこずもありたす。



このアプロヌチは、マむクロサヌビス゚コシステムなどのモノリシックアプリケヌションず分散アプリケヌションの䞡方で機胜したす。 ただし、むベントを非同期でのみ配信できる堎合、このアプロヌチは、他のコンポヌネントのトリガヌロゞックがすぐに動䜜するコンテキストでは䞍十分です ここで、コンポヌネントAはコンポヌネントBに盎接HTTP呌び出しを行う必芁がありたす。この堎合、コンポヌネントを切断するには、ディスカバリサヌビスが必芁です。 コンポヌネントAは、垌望するアクションを開始するためのリク゚ストの送信先を圌女に尋ねたす。 たたは、ディスカバリサヌビスに芁求を行いたす。ディスカバリサヌビスは、それを適切なサヌビスに転送し、最終的に芁求者に応答を返したす。 このアプロヌチでは、コンポヌネントをディスカバリサヌビスに関連付けたすが、コンポヌネントを盞互に関連付けたせん。



他のコンポヌネントからデヌタを取埗する



ご芧のずおり、コンポヌネントは「所有」しおいないデヌタを倉曎するこずはできたせんが、デヌタを芁求しお䜿甚するこずはできたす。



コンポヌネントの共有デヌタストレヌゞ



コンポヌネントが別のコンポヌネントに属するデヌタを䜿甚する必芁がある堎合たずえば、課金コンポヌネントがアカりントコンポヌネントに属するクラむアントの名前を䜿甚する必芁がある堎合、デヌタストレヌゞぞのリク゚ストオブゞェクトが含たれたす。 ぀たり、課金コンポヌネントは任意のデヌタセットを認識できたすが、他の囜からの読み取り専甚デヌタを䜿甚する必芁がありたす。



コンポヌネントの個別のデヌタストレヌゞ



この堎合、同じテンプレヌトが適甚されたすが、デヌタストレヌゞレベルはより耇雑になりたす。 独自のデヌタりェアハりスを備えたコンポヌネントが存圚するずいうこずは、各デヌタりェアハりスに以䞋が含たれるこずを意味したす。





各コンポヌネントは、他のコンポヌネントから必芁なデヌタのロヌカルコピヌを䜜成し、必芁に応じお䜿甚したす。 所属するコンポヌネントでデヌタが倉曎されるず、この所有者コンポヌネントは、デヌタの倉曎を䌝達するドメむンむベントをトリガヌしたす。 このデヌタのコピヌを含むコンポヌネントは、このドメむンむベントをリッスンし、それに応じおロヌカルコピヌを曎新したす。



制埡フロヌ



䞊で述べたように、制埡フロヌはナヌザヌからアプリケヌションコア、むンフラストラクチャツヌル、そしお再びアプリケヌションコア、そしおナヌザヌに戻りたす。 しかし、クラスはどのように連携したすか 誰が誰に䟝存しおいたすか それらをどのように構成したすか



ボブおじさんのように、クリヌンアヌキテクチャに関する私の蚘事では、UMLishスキヌマ管理の流れを説明しようずしたす...



コマンド/リク゚ストバスなし



コマンドバスを䜿甚しない堎合、コントロヌラヌはアプリケヌションサヌビスたたはク゚リオブゞェクトに䟝存したす。



[2017/11/18远補]リク゚ストからデヌタを返すために䜿甚するDTOを完党に芋萜ずしおいたため、ここで远加したした。 MorphineAdministeredに感謝したす。これはスペヌスを瀺しおいたす。



䞊の図では、アプリケヌションサヌビスのむンタヌフェむスを䜿甚しおいたすが、アプリケヌションサヌビスはアプリケヌションコヌドの䞀郚であるため、実際には必芁ではないず蚀えたす。 ただし、完党なリファクタリングを行うこずはできたすが、実装を倉曎するこずは望みたせん。



Queryオブゞェクトには、ナヌザヌに衚瀺される生デヌタを返すだけの最適化されたク゚リが含たれおいたす。 このデヌタは、ViewModelに組み蟌たれおいるDTOに返されたす。 このViewModelには、䜕らかの皮類のビュヌロゞックが含たれおいる堎合があり、ビュヌの䜜成に䜿甚されたす。



䞀方、アプリケヌションサヌビスには、デヌタを衚瀺するだけでなく、システム䞊で䜕かを実行したいずきに起動するナヌスケヌスロゞックが含たれおいたす。 アプリケヌションサヌビスは、開始する必芁のあるロゞックを含む゚ンティティを返すリポゞトリに䟝存したす。 たた、耇数の゚ンティティ間でドメむンプロセスを調敎するためにドメむンサヌビスに䟝存する堎合がありたすが、これはたれなケヌスです。



ナヌスケヌスの解析埌、アプリケヌションサヌビスは、ナヌスケヌスが発生したこずをシステム党䜓に通知できたす。その埌、むベントをトリガヌするのはむベントディスパッチャヌに䟝存したす。



持続性゚ンゞンずリポゞトリの䞡方でむンタヌフェヌスをホストしおいるこずに泚意するのは興味深いこずです。 これは冗長に芋えるかもしれたせんが、それらは異なる目的を果たしたす





コマンド/リク゚ストバス付き



アプリケヌションがコマンド/リク゚ストバスを䜿甚しおいる堎合、コントロヌラヌはコマンドやリク゚ストだけでなくバスにも䟝存するこずを陀いお、図はほが同じたたです。 ここで、コマンドたたはリク゚ストのむンスタンスが䜜成され、バスに枡されたす。バスは、コマンドを受信および凊理するための適切なハンドラヌを芋぀けたす。



次の図では、コマンドハンドラヌはアプリケヌションサヌビスを䜿甚しおいたす。 ただし、ほずんどの堎合、ハンドラヌにはナヌスケヌスのすべおのロゞックが含たれるため、これは必ずしも必芁ではありたせん。 別のハンドラヌで同じロゞックを再利甚する必芁がある堎合は、ハンドラヌからロゞックを別のアプリケヌションサヌビスに抜出するだけです。



[2017/11/18远補]リク゚ストからデヌタを返すために䜿甚するDTOを完党に芋萜ずしおいたため、ここで远加したした。 MorphineAdministeredに感謝したす。これはスペヌスを瀺しおいたす。



バス、コマンド、リク゚スト、ハンドラヌの間に䟝存関係がないこずに気づいたかもしれたせん。 事実、圌らは適切な分離を確保するためにお互いに぀いお知る必芁はありたせん。 コマンドたたはリク゚ストを凊理するための特定のハンドラヌにバスを誘導する方法は、単玔な構成で構成されたす。



どちらの堎合も、すべおの矢印アプリケヌションカヌネルの境界を越える䟝存関係は内偎を指したす。 前に説明したように、これはPortsAdaptersアヌキテクチャ、Onionアヌキテクチャ、およびCleanアヌキテクチャの基本的なルヌルです。







おわりに



い぀ものように、目暙は、接続性の高い切断されたコヌドベヌスを取埗するこずです。この堎合、倉曎を簡単、迅速、安党に行うこずができたす。



蚈画は無意味ですが、蚈画がすべおです。 - アむれンハワヌ


このむンフォグラフィックはコンセプトマップです。 これらの抂念をすべお理解しお理解するこずは、健党なアヌキテクチャず実行可胜なアプリケヌションを蚈画するのに圹立ちたす。



ただし



地図は領土ではありたせん。 - アルフレッド・コルゞブスキヌ


蚀い換えれば、 これらは単なる掚奚事項です アプリケヌションは、私たちの知識を適甚する必芁がある領域、珟実、特定のナヌスケヌスであり、実際のアヌキテクチャがどのように芋えるかを決定したす



これらすべおのパタヌンを理解する必芁がありたすが、アプリケヌションが正確に必芁ずするもの、分離ず接続性のためにどこたで行けるかを垞に考えお理解する必芁がありたす。 この決定は、プロゞェクトの機胜芁件から、アプリケヌション開発のタむミング、その耐甚幎数、開発チヌムの経隓など、倚くの芁因に䟝存したす。



それが、私自身がこのすべおを想像する方法です。



これらのアむデアに぀いおは、次の蚘事で詳しく説明したす。 「同心円状のレむダヌ以䞊のもの 。 」



All Articles