デメテルの定義
デメテル(デメテルの法則、LODは)また、少なくとも知識の原則と呼ばれる(最小知識の原則、LKP)1987年に生産、米国と呼ばれるデメテル(デメテル)研究プロジェクトでノースイースタン大学(ノースイースタン大学)、イアンは、オランダ(イアン・オランダ)によって提唱し、ブッチ(Booch氏は)UMLの創始者の一人の人気だった、と後でので、古典的な「実用プログラマ」(実用的なプログラマ)で言及した、よく知られています。
デメテルの法則の定義は次のとおりです。だけでなく、「見知らぬ人」の話(会話のみあなたの即時の友人にとして、あなたの友人と直接話していない見知らぬ人に)。意義がある:直接通信せずに、2つのソフトウェアエンティティは、その後、各出現ダイレクトコールがなければならない場合、コールは、第三者を介して転送することができます。目的は、モジュールの相対的な独立性を増加させる、クラス間の結合を低減することです。
「友人」手段でデメテル:現在オブジェクト自体、現在のオブジェクトのメンバーは、作成されたオブジェクトの現在のオブジェクト、例えば、現在のオブジェクトとしてメソッドパラメータは、現在のオブジェクト、凝集または組成の関係に関連したこれらのオブジェクトの存在することができこれらのオブジェクトにアクセスするための直接的な方法。
のデメテル利点
デメテル要件はソフトウェアエンティティ間の通信の幅と深さを制限する、デメテル適切な使用は、以下の2つの利点を有することになります。
-
- クラス間の結合を減少させる、それがモジュールの相対的な独立性を増加させます。
- プロ低減度ので、それによってシステムのスケーラビリティと多重化率クラスを向上させることができます。
しかし、システムの過度の使用は、そうモジュール間の通信の効率を低下させることにより、システムの複雑さを増加させる、デメテル中間クラスの多数を行います。したがって、必要性は、システムの明確な構造を確保するために、同時に、高い凝集力と低い結合を確実に、デメテルの使用を排除するもので重み付けします。
デメテルの法則の実装
これは、次の点を強調しデメテルの定義及び特徴から見られます。
-
- 依存者の観点からは、それが唯一の依存オブジェクトを依存している必要があります。
- その方法に依存している人たちの視点からだけ露出を公開する必要があります。
したがって、デメテルの使用に次の午前6時に注意すること。
-
- クラスの部門では、あなたは弱結合のクラスを作成する必要があります。クラスと弱いクラス間の結合、目標を達成するために多くの助長を再利用可能。
- 構造設計のクラスでは、クラスメンバーへのアクセスを減らすためにしてみてください。
- 設計部門では、優先順位は、同じクラスにクラス集合となります。
- 他のクラスを参照すると、最小の他のオブジェクトへの参照の数。
- クラス属性メンバが露出しますが、対応するアクセスユニット(セットとメソッドを取得)がされていません。
- ご注意くださいシリアライズ(直列化)機能。
[実施例1]星とブローカーとの関係の一例。
分析:星が芸術に身を投げたとして、ファンなどの日常業務を処理するための責任が非常に多くのブローカーは、メディア企業のビジネス交渉をし、その上、満たされます。ここではスターブローカーの友人、ファン、メディアが見知らぬ人でさ、クラス図を図1に示すデメテルを、使用するのに適しています。
仲介業者関係図で1つ星
コードは以下の通りであります:
- パッケージの原則;
- パブリッククラスLoDtest {
- パブリック静的ボイドメイン(文字列[]引数) {
- エージェントのエージェント= 新しいエージェント();
- エージェント。setStar (新新スター("ルビー" ));
- エージェント。setFans (新しい新しいファン(「ファンチェン漢」));
- エージェント。setCompany (新新会社(「中国メディア株式会社」));
- エージェント。ミーティング)(;
- エージェント。ビジネス();
- }
- }
- //ブローカー
- クラスエージェント {
- プライベートスターmyStar 。
- プライベートファンmyFans 。
- 民間会社myCompanyの。
- 公共のボイドsetStar (スターmyStar ) {
- この.myStar =ミスト。
- }
- 公共のボイドsetFans (ファンmyFans ) {
- この.myFans = myFans 。
- }
- 公共のボイドsetCompany (会社myCompanyの) {
- この.myCompany = myCompanyの。
- }
- 公共のボイド会議() {
- システムの.out 。のprintln (myFans 。関連項目GetName ()+ "スター付き" + mystar 。関連項目GetName ()+ "会いました。" );
- }
- 公共のボイドビジネス() {
- システムの.out 。のprintln (myCompanyの。関連項目GetName ()+ "スター付き" + mystar 。関連項目GetName ()+ "ビジネス交渉。" );
- }
- }
- //スター
- クラススター {
- プライベート文字列名;
- スター(文字列名) {
- この.nameの=名前;
- }
- パブリック文字列のgetName () {
- 名前を返します。
- }
- }
- //ファン
- クラスファン {
- プライベート文字列名;
- ファン(文字列名) {
- この.nameの=名前;
- }
- パブリック文字列のgetName () {
- 名前を返します。
- }
- }
- //メディア企業
- クラス会社 {
- プライベート文字列名;
- 会社(文字列名) {
- この.nameの=名前;
- }
- パブリック文字列のgetName () {
- 名前を返します。
- }
- }
次のようにプログラムの動作結果は以下のとおりです。
ハンチェンファンとスタールビーは会いました。 中国メディア・リミテッドとスタールビーの商談。