あるものが他の物と変わらない場合、他の物とどれだけ密接に結びついているかは関係ありません。可能な限りゆるい形のカップリングを達成しようとすることで変更を容易にするよりも、変化する理由を少なくして安定性を追求することに焦点を当てることが、長年にわたって一般的に生産的であることがわかりました。
デカップリングパッケージをデカップリングするために控えめなコードの複製を好むことがあるほど、非常に有用であることがわかりました。基本的な例として、数学ライブラリを使用して画像ライブラリを実装することを選択しました。コピーするのは簡単だったいくつかの基本的な数学関数を複製しませんでした。
これで、私の画像ライブラリは数学ライブラリから完全に独立しているため、数学ライブラリにどのような変更を加えても、画像ライブラリには影響しません。それは何よりもまず安定性を置いています。イメージライブラリは、変更できる他のライブラリから切り離されているため(変更することを期待するC標準ライブラリを除く)、変更する理由が大幅に少なくなったため、より安定しています。おまけとして、それを構築して使用するために他のライブラリの束を引っ張る必要のない単なるスタンドアロンのライブラリである場合にも簡単に展開できます。
安定性は私にとって非常に役立ちます。十分にテストされたコードのコレクションを作成するのが好きです。これは、将来変更される理由がますます少なくなっています。それは単なる夢ではありません。80年代後半からずっと使用し続けているCコードがありますが、それ以降はまったく変更されていません。ピクセル指向やジオメトリ関連のコードのような明らかに低レベルなものですが、私の高レベルなものの多くは時代遅れになりましたが、それでも多くのことを助けてくれるものです。これは、外部にまったく何もない場合でも、ほとんど常に依存するライブラリが少なくなることを意味します。変更する理由がほとんどない、またはまったくない安定した基盤にソフトウェアがますます依存するようになると、信頼性は向上します。実際には可動部品の数が安定部品よりもはるかに多い場合でも、可動部品の数は少ないほうがいいです。
疎結合は同じ流れですが、疎結合は結合なしよりもはるかに安定性が低いことがよくあります。あなたが私がこれまで働いていたよりも心を変えない、はるかに優れたインターフェースデザイナーとクライアントとチームで働いているのでない限り、純粋なインターフェースでさえ、コード全体で連鎖的な破損を引き起こす方法で変更する理由をしばしば見つけます。依存関係を具体的ではなく抽象的に向けることで安定性を実現できるというこの考え方は、インターフェースの設計が実装よりも最初の段階でより適切になりやすい場合にのみ役立ちます。開発者が素晴らしいとはいえないにしても、彼らが満たすべき設計要件を考慮して、非常に優れた実装を作成したかもしれませんが、将来は設計要件が完全に変更されることを見つけるために、しばしば逆になります。
安定性と完全なデカップリングを好むので、少なくとも自信を持って言えるようになりました。 」どんな種類のデザイン変更が外部で要求されようとも、それは正気の小さな断片を私に与えます。
結合と安定性、ECSの例
エンティティコンポーネントシステムも大好きです。システムとコンポーネントの依存関係はすべて、生データに直接アクセスして操作するため、次のように、多くの密結合を導入します。
コンポーネントは生データを公開するだけなので、ここのすべての依存関係は非常に厳密です。依存関係は抽象化に向かって流れているのではなく、生データに向かって流れています。つまり、各システムは、アクセスを要求するコンポーネントの各タイプについて最大限の知識を持っています。コンポーネントには、すべてのシステムが生データにアクセスして改ざんする機能はありません。ただし、このようなシステムは非常にフラットであるため、推論するのは非常に簡単です。テクスチャがねじれた場合、レンダリングとペイントシステムのみがテクスチャコンポーネントにアクセスすることがこのシステムですぐにわかります。また、概念からテクスチャのみを読み取るため、レンダリングシステムをすぐに除外できます。
一方、疎結合の代替案はこれかもしれません:
...すべての依存関係がデータではなく抽象関数に向かって流れ、そのダイアグラムのすべての要素がパブリックインターフェイスと独自の機能を公開しています。ここでは、すべての依存関係が非常に緩やかな場合があります。オブジェクトは相互に直接依存することさえなく、純粋なインターフェースを介して相互に作用することさえあります。それでも、特に複雑な相互作用の複雑さを考えると、何かがうまくいかない場合、このシステムについて推論することは非常に困難です。また、エンティティは、互いの抽象的なパブリックインターフェイスのみを知っている場合でも、集約するコンポーネントについて知る必要があるため、ECSよりも多くの相互作用(疎結合ではあるものの、より多くの結合)があります。
また、何かに設計変更がある場合、ECSよりも多くのカスケード破損が発生します。また、通常、設計変更の理由と誘惑は多くあります。すべてのものが、優れたオブジェクト指向のインターフェースと抽象化を提供しようとしているためです。それはすぐに、ひとつひとつの小さなものが設計に制約と制限を課そうとし、それらの制約が多くの場合設計変更を正当化するものであるという考えに付随しています。機能性ははるかに制約されており、生データよりもはるかに多くの設計上の仮定を行う必要があります。
上記のタイプの「フラット」ECSシステムは、実際には、ゆるい依存関係の複雑なクモの巣を持つ最も疎結合のシステムよりもはるかに推論が容易であることがわかりました。システムが機能するために必要な適切なデータを提供することを除いて、依存するコンポーネントは一切の責任を持たないため、ECSバージョンが既存のコンポーネントを変更する必要があります。純粋なIMotion
インターフェイスと、洗練された機能を提供するインターフェイスを実装する具体的なモーションオブジェクトの設計の難しさと、プライベートデータに対する不変式を維持しようとする問題と、問題の解決に関連する生データのみを提供し、気にしないモーションコンポーネントを比較機能。
機能はデータよりも適切に取得するのがはるかに難しいため、依存関係のフローをデータに向けることが望ましいと考えることが多いのはそのためです。結局のところ、ベクター/マトリックスライブラリはいくつありますか?それらのうち、まったく同じデータ表現を使用し、機能がわずかに異なるものはどれくらいありますか?数え切れないほど多くの機能がありますが、機能が微妙に異なるため、同一のデータ表現にもかかわらず多くの機能があります。画像ライブラリはいくつありますか?それらのうちどれだけが異なるユニークな方法でピクセルを表しますか?ほとんどありませんが、機能が多くのシナリオのデータよりもはるかに不安定で、設計が変更されやすいことを示しています。もちろん、ある時点で機能が必要になりますが、依存関係の大部分がデータに流れるシステムを設計できます。一般的な抽象化や機能性ではありません。これは、カップリングよりも安定性を優先します。
私がこれまでに書いた中で最も安定した関数(80年代後半からまったく使用せずに使用および再利用してきた種類)はすべて、生データに依存するすべての関数でした。複雑な依存山車と整数、ないものMesh
オブジェクトまたはIMesh
インタフェース、あるいはベクトル/行列の乗算だけに依存しているfloat[]
かdouble[]
に依存していない1、 FancyMatrixObjectWhichWillRequireDesignChangesNextYearAndDeprecateWhatWeUse
。