在面向对象编程中哪个对象应该保持多对多的关系? (如果有的话)

时间:2012-03-31 06:18:15

标签: php oop class many-to-many

我将用一个例子来说明这一点:

class Company {

}

class Person {

}

CompanyPerson拥有多对多关系。 Person可以属于多个Companies,而Company可以包含多个People

那么我是否需要创建第三个类:

class CompanyPerson {

}

或该公司应该处理它:

class Company {
    function add_person() {

    }
}

或者Person应该?

class Person {
    function add_to_company() {

    }
}

4 个答案:

答案 0 :(得分:2)

PersonCompany实例的某些随机组合所共有的属性可以使用“关联类”建模。

在UML中有一个符号,并且用可扩展的编程语言创建这样的概念并不难。

这个想法是由PersonCompany组成的任意随机对象都有关系,而这种关系本身就是一个对象。它既不是Person也不是Company,而是与特定PersonCompany实例之间的关联相关联的内容。

那些东西(属性,方法)构成一个类:Person-Company关联类。

之前我在Lisp中使用了一些用于定义给定类对的关联类的宏,以及用于将对象对映射到其关联类对象的全局弱哈希表(以便对于给定的人和公司)有可能检索到关联,当这些对象变成垃圾时,该关联就会消失。

特定公司与人之间的实际联系很容易,例如,列表或其他关联数据结构。人物对象可以有公司列表,反之亦然。协会类的想法解决了在什么地方放置人员公司的问题。例如,每个Person都有Company内的角色(比方说)。我们在role中不能有Person变量,因为它可以在很多公司中扮演很多角色。我们当然不能在公司中拥有role,因为它甚至不是一个人;它有与之相关的人员。角色可以进入关联:问题解决了。

答案 1 :(得分:2)

这完全取决于您的使用场景。

如果您只需找到为公司工作的人员,请将人员列表存储在公司;如果你只需要找到人们工作的公司,那就把它存放在那里。

迟早你可能会发现你需要建立实际关系Person< - > Company的模型,你将创建一个单独的类来表示它。现在,您可以处理添加属性,例如就业开始日期,结束日期等。

答案 2 :(得分:0)

我觉得你不需要第三节课。

想想ORM(Doctrin for php,Hybernate forn java)的作用:

在这种情况下,在数据库层上,您将有3个表:

公司,用户和公司_用户(用户和公司之间的联系表,说明哪个用户对哪个公司有好处)。

此外,您可以使用两个数据库表映射此情况:

公司,用户和用户,您有一个指向公司的参考。因此,根据此参考,您可以说用户所属的公司。

最后在课堂设计上我认为:

  • 班级公司可以拥有一组用户(属于该公司的用户名单)
  • 班级用户可以持有对公司(用户指定的公司)的引用

答案 3 :(得分:0)

这取决于用例,但通常可以使用引用类

部署多对多的对象关系
class CompanyPersonRelationship {
    public $company;
    public $person;
}

现在,公司和个人都可以追踪他们的关系谎言

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

class Person {
   public $companies = array();
}