私にとっては、カップリングの問題であり、設計の粒度に関連しています。結合の最も緩い形式でさえ、あるものから別のものへの依存関係を導入します。それが数百から数千のオブジェクトに対して行われた場合、それらがすべて比較的単純であっても、SRPに準拠し、すべての依存関係が安定した抽象化に向かって流れる場合でも、相互に関連する全体として推論するのが非常に困難なコードベースを生成します。
コードベースの複雑さを測定するのに役立つ実用的なものがありますが、理論上のSEではあまり議論されていません。たとえば、最後に到達する前にコールスタックをどれだけ深くすることができるか、非常に自信を持って、例外の場合を含め、コールスタックのそのレベルで発生する可能性のあるすべての副作用を理解します。
そして、私の経験では、より浅いコールスタックを備えたよりフラットなシステムは、推論するのが非常に簡単である傾向があることがわかりました。極端な例は、コンポーネントが単なる生データであるエンティティコンポーネントシステムです。システムにのみ機能があり、ECSを実装および使用する過程で、数十万行のコードにまたがる複雑なコードベースが基本的に数十のシステムに沸騰することを推論するのは、これまでで最も簡単なシステムであることがわかりましたすべての機能が含まれています。
機能を提供するものが多すぎる
以前のコードベースで働いていたときの代替は、数百から数千のほとんど小さなオブジェクトを持つシステムでしたが、いくつかのオブジェクトが1つのオブジェクトから別のMessage
オブジェクト(たとえば、独自の公開インターフェース)。これは基本的に、コンポーネントに機能があり、エンティティ内のコンポーネントの一意の組み合わせがそれぞれ独自のオブジェクトタイプを生成するポイントにECSを戻すときに類推されます。そして、それは、小さなアイデアをモデル化するオブジェクトの無限の組み合わせ(Particle
オブジェクトvs.Physics System
、例えば)。ただし、相互依存関係の複雑なグラフが生成される傾向があり、コードベースには実際に何かを行うことができるために何か間違ったことをすることができるため、広範なレベルから何が起こるかを推論するのが難しくなります- -「データ」タイプではなく、関連する機能を持つ「オブジェクト」タイプのタイプ。機能が関連付けられていない純粋なデータとして機能する型は、独自に何もできないため、間違いを起こすことはありません。
純粋なインターフェースは、この理解の問題をそれほど助けません。それにより、「コンパイル時の依存関係」がより複雑にならず、変更や拡張のためのより大きな空間を提供しても、「実行時の依存関係」と相互作用がそれほど複雑にならないためです。クライアントオブジェクトは、それらが呼び出されている場合でも、具象アカウントオブジェクトの関数を呼び出すことになりますIAccount
。ポリモーフィズムと抽象インターフェースには用途がありますが、特定の時点で発生する可能性のあるすべての副作用について推論するのに本当に役立つ方法で物事を分離することはありません。このタイプの効果的な分離を実現するには、機能を含むものがはるかに少ないコードベースが必要です。
より多くのデータ、より少ない機能
ECSアプローチは、たとえ完全に適用しなくても、非常に役立つものであることがわかりました。何百ものオブジェクトになっていたものを、粗く設計された粗いシステムですべての生データに変換するためです。機能。これにより、「データ」タイプの数が最大化され、「オブジェクト」タイプの数が最小化されるため、システム内で実際に問題が発生する可能性のある場所の数が絶対に最小化されます。最終結果は、依存関係の複雑なグラフを持たない非常に「フラットな」システムであり、コンポーネントからシステムへのシステムのみであり、その逆も決してなく、他のコンポーネントへのコンポーネントもありません。基本的に、生データがはるかに多く、抽象化がはるかに少ないため、コードベースの機能を主要な領域、主要な抽象化に集中化およびフラット化する効果があります。
30の単純なものは、複雑なものが独立している間にそれらの30の単純なものが相互に関連している場合、必ずしも1つのより複雑なものよりも推論するのが単純ではありません。したがって、私の提案は、実際には、オブジェクト間の相互作用から複雑さを移し、質量分離を達成するために他のものと相互作用する必要のないより大きなオブジェクトに、「システム」全体(モノリスや神オブジェクトではなく、 200個のメソッドを持つクラスではなく、a Message
またはa よりもかなり高いレベルのParticle
、最小限のインターフェイスを備えています)。そして、より単純な古いデータ型を支持します。それらに依存するほど、カップリングは少なくなります。それがいくつかのSEのアイデアと矛盾する場合でも、私はそれが本当に多くの助けになることがわかりました。