質問

ゆったりカップリング、開発者は、聖杯のバーソフトウェアです。それは確かに良いものを行う場合にはコードを柔軟に変化が発生することがあります将来に亘り、コードの重複を回避.

他方への取り組み、ゆるやかにカップル成分の量を増や間接のプログラムであるため、その複雑さ、多くのが難しくなるからであると理解しばしばが少なく効率的です。

なご検討を中心にゆったり結合せずに使用例をゆったりカップリング(回避等のコードの重複は計画変更が発生することがありますの将来を予見する抗ん。できるゆったり連結秋の傘下にYAGNI?

役に立ちましたか?

解決

幾分。

一部のモジュールを分離することを要求する特定の要件がない場合でも、あまりにも多くの労力をかけずに生じるゆるいカップリングは問題ありません。低く垂れ下がった果物。

一方、とんでもない量の変化のための労働力学は、多くの不必要な複雑さと努力になります。 Yagniは、あなたが言うように、頭にぶつかります。

他のヒント

プログラミングの練習です バツ 良いか悪いか? 明らかに、答えはそうです いつも "場合によります。"

あなたがあなたのコードを見ているなら、あなたがどの「パターン」を注入できるのか疑問に思っているなら、あなたはそれを間違っています。

無関係なオブジェクトがお互いにいじらないようにソフトウェアを構築している場合、あなたはそれを正しくやっています。

ソリューションを無限に拡張して変更できるようにソリューションを「エンジニアリング」している場合、実際にそれをより複雑にしています。

一日の終わりに、あなたは単一の真実を残していると思います。オブジェクトを切り離すことは多かれ少なかれ複雑ですか?それらを結合するのが複雑ではない場合、それは正しい解決策です。それらを切り離すのが複雑ではない場合、それは正しい解決策です。

(私は現在、非常に複雑な方法で単純な仕事をするかなり小さなコードベースで作業しています。それを非常に複雑にしているのは、元の側の「結合」と「結束」という用語の理解の欠如です。開発者。)

だと思うんでこちらのコンセプトである 結束.このコードをい。できますか自分のものにする目的を理解する"大"のかがでしょうか。

つながる可能性がある硬質をコードだけでなく、がありますの多くのソースファイル(仮にこれらの別々の授業では単一のクラスを持っているようです。

からアジャイルな視点からそのようなゆったり結合する抗パターンです。なし凝集、利用でき顕ユニット試験なる保証もするものではなく、コードの目的です。現在、アジャイルコードでゆったりカップリング、例えば、時にテスト駆動開発を使用します。ただし、権利の試験は、右の順に、それがあると良い結果を出すには断固たる決意と粘ゆったりカップリングです。きゃみされるケースが明確にな結合がございます。

再度からは、アジャイルな視点かこの人工レベルの間接指定ですので無駄な努力をうかが必要となります。つばrefactorが必要です。

全体的に、また高いカップリング内のモジュール、ゆったり結合します。の高いカップリングは、ほとんどないの結束という

このような質問の大部分については、答えは「依存します」です。全体として、理にかなっている方法でデザインを論理的にゆるく結合できれば、そうするための大きなオーバーヘッドがなくても、私はそうします。コードの不必要な結合を避けることは、私の考えでは、完全に価値のある設計目標です。

コンポーネントが論理的にしっかりと結合されるように見える状況になると、私はそれらを解散する前に説得力のある議論を探します。

これらのタイプの実践のほとんどで私が取り組んでいる原則は、慣性の1つだと思います。私は自分のコードがどのように機能したいかについての考えを持っています、そして、私が人生を難しくすることなくそのようにそれをすることができるならば、私はそうします。それを行うと開発が難しくなりますが、メンテナンスと将来の作業が簡単になる場合は、コードの生涯にわたってより多くの作業になるかどうかを推測し、ガイドとして使用します。そうでなければ、それはやる価値があるために意図的なデザインポイントである必要があります。

簡単な答えは、正しく行われた場合、ゆるい結合が良いことです。

1つの機能の原則に従うと、何が起こっているのかに従うのが十分に簡単でなければなりません。また、当然のことながら、ゆるいカップルのコードが努力せずに続きます。

シンプルな設計ルール:1。ファサードインターフェイスを構築していない限り、複数のアイテムの知識を単一のポイントに(どこでも指摘し、依存します)に構築しないでください。 2. 1つの関数-1つの目的(その目的はファサードなどの多面的である可能性があります)3。1つのモジュール - 相互に関連する関数の1つの明確なセット - 1つの明確な目的4.単純にテストできない場合、それはありません。単純な目的

リファクタリングが容易になったことについてのこれらのコメントはすべて、コラの負荷です。知識が多くの場所に組み込まれると、特に分散システムでは、リファクタリングのコスト、ロールアウトの同期、および他のほぼすべてのコストが、ほとんどの場合、システムがそのために破壊されることを考慮せずにそれを吹き飛ばします。

最近のソフトウェア開発についての悲しいことは、90%の人々が新しいシステムを開発し、古いシステムを理解する能力を持たないことであり、システムが継続的な断片の継続的なリファクタリングのためにそのような貧弱な健康状態になったときには決していません。

他のことが決して変わらない場合、他のものに対する1つのことがどれほどしっかりと結合されているかは関係ありません。私は、可能な限りゆるい形のカップリングを達成しようとすることで、物事が変化する、安定性を求めることを容易にするよりも、変化する理由を少なくすることに焦点を合わせて、長年にわたって一般的に生産的であることがわかりました。デカップリング 私は非常に有用であることがわかりました。パッケージを切り離すための控えめなコードの複製を好むことがあります。基本的な例として、数学ライブラリを使用して画像ライブラリを実装することを選択しました。私はコピーするのが些細な基本的な数学関数を複製しませんでした。

今、私の画像ライブラリは、数学ライブにどんな変化をもたらしても、画像ライブラリに影響を与えないように、数学ライブラリから完全に独立しています。それは何よりもまず安定性を置いています。画像ライブラリは、変化する可能性のある他のライブラリから切り離されているため、変更する理由が大幅に少ないため、今ではより安定しています(C標準ライブラリが変更されないことを願っています)。ボーナスとして、他の多くのLIBをビルドして使用するために多くのLIBを引っ張る必要がない単なるスタンドアロンライブラリである場合、展開することも簡単です。

安定性は私にとって非常に役立ちます。私は、将来の変化する理由がますます少ない十分にテストされたコードのコレクションを構築するのが好きです。それは夢ではありません。それ以来まったく変わっていない80年代後半から、私が使用し、再び使用しているCコードを持っています。ピクセル指向やジオメトリ関連のコードのような低レベルのものですが、私の高レベルのものの多くは時代遅れになりましたが、それはまだ多くのことをするのに役立ちます。それはほとんどの場合、外部が何もないとしても、より少ないものに依存するライブラリを意味します。ソフトウェアが変更する理由がほとんどないかまったくない安定した基礎にますます依存する場合、信頼性は上がります。実際には、可動部品の数が安定した部分よりもはるかに大きい場合でも、可動部品の数は非常に優れています。コードベース全体が可動部分で構成されていないことを知ることは、私の正気を大いに助けます。

ゆるいカップリングは同じ静脈にありますが、ゆるい結合はカップリングなしよりもはるかに安定性が低いことがよくあります。私が今まで働いてきたよりもはるかに優れたインターフェイスデザイナーや心を変えないクライアントとチームで働いていない限り、純粋なインターフェイスでさえ、コード全体でカスケードの破損を引き起こす方法で変化する理由を見つけることがよくあります。コンクリートではなく抽象に依存関係を向けることによって安定性を達成できるというこの考えは、インターフェイス設計が実装よりも初めて正しく到達しやすい場合にのみ役立ちます。開発者は、設計要件が完全に変更されることを将来見つけるために、開発者が非常に優れた実装を作成した可能性がある場合に、非常に優れた実装を作成した可能性があることがよくあります。絶えず変化する要件を満たそうとする大規模なコードベースで私に尋ねると、デザインが実装よりもはるかに困難であり、その場合、抽象的なデザインを具体的な実装から分離することは、抽象的なデザインが最も役に立たない場合はそれほど役に立ちません変更される傾向があります。

だから私は安定性と完全なデカップリングを好むのが好きなので、少なくとも自信を持って言うことができます。 。」どんな種類のデザインの変更が屋外で求められていても、それは私に少しの正気のスライスを与えます。

結合と安定性、ECSの例

エンティティコンポーネントシステムも大好きで、コンポーネントの依存関係にシステムがすべてアクセスし、生データを直接操作するため、多くのタイトな結合を導入します。

enter image description here

コンポーネントは生データを公開するだけなので、ここでのすべての依存関係はかなりタイトです。依存関係は抽象化に向かって流れていません、彼らはに向かって流れています 生データ つまり、各システムには、アクセスを要求する各タイプのコンポーネントについて可能な最大量の知識があります。コンポーネントには、すべてのシステムが生データにアクセスして改ざんする機能がありません。ただし、このようなシステムについては非常にフラットなので、このようなシステムについて推論するのは非常に簡単です。テクスチャが厄介になった場合、このシステムでは、レンダリングおよびペイントシステムがテクスチャコンポーネントのみにアクセスできることをすぐに知ることができます。テクスチャからのみ概念的に読み取るため、レンダリングシステムをすぐに除外できるでしょう。

一方、ゆるく結合された代替手段はこれかもしれません。

enter image description here

...データではなく抽象関数に流れるすべての依存関係が、その図のすべてのものがパブリックインターフェイスと独自の機能を公開することで。ここでは、すべての依存関係が非常にゆるいかもしれません。オブジェクトは、互いに直接依存していない場合があり、純粋なインターフェイスを介して互いに相互作用することさえできません。それでも、このシステムについて推論するのは非常に困難です。特に、相互作用の複雑なもつれを考えると、何かがうまくいかない場合は非常に困難です。エンティティは、互いの抽象的なパブリックインターフェイスについてしか知っていなくても、エンティティが集約するコンポーネントについて知る必要があるため、ECSよりも多くの相互作用(よりゆるいです)もあります。

また、何かに設計の変更がある場合、ECSよりも多くのカスケード障害が発生します。通常、すべてのものが優れたオブジェクト指向のインターフェイスと抽象化を提供しようとしているため、設計変更の理由と誘惑が増えます。それはすぐに、すべての小さなものが設計に制約と制限を課そうとするという考えに伴い、それらの制約はしばしば設計を令状を変更するものです。機能ははるかに制約があり、生データよりも多くの設計上の仮定を行う必要があります。

私は実際に、上記のタイプの「フラット」ECSシステムが、緩やかな依存関係の複雑なクモの巣を備えた最もゆるい結合システムよりもはるかに簡単に推論するのが非常に簡単であることを発見しました。 ECSバージョンが既存のコンポーネントを変更する必要があるため、コンポーネントはシステムが機能するために必要な適切なデータを提供することを除いて責任を負わないためです。純粋な設計の難しさを比較します IMotion インターフェイスとコンクリートモーションオブジェクトは、プライベートデータを介して不変剤を維持しようとしながら洗練された機能を提供するインターフェイスと、問題を解決するために関連する生データのみを提供する必要があり、機能に悩まされないモーションコンポーネントを実装します。

機能性はデータよりも正しいことが非常に困難です。そのため、依存関係の流れをデータに向けることが好ましいことが多いと思います。結局のところ、いくつのベクトル/マトリックスライブラリがそこにありますか?それらのうち、まったく同じデータ表現を使用し、機能が微妙に異なるだけですか?機能性の微妙な違いが必要なため、同一のデータ表現にもかかわらず、まだ多くの人がいます。そこにはいくつの画像ライブラリがありますか?それらのうち何人が異なるユニークな方法でピクセルを表していますか?ほとんどの場合、機能性は、多くのシナリオでデータよりもはるかに不安定であり、設計変更に向かっている傾向があることを再び示しています。もちろん、ある時点では機能が必要ですが、依存関係の大部分がデータに向かって流れるシステムを設計できます。これは、カップリングよりも安定性を優先することです。

私がこれまでに書いた中で最も安定した機能(私が使用していて、80年代後半からまったく変更することなく再利用してきた種類)は、すべてのデータに依存していたすべての機能でした。複合体に依存するものではなく、フロートや整数 Mesh オブジェクトまたは IMesh インターフェイス、または依存しているだけのベクトル/マトリックスの乗算 float[] また double[], 、依存していないものではありません FancyMatrixObjectWhichWillRequireDesignChangesNextYearAndDeprecateWhatWeUse.

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top