オブジェクトの構成

コンピューター サイエンスではオブジェクトの合成オブジェクトの集約は、オブジェクトまたはデータ型をより複雑なものに組み合わせる方法として密接に関連しています。会話では、構成と集合の区別が無視されることがよくあります。[1]一般的な種類の構成には、オブジェクト指向プログラミングで使用されるオブジェクトタグ付きユニオンセットシーケンス、およびさまざまなグラフ構造があります。オブジェクトの構成はデータ構造に関連しますが、同じではありません。

オブジェクト構成とは、情報を表現するために使用される実装や物理的なデータ構造ではなく、情報の論理的または概念的な構造を指します[要出典]たとえば、シーケンスはセットとは異なります。これは、(とりわけ) 構成アイテムの順序が前者では重要ですが、後者では重要ではないためです。配列リンク リストハッシュ テーブル、その他多くのデータ構造を使用して、これらのいずれかを実装できます。おそらく混乱を招くかもしれませんが、同じ用語の一部がデータ構造と複合の両方に使用されています。たとえば、「バイナリ ツリー」データ構造としては、項目の線形シーケンスにアクセスする手段であり、ツリー内の項目の実際の位置は無関係です (ツリーは、その意味を変えることなく、内部で好きなように再配置できます)。ただし、オブジェクトの構成としては、位置に関連性があり、位置を変更すると (たとえば、樹木図などで)意味が変わります[要出典]

プログラミング技術

オブジェクト指向プログラミングは、データと動作をカプセル化するオブジェクトに基づいています機能をより複雑なものに組み立てて構成するために、サブタイプ化とオブジェクト構成という 2 つの主な手法が使用されます。[2]オブジェクトの合成とは、複合オブジェクト内でオブジェクトを結合すると同時に、 内部を可視化せずに明確に定義されたインターフェイスを使用して各オブジェクトを確実にカプセル化することです。この点で、オブジェクトの構成は、カプセル化を強制しないデータ構造とは異なります。

オブジェクトの構成は、オブジェクトのセットやシーケンスなど、複数の関連オブジェクトのグループに関するものである場合もあります。委任は、それを囲んでいる複合オブジェクトに対して行われたリクエストまたは呼び出しをその内部コンポーネントの 1 つに転送することによって、構成を強化できます。[3]

クラスベースの型指定プログラミング言語では、型を複合型と非複合型に分けることができ、合成は型間の関係とみなすことができます。つまり、複合型のオブジェクト (例: car ) は他の型のオブジェクトを "持っます(例:ホイール)。複合オブジェクトに同じタイプの複数のサブオブジェクトが含まれる場合、それらは特定の役割に割り当てられる場合があり、多くの場合、名前や番号で区別されます。たとえば、Pointオブジェクトには、「x」、「y」、「z」など、異なる軸に沿った距離をそれぞれ表す 3 つの数値が含まれる場合があります。一般に部分と全体の関係を研究することは、メレオロジーです。

合成は、一般的なデータ型に詳細を追加してより具体的なデータ型を作成するプロセスであるサブタイプ化とは区別する必要がありますたとえば、 car は特定のタイプの車両である場合があります。car is a vehicleです。サブタイプは、異なるオブジェクト間の関係を記述するのではなく、ある型のオブジェクトが同時に別の型のオブジェクトであることを示します。このような関係を研究するのがオントロジーです。

JavaScriptなどのプロトタイプベースのプログラミング言語では、オブジェクトはインスタンス化の瞬間にプロトタイプ オブジェクトから動作を動的に継承できます。合成はプロトタイピングとは区別する必要があります。新しくインスタンス化されたオブジェクトは、そのプロトタイプの合成を継承しますが、それ自体が独自に合成される場合もあります。

複合オブジェクトは、構成されたオブジェクトを同じ場所に配置すること、参照を同じ場所に配置すること、またはその他の多くの方法でストレージ内で表現できます。複合オブジェクト内の項目は、属性フィールドメンバープロパティ、またはその他の名前として参照され、結果として得られる構成は、複合タイプストレージレコード構造タプル、またはユーザー定義タイプ (UDT)として参照されます。詳細については、以下の集計セクションを参照してください。

UMLモデリング手法

UML で表現された自転車クラス。サドル、車輪、部品の 3 つのプロパティを持ち、最後の 2 つは複数のオブジェクトを示す多重度を持ちます。
UML プロパティを使用してオブジェクトを構成するオブジェクトの構成

UMLモデリングでは、プログラミング言語による実装とは独立して、概念的にオブジェクトを構成できます。UML でオブジェクトを構成するには、プロパティ、関連付け、集約、および合成という 4 つの方法があります: [4]

  • プロパティはクラスの属性を表します。
  • アソシエーションは、関連するクラスのインスタンス間の意味論的な関係を表します。アソシエーションのメンバー側は、関連付けられたクラスのプロパティに対応します。
  • 集約は、集約 (全体) と関連するコンポーネントのグループ (部分) の間の部分/全体の関係をモデル化する一種の関連付けです。
  • コンポジット集約とも呼ばれるコンポジションは、コンポジット (全体) と排他的に所有される部分のグループとの間の部分/全体の関係をモデル化する一種の集約です。

集約とそのコンポーネント間の関係は弱い「has-a」関係です。コンポーネントは複数の集約の一部である場合があり、集約を経由せずに他のオブジェクトを通じてアクセスでき、集約オブジェクトよりも存続する場合があります。[4]コンポーネント オブジェクトの状態は依然として集合オブジェクトの一部を形成します。[要出典]

複合オブジェクトとその部分の関係は、強力な「has-a」関係です。複合オブジェクトは、「複合オブジェクトの存在と保管に対する責任」を単独で持ち、複合オブジェクトは最大でも 1 つの複合オブジェクトの一部になることができます。複合オブジェクトが削除されると、オブジェクトであるそのパーツ インスタンスもすべて一緒に削除されますしたがって、UML では、合成は通常のオブジェクトの合成よりも狭い意味を持ちます。

それぞれが 1 人の所有者を持つ複数の自転車間の関連付け。 自転車を構成するフレーム部品を備えた自転車の構成。 自転車を持たずに存在する、車輪を備えた自転車の集合体
関連、構成、集計のための UML 表記

グラフィック表記は次のことを表します。

  • 囲んでいるクラスのボックス内の型付き要素としてのプロパティ、
  • 関連するクラス間の単純な線としての関連付け、
  • 凝集体の側面にある塗りつぶされていない菱形と実線としての凝集体、
  • コンポジットは、コンポジットの側面にある塗りつぶされたダイヤモンドと実線として表示されます。

集計

集約は、所有権を意味しないという点で、通常の構成とは異なります。合成では、所有するオブジェクトが破棄されると、含まれるオブジェクトも破棄されます。集計では、これは必ずしも当てはまりません。たとえば、大学にはさまざまな学部 (例:化学) があり、各学部には多数の教授がいます。大学が閉校になったら学部はなくなりますが、その学部の教授は残ります。したがって、学部は教授の集合体であるのに対し、大学は学部の構成として見ることができます。さらに、教授は複数の学部に勤務することができますが、1 つの学部が複数の大学に所属することはできません。

合成は通常、オブジェクトに別のオブジェクトが含まれるように実装されます。たとえば、C++では次のようになります。

クラスの教授// 別の場所で定義   

class部門{ public :部門( const std :: string & title ) : title_ ( title ) {}  
 
      

 private : 
// 集計: |教授| |部門|よりも存続する可能性があります。std ::ベクトル< std :: weak_ptr <教授>> members_ ; const std ::文字列title_ ; };  
   
    



クラス大学{ public : University () =デフォルト;  
 
    

 private : 
// 構成: |学科|は、その学部が存在する限り存在します。std ::ベクトル<学部>学部_ = {学部( "化学" ),学部( "物理" ),学部( "芸術" ), }; };  
     
      
      
      
  

集約では、オブジェクトにはオブジェクトへの参照またはポインタのみを含めることができます (オブジェクトに対する 生涯の責任は持ちません)。

通常の合成と集約の区別が重要でない場合、集約は合成と呼ばれることがあります。

上記のコードは、次の UML クラス図に変換されます。

COMでの集約

COMでの集約

Microsoft のコンポーネント オブジェクト モデルでは、集約とは、オブジェクトがその所有者であるかのように、そのオブジェクトが所有する別のオブジェクトの1 つまたは複数のインターフェイスをエクスポートすることを意味します。形式的には、これは集約よりも合成またはカプセル化に似ていますただし、所有オブジェクトのインターフェイスを呼び出してエクスポートされたインターフェイスを実装する代わりに、所有オブジェクトのインターフェイス自体がエクスポートされます。所有されているオブジェクトは、これらのインターフェイスのメソッドがIUnknownから継承されていることを保証する責任があります。実際にオーナーの対応するメソッドを呼び出します。これは、所有者の参照カウントが正しく、エクスポートされたインターフェイスを介して所有者のすべてのインターフェイスにアクセスできる一方で、所有されているオブジェクトの他の (プライベート) インターフェイスにはアクセスできないことを保証するためです。[5]

特殊なフォーム

封じ込め

複合データ型の複数のインスタンスを格納するために使用される構成は、包含と呼ばれます。このようなコンテナの例としては、配列連想配列バイナリ ツリーリンク リストなどがあります。

UMLでは、包含は 0..* または 1..* の多重度で表され、複合オブジェクトが未知の数の合成クラスのインスタンスで構成されていることを示します。

再帰的合成

オブジェクトは再帰的に構成でき、その型は再帰型と呼ばれます。例には、さまざまな種類のツリーDAGグラフが含まれます。ツリー内の各ノードは枝または葉である場合があります。言い換えれば、各ノードは別のツリーに属していると同時にツリーでもあります。

UML では、再帰的構成は、クラスとそれ自体との関連付け、集約、または構成によって表されます。

複合パターン

複合デザイン パターンは、複合タイプに基づくオブジェクト指向のデザインであり、再帰的な構成と包含を組み合わせて、複雑な部分全体の階層を実装します。

C の複合型

Cでの合成例です

構造{整数; _ 文字[ 20 ]; enum {求職者専門職非専門職退職者学生}雇用; }; 

   
   
        

この例では、プリミティブ (非複合) 型intenum {job_seeking、professional、non_professional、retired、student } と複合配列型 char[]が結合されて、複合構造personが形成されます。個人構造には、年齢、名前、雇用形態が「含まれます」。

さまざまな言語での作曲のタイムライン

C では、レコードを構造体または構造体と呼びます。JavaSmalltalkC++などのオブジェクト指向言語は、多くの場合、レコードをオブジェクト(クラスインスタンス) 内に隠して保持します。MLファミリーの言語では単にレコードと呼ばれます。COBOL は、レコードを直接サポートする最初の広く普及したプログラミング言語です。[6] ALGOL 68 はCOBOL から取得し、Pascal は多かれ少なかれ間接的に ALGOL 68 から取得しました。Common Lisp は構造体とクラスを提供します (後者は、 Common Lisp オブジェクト システム)。[要出典]

1959 – コボル
      01  顧客記録
03  お客様番号写真9(8)コンプ03  お客様名. 05  名前の写真 x(15) 05  イニシャル-2写真 x 05  姓の写真 x(15) 03  顧客の住所05  通り07  通り名写真 x(15) 09  番地写真999コンプ05  都市写真 x(10) 05  国コード写真 x(3)              
        
                 
                   
                     
        
          
                 
                 
                        
                
05  郵便番号写真 x(8) 03  金額未払いpic 9(8)コンプ                    
                 
1960 – アルゴル 60

配列は、 Algol 60唯一の複合データ型でした。

1964 – PL/I
dcl 1 newtypet ベース (P);
 2 (a、b、c) 固定ビン(31)、
 2 (i、j、k) 浮動小数点、
 2rptr;
newtypet を割り当てます。
1968 – アルゴル 68
int max = 99;
mode newtypet = [0..9] [0..max]struct (
 long 実数 a、b、c、short int i、j、k、ref 実数 r
);
newtypet newarrayt = (1, 2, 3, 4, 5, 6, ヒープ実数 := 7)

たとえば、リンク リストは次のように宣言できます。

モードノード = Union (real、int、compl、string)、
 list = struct (node val, ref list next);

ALGOL 68 の場合、等式の左側に型名のみが表示され、最も注目すべき点は、優先順位に関係なく左から右に構築が行われ、読み取ることができることです。

1970 – パスカル
type 
a =整数配列[ 1 .. 10 ] ; b =レコードa b c :実数; i j k :整数終了;      
   
     
     
 
1972 – K&R C
#define max 99 
struct newtypet { double a , b , c ; 浮動小数点数r ; 短いi j k ; 新しい配列[ 10 ] [ max + 1 ];  
     
   
     
    
1977 – フォートラン 77

Fortran 77 には配列がありますが、正式なレコード/構造定義がありませんでした。通常、複合構造はEQUIVALENCEまたはCOMMONステートメント を使用して構築されます。

       CHARACTER NAME * 32 ADDR * 32 PHONE * 16実際に所有するCOMMON / CUST / NAME ADDR PHONE OWING  
       
           
1983 – エイダ
type  Cust 
 レコード
    :  Name_Type ; 
  アドレス  :  Addr_Type ; 
  電話番号 :  Phone_Type ; 
  Owing  : 整数 範囲 1. . 999999 ; 
 終了レコード;

Ada 95 では、タグ付き型 (C++ クラスに相当) を通じて OOP の概念が導入され、Ada 2012 ではクラス全体のコントラクトによる 置換検証のサポートが追加されました。

1983 – C++
const int max = 99 ; クラス{ public : double a b c ; float & r ; 短いi j k ; newtypet [ 10 ] [ max + 1 ] ;    
 
  
     
   
     
   
1991 – パイソン
max  =  99
クラス NewTypeT : 
    def  __init__ ( self ): 
        self a  = 自分自身b  = 自分自身c  =  0
        自分自身 = 自分自身j  = 自分自身k  =  0.0 
# このクラスのサンプル配列を初期化します。
newarrayt  =  [[ NewTypeT ()  for  i  in  range ( max  +  1 )]  範囲( 10 )j の場合] 
1992 – フォートラン 90

配列と文字列は FORTRAN 77 から継承され、新しい予約語typeが導入されました。

type newtypet 
double precision a , b , c integer * 2 i , j , k *ポインタなし type REF REAL R end type   
    
   
 

タイプ( newtypet ) t ( 10 , 100 )   

FORTRAN 90 は更新され、 NAMELIST と呼ばれるFORTRAN IVの概念を組み込みました。

INTEGER :: jan = 1 feb = 2 mar = 3 apr = 4ネームリスト// 1月2 月3 月4 月             
       
1994 – ANSI共通 Lisp

Common Lisp は、構造体と ANSI Common Lisp 標準に追加された CLOS クラスを提供します。

( defclass some-class () (( f :type float ) ( i :type integer ) ( a :type ( array integer ( 10 )))))  
    
     
       

C/C++ での合成の詳細については、「 複合型 」を参照してください。

こちらも参照

参考文献

  1. ^ ヤイセル、ミシェル。「オブジェクト指向プログラミングの概念: 構成と集約」。2015 年 4 月 8 日のオリジナルからアーカイブ。合成と密接に関連した概念があり、集約と呼ばれます。会話では、構成と集約の違いは無視されることがよくあります。
  2. ^ デザイン パターン : 再利​​用可能なオブジェクト指向ソフトウェアの要素。ガンマ、エリック、ヘルム、リチャード (コンピューター科学者)、ジョンソン、ラルフ E.、1955-、ヴリシデス、ジョン。マサチューセッツ州レディング:アディソン・ウェスリー。1995.ISBN _ 0-201-63361-2OCLC  31171684。{{cite book}}:CS1メイン:その他(リンク
  3. ^ オスターマン、クラウス; メジーニ、ミラ(2001年10月1日)。「オブジェクト指向の構成を解きほぐす」。ACM SIGPLAN の通知36 (11): 283–299。土井:10.1145/504311.504303。ISSN  0362-1340。
  4. ^ ab OMG (2017). 「統一モデリング言語仕様バージョン 2.5.1」。www.omg.orgp. 109-110、197-201 2020 年10 月 4 日に取得
  5. ^ 「集約」. Windows XP SP2 用のプラットフォーム SDKマイクロソフト2007 年11 月 4 日に取得
  6. ^ セベスタ、ロバート W.プログラミング言語の概念(第 3 版)。Addison-Wesley Publishing Company, Inc. p. 218.ISBN _ 0-8053-7133-8

外部リンク

  • 関連、集約、および構成、2009 年 2 月にアクセス
  • ハラルド・スタール、UML2、アディソン・ウェスリー、2005