2012-03-31 22 views
8

(もしあれば)私はこれを説明するために例を使用します:オブジェクト指向プログラミングでは、オブジェクトは多対多の関係を維持する必要がありますか?

class Company { 

} 

class Person { 

} 

CompanyPersonは、多くの関係に多くを保持します。 Personは複数のCompaniesに属し、Companyは複数のPeopleを保持することができます。

は、私は3番目のクラスを作成する必要があります:

class CompanyPerson { 

} 

や企業がそれを処理する必要があります

class Company { 
    function add_person() { 

    } 
} 

または多分Personべきでしょうか?

class Person { 
    function add_to_company() { 

    } 
} 
+0

[クラスを持つモデル親子関係]の可能複製(http://stackoverflow.com/questions/4089582/modelling-を追跡することができます親子関係 - クラス付き) –

答えて

2

PersonCompanyインスタンスのいくつかのランダムな組み合わせに共通する特性は、「関連クラス」を用いてモデル化することができます。

これはUMLで表記されており、このような概念を拡張可能なプログラミング言語で作成することは難しくありません。

アイデアは、任意のランダムPersonからなるオブジェクトのペアとCompanyの関係を有することであり、その関係は、オブジェクト自体です。 PersonでもCompanyでもなく、特定のPersonCompanyインスタンス間の接続に関連するものです。

そのようなもの(プロパティ、メソッド)はクラスを構成します:Person-Companyアソシエーションクラス。

私はLispでこの仕事をしました。与えられたクラスのペアの関連クラスを定義するためのいくつかのマクロと、オブジェクトペアを関連クラスオブジェクトにマッピングするためのグローバルな弱いハッシュテーブル(特定の人物会社は関連付けを取得することができ、これらのオブジェクトがガベージになったときにその関連付けが解除されます)。

特定の企業と人々の間の実際のリンクは簡単です。リストまたは他の連想データ構造。人物オブジェクトには企業のリストがあり、その逆もあります。アソシエーションクラスのアイデアは、人と会社のものをどこに置くべきかの問題を解決します。たとえば、それぞれPersonCompanyの中で役割を持っています(これは言うことができます)。多くの企業で多くの役割を持つことができるため、変数をPersonに含めることはできません。我々は確かにそれが人でさえないので会社にroleを持つことはできません。それは役割を持っているそれに関連付けられている人々があります。役割は協会に入ることができます:問題解決。

2

これはまったくあなたの使用シナリオに依存します。

会社で働く人を探す必要がある場合は、その人のリストを会社に保管してください。人々が働く会社を見つける必要がある場合は、そこに保管してください。

遅かれ早かれ実際の関係者Person < - > Companyをモデル化する必要があることが分かります。それを表す別のクラスを作成します。これで、雇用開始日、終了日などのプロパティの追加を処理できます。

0

私はあなたが第三のクラスを必要とは思わない。 databse層の上にこの場合

あなたは3つのテーブルがあります:

何ORMのだと思う(PHP用Doctrin、Javaのforn Hybernate)ん

会社、ユーザーとCompany_userは(beetweenテーブルに参加しますどのユーザーがどの会社にいるかを示すユーザーと会社)。

会社、利用者及び利用者にあなたが会社を指す参照を持っている:

また、あなたはちょうど2つのDBテーブルでこの状況をマッピングすることができます。したがって、このリファレンスに基づいて、ユーザーが所属する会社を言うことができます。

は最後に、クラスの設計に私は思う:

  • クラスcompanuyが
  • クラスのユーザーは、会社への参照(会社を保持することができ、ユーザー(企業に属するユーザのリスト)の配列を保持することができますユーザbleongsに)
0

このユースケースに依存するが、多くのオブジェクト関係一般に多くは、参照クラスを

class CompanyPersonRelationship { 
    public $company; 
    public $person; 
} 
を使用して展開することができます

だから今、会社と人の両方が彼らの関係の嘘

class Company { 
    public $persons = array(); 
} 

class Person { 
    public $companies = array(); 
} 
関連する問題