質問
の違いは何ですか結果を出すには断固たる決意と粘結?
どのようにカップリングと結合繋がるも良い貧しいソフトウェアのデザイン?
何事にな概要の間の差異は、その影響全体のコードか。
解決
凝集 クラス(またはモジュール)ができることを指します。凝集が低いことは、クラスが非常に多様なアクションを実行することを意味します - それは広範であり、それがすべきことに焦点が合っていません。高い凝集とは、クラスがやるべきこと、つまりクラスの意図に関連する方法のみに焦点を合わせていることを意味します。
凝集の例:
-------------------
| Staff |
-------------------
| checkEmail() |
| sendEmail() |
| emailValidate() |
| PrintLetter() |
-------------------
高い凝集の例:
----------------------------
| Staff |
----------------------------
| -salary |
| -emailAddr |
----------------------------
| setSalary(newSalary) |
| getSalary() |
| setEmailAddr(newEmail) |
| getEmailAddr() |
----------------------------
はどうかと言うと カップリング, 、それは、2つのクラス/モジュールが互いにどのように関連または依存するかを指します。低い結合クラスの場合、あるクラスで大きなものを変更すると、他のクラスに影響を与えないはずです。高い結合により、コードを変更して維持することが困難になります。クラスは一緒に密接に編まれているため、変更を加えるにはシステム全体の改良が必要になる場合があります。
優れたソフトウェアデザインがあります 高い凝集 と 低カップリング.
他のヒント
高い凝集 以内に モジュールと低カップリング の間に モジュールは、多くの場合、OOプログラミング言語の高品質に関連していると見なされます。
たとえば、各Javaクラス内のコードには内部の結束が高くなければなりませんが、他のJavaクラスのコードと可能な限りゆるく結合している必要があります。
の第3章 Meyerのオブジェクト指向ソフトウェア構造(第2版) これらの問題の素晴らしい説明です。
凝集 関係の兆候です 以内に モジュール。
カップリング 関係の兆候です の間に モジュール。
凝集
- 凝集は、モジュール内の関係の兆候です。
- 凝集は、モジュールの相対的な機能強度を示しています。
- 凝集は、コンポーネント /モジュールが単一のものに焦点を当てる程度(品質)です。
- 設計中は、システムの他のモジュールとのやり取りがほとんどなく、単一のタスク(シングルマインド)に焦点を合わせて、凝集コンポーネント/モジュールに焦点を合わせて、高い凝集を目指して努力する必要があります。
- 凝集とは、たとえば隠れたデータの自然な拡張のようなものであり、デフォルトの可視性を持つパッケージですべてのメンバーが表示されるクラスです。凝集は、モジュールの概念です。
カップリング
- カップリングは、モジュール間の関係を示しています。
- 結合は、モジュール間の相対依存性/相互依存性を示しています。
- カップリングとは、コンポーネント /モジュールが他のモジュールに接続されている程度です。
- 設計中は、モジュール間の低い結合、つまりモジュール間の依存関係を努力する必要があります
- プライベートフィールド、プライベートメソッド、非パブリッククラスを作成すると、ゆるいカップリングが提供されます。
- カップリングはモジュール間の概念です。
小切手 これ リンク
凝集 ソフトウェア要素の責任がどのように関連し、焦点を合わせているかを示しています。
カップリング ソフトウェア要素が他の要素にどれだけ強く接続されているかを指します。
ソフトウェア要素は、クラス、パッケージ、コンポーネント、サブシステム、またはシステムです。システムを設計している間、ソフトウェア要素を持つことが推奨されます 高い凝集 とサポート 低カップリング.
低凝集 その結果、維持し、理解し、再利用を減らすことが困難なモノリシッククラスが得られます。同様に 高い結合 結果は、緊密に結合されており、変化は非ローカルではなく、変更が困難であり、再利用を減らす傾向があります。
典型的なモニター可能を設計している仮想シナリオを取ることができます ConnectionPool
次の要件があります。に注意してください ConnectionPool
しかし、基本的な意図は、単に実証することです 低カップリング と 高い凝集 いくつかの簡単な例があり、私は助けてくれるべきだと思います。
- 接続の取得をサポートします
- 接続をリリースします
- 接続と使用法のカウントに関する統計を取得します
- 接続時間と時間に関する統計を取得します
- 接続の取得を保存し、情報をデータベースにリリースして、後でレポートします。
と 低凝集 設計することができます ConnectionPool
以下のように、この機能/責任をすべて単一のクラスに強制的に詰め込むことによってクラス。この単一のクラスは、接続管理を担当し、データベースと対話し、接続統計を維持することを担当していることがわかります。
と 高い凝集 クラス全体でこれらの責任を割り当て、より保守可能で再利用可能にすることができます。
デモンストレーション 低カップリング 高いまとまりを続けます ConnectionPool
上記の図。上記の図を見ると、高い凝集をサポートしていますが、 ConnectionPool
しっかりと結合されています ConnectionStatistics
クラスと PersistentStore
それらと直接相互作用します。代わりに、結合を減らすために紹介することができます ConnectionListener
インターフェイスとこれらの2つのクラスにインターフェイスを実装して、それらに登録させます ConnectionPool
クラス。そしてその ConnectionPool
これらのリスナーを繰り返し、接続の取得とリリースイベントを通知し、カップリングを少なくします。
メモ/単語または注意: この単純なシナリオでは、過剰に見えるかもしれませんが、アプリケーションが複数のサードパーティサービスと対話してトランザクションを完了する必要があるリアルタイムシナリオを想像する場合:サードパーティサービスとコードを直接結合すると、サードパーティのサービスは、複数の場所でコードが変更される可能性があります。 Facade
これはこれらの複数のサービスと内部的に相互作用し、サービスへの変更はローカルになります Facade
低カップリングをサードパーティサービスと強制します。
結束の増加と結合の減少は、優れたソフトウェア設計につながります。
Cohesionは、機能性が簡潔でそれに関連するデータに最も近いように分割しますが、デカップリングにより、機能の実装がシステムの残りの部分から分離されるようになります。
デカップリング ソフトウェアの他の部分に影響を与えることなく、実装を変更できます。
凝集 実装が機能により具体的であり、同時に維持が容易になることを保証します。
結合を減らし、結束を増加させる最も効果的な方法は インターフェイスによるデザイン.
これは、主要な機能的オブジェクトは、実装するインターフェイスを介して互いに「知る」ことです。インターフェイスの実装は、自然な結果として結束を導入します。
一部のセナリオでは現実的ではありませんが、仕事をするデザインの目標であるべきです。
例(非常に大ざっぱ):
public interface IStackoverFlowQuestion
void SetAnswered(IUserProfile user);
void VoteUp(IUserProfile user);
void VoteDown(IUserProfile user);
}
public class NormalQuestion implements IStackoverflowQuestion {
protected Integer vote_ = new Integer(0);
protected IUserProfile user_ = null;
protected IUserProfile answered_ = null;
public void VoteUp(IUserProfile user) {
vote_++;
// code to ... add to user profile
}
public void VoteDown(IUserProfile user) {
decrement and update profile
}
public SetAnswered(IUserProfile answer) {
answered_ = answer
// update u
}
}
public class CommunityWikiQuestion implements IStackoverflowQuestion {
public void VoteUp(IUserProfile user) { // do not update profile }
public void VoteDown(IUserProfile user) { // do not update profile }
public void SetAnswered(IUserProfile user) { // do not update profile }
}
コードベースの他の場所では、それらが何であるかに関係なく質問を処理するモジュールを持つことができます。
public class OtherModuleProcessor {
public void Process(List<IStackoverflowQuestion> questions) {
... process each question.
}
}
の最良の説明 凝集 ボブおじさんのクリーンコードから来ています:
クラスには、少数のインスタンス変数が必要です。クラスの各メソッドは、これらの変数の1つ以上を操作する必要があります。 一般に、より多くの変数があれば、メソッドはよりまとまりがあり、そのメソッドはそのクラスにとってより多くのものです. 。各メソッドで各変数が使用されるクラスは、最大限にまとまります。
一般に、このような最大のまとまりのあるクラスを作成することは賢明でも不可能です。一方で、 結束が高くなりたいです. 。凝集が高い場合、それはクラスの方法と変数が共依存しており、論理的な全体として一緒にハングすることを意味します。
関数を小さく保ち、パラメーターリストを短く保つという戦略は、メソッドのサブセットで使用されるインスタンス変数の急増につながる場合があります。これが起こると、ほとんどの場合、より大きなクラスから抜け出そうとする他のクラスが少なくとも1つあることを意味します。変数とメソッドを2つ以上のクラスに分離して、新しいクラスがよりまとまっているようにする必要があります。
凝集 ソフトウェアエンジニアリングは、特定のモジュールの要素が一緒に属する程度です。したがって、ソフトウェアモジュールのソースコードで表現された各機能性がどれほど強く関連しているかの尺度です。
カップリング 簡単に言えば、1つのコンポーネント(繰り返しますが、クラスを想像してください)は、別のコンポーネントまたは別のコンポーネントの内側のワーキングまたは内側の要素、つまり他のコンポーネントの知識をどれだけ持っているかについて知っています。
これについてのブログ投稿を書きました, 、例と図面でもう少し詳細を読みたい場合。あなたの質問のほとんどに答えていると思います。
単に、 凝集 コードベースの一部が論理的に単一の原子単位を形成する程度を表します。 カップリング, 一方、単一のユニットが他のユニットから独立している程度を表します。言い換えれば、それは2つ以上のユニット間の接続の数です。数が少ないほど、カップリングが低くなります。
本質的に、高い結束とは、単一の場所で互いに関連するコードベースの一部を維持することを意味します。低カップリングは、同時に、コードベースの無関係な部分を可能な限り分離することです。
結束と結合の観点からのコードの種類:
理想 ガイドラインに従うコードです。それはゆるく結合されており、非常にまとまりがあります。この写真でそのようなコードを説明することができます:
神の目的 高い凝集と高い結合を導入した結果です。これはアンチパターンであり、基本的にはすべての作業を一度に行う単一のコードを表しています。 選択が不十分です 異なるクラスまたはモジュールの境界が不十分に選択されている場合に発生します
破壊的なデカップリング 最も興味深いものです。プログラマーがコードベースを非常に切り離そうとすると、コードが完全に焦点を落とすときに発生することがあります。
続きを読む ここ
凝集とは、単一のクラスの設計方法についてすべてを指します。凝集は、クラスが単一の焦点を絞った目的で設計されていることを確認することに最も密接に関連するオブジェクト指向の原理です。クラスが焦点を絞るほど、そのクラスの結束性はより多くです。高いまとまりの利点は、そのようなクラスは、凝集が低いクラスよりも維持がはるかに容易である(そして頻繁に変更されない)ことです。高いまとまりのもう1つの利点は、焦点を絞った目的を持つクラスが他のクラスよりも再利用可能になる傾向があることです。
上記の画像では、凝集では、再利用性とメンテナンスの可能性を減らす共通ではない多くの仕事を実行する責任があるクラスは1つだけであることがわかります。しかし、高いまとまりには、すべてのジョブが特定のジョブを実行するための別のクラスがあり、より良い使いやすさとメンテナンスが生じます。
凝集 (共同媒介): co それは意味します 一緒, ヘシオン それは意味します 固執する. 。異なる物質の粒子を貼り付けるシステム。
実生活の例:
IMG提供者
全体は、パーツ - アリストテレスの合計よりも大きい。
凝集 は測定の順序タイプであり、通常は「高い凝集」または「低凝集」と呼ばれます。高い凝集は、堅牢性、信頼性、再利用可能性、理解可能性を含むソフトウェアのいくつかの望ましい特性に関連しているため、高い凝集を持つモジュールが好ましい傾向があります。対照的に、低い凝集は、維持、テスト、再利用、または理解するのが難しいなどの望ましくない特性に関連しています。 ウィキ
カップリング 通常、対照的です 凝集. 。低カップリングはしばしば高い凝集と相関し、逆も同様です。低カップリングは、多くの場合、よく構造化されたコンピューターシステムと優れた設計の兆候であり、高いまとまりと組み合わせると、高い読みやすさと保守性の一般的な目標をサポートします。 ウィキ
違いは次のように考えることができると思います。
- 凝集は、コードベースの一部が論理的に単一の原子単位を形成する程度を表します。
- 結合は、単一のユニットが他のユニットから独立している程度を表します。
- 凝集を損傷することなく完全なデカップリングをアーカイブすることは不可能です。その逆も同様です。
このブログ投稿で 私はそれについてもっと詳細に書きます。
凝集 モジュールの相対的な機能強度の兆候です。
- まとまりのあるモジュールは単一のタスクを実行し、プログラムの他の部分の他のコンポーネントとのやり取りはほとんど必要ありません。簡単に言えば、まとまりのあるモジュールは(理想的には)1つのことだけを行う必要があります。
conventivedental View:
モジュールの「シングルマインド」
見解:
コーシオンとは、コンポーネントまたはクラスが互いに密接に関連する属性と操作のみをカプセル化することを意味します。クラスまたはコンポーネント自体に
凝集のレベル
function機能
レイヤー
communicational
sequentive順位
crocedural
emplal時代
cutility性
カップリング モジュール間の相対的な相互依存性を示しています。
カップリングは、モジュール間のインターフェイスの複雑さ、モジュールへのエントリまたは参照がどのポイントであるか、およびインターフェイスを介してどのデータが通過するかに依存します。
従来のビュー:コンポーネントが他のコンポーネントや外界に接続されている程度
OOビュー:クラスが互いに接続されている程度の定性的尺度
結合のレベル
content
commoncommon
control
stamp
data
Routineコール
type使用
inclusion inclusionまたはImport
external#
結合 =相互作用との関係二つのモジュール...結束 =相互作用の二つの要素内のモジュールです。
ソフトウェアで構成され多くのモジュールです。モジュールされます。考えるモジュールはプログラム。関数内のプログラムは、要素になります。
実行時に、出力のプログラムが入力で使用される他のプログラム。これをモジュールモジュールの相互作用やプロセスを処理します。このはれるものとの接続に適しています。
一つのプログラムの出力機能に渡されます。この相互作用に重要モジュールです。ことも呼ばれてい結束という
例:
結合 =間のコミュニケーション2つの異なるご家族連れ---結束 =間のコミュニケーションのお父さん-お母さんもいます。
簡単に言えば、 凝集 クラスが単一の概念を表す必要があることを意味します。
クラスのすべての機能がクラスが表す概念に関連している場合、クラスのパブリックインターフェイスはまとまりがあります。たとえば、CashRegisterクラスを使用する代わりに、CashregisterとCoinの材料を使用すると、CashregisterとCoinクラスの2つのクラスになります。
の カップリング, 、あるクラスは、クラスのオブジェクトを使用するため、別のクラスに依存します。
高い結合の問題は、副作用を作成できることです。あるクラスの1つの変更は、他のクラスで予期しないエラーを引き起こす可能性があり、コード全体を破る可能性があります。
一般に、高い凝集と低い結合は高品質のOOPと見なされます。
用語 凝集 確かに、ソフトウェアの設計における意味が何を意味するかについて、少し直感的です。
まとまりの一般的な意味は、分子の魅力のような強い結合によって特徴付けられるものであるということです。ただし、ソフトウェア設計では、理想的には1つのことしか行わないクラスに努力することを意味するため、複数のサブモジュールは関与しません。
おそらく私たちはこのようにそれを考えることができます。部品は、それが唯一の部分である場合に最も結束されます(1つだけを実行し、さらに分解することはできません)。これは、ソフトウェア設計で望まれるものです。結束は、単に「単一の責任」または「懸念の分離」の別の名前です。
用語 カップリング 手には非常に直感的です。つまり、モジュールが他の多くのモジュールに依存しない場合、それが接続するモジュールは簡単に交換できます。 リスコフ代替原則 .