加强关联关系的不同方式

different ways of enforcing association relationship

对于两个对象之间的关联:

如果我有一个"Office"对象和一个"Person"对象。我会将其建模为一个关联,并提出了以下示例代码作为执行它的一种方式。

不过看下来,有很多东西是我想更舒服的。

第一个问题:Office对象其实是一个class。我这样做是因为我只想要一个办公室——实例化它感觉不对。但是我觉得我在描述一个实例化的人和一个 "static" class 之间的关系时好像遗漏了一些东西作为关联?

第二个问题:我通过将一个对象传递给另一个对象来强制执行两个对象之间的关联。这是关联两个 class 的典型方式吗?

class Office
  @log = []
  @occupants = []

  def self.occupants
    @occupants
  end

  def self.log
    @log
  end

  def self.log_entry(person)
    if @occupants << person
      @log << "#{person.name} entered Office: #{Time.now}"
    end
  end  

  def self.log_exit(person)
    if @occupants.delete(person)
      @log << "#{person.name} exited Office: #{Time.now}"
    end
  end
end


class Person
  attr_accessor :name
  def initialize(name)
    @name = name
  end
end

zach = Person.new('Zach')
bill = Person.new('Bill')

Office.log_entry(zach)
Office.log_entry(bill)
Office.log_exit(zach)

puts Office.log

您的问题与 UML 无关,只是您使用了术语关联。不管怎样,我会尽力回答的。

  1. 如果我对你的理解正确,你希望你的 Office class 是一个单例(只有一个实例)。在 UML 中,您可以通过应用 <<singleton>> 构造型或从 class 继承您称为 Singleton 来形象化(这有点品味和环境问题)。但是你总是需要一个实例,因为在现实世界中 class 变成了一个实例。只有那个有位和字节。 class只是它的概念。
  2. 从 UML 的角度来看,您如何实现关联是无关紧要的。这只是一个概念,即两者之间存在某种关系。因此,无论您是通过 new 创建一个实例并保留它还是将其传递下去都没有关系。

如果您需要,我可以为您的 class 添加 UML 图。

在 UML 中,关系是实例之间的关系,而不是 class 之间的关系,也不在 class 实例与实例之间的关系。但在某些情况下,两个 class 之间或 class 与实例之间存在关系是很自然的。让我们以您的 person/office 为例。 class 个办公室可以命名为办公室和单个实例办公室 所以 Offices 和 Office 之间会有一种自然的 1:n 关系。 class 人可以命名为 Persons 和单个实例 Person。所以 Persons 和 Person 之间会有一种自然的 1:n 关系。 Office-Person 关系就是您在 UML 图中在 Offices 和 Persons 之间画一条线时得到的。

  1. "wrong"的感觉来自上面的解释。您的办公室将只有一个办公室。有多个人实例链接到一个完美的办公室 o.k。
  2. 对于 1:1 和 1:N 关系,如果一个实例知道另一个实例通常就足够了。对于 1:1 也可以轻松实现 "double" 链接。在你的 office:person 关系中,每个人 "knows" 它所属的办公室,这就是你传递办公室实例以供此人记住的原因。保留属于某个办公室的人员列表是可能的,但只要有某种查询方法"who are the persons that belong to this office..."
  3. 就是多余的