【问题标题】:different ways of enforcing association relationship执行关联关系的不同方式
【发布时间】:2015-05-17 15:33:04
【问题描述】:

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

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

但是看着它,有很多我想要更舒服的东西。

第一个问题: Office 对象实际上是一个类。我这样做是因为我只想要一个办公室 - 实例化它感觉不对。但是我觉得我在将实例化的人与“静态”类之间的关系描述为关联时遗漏了一些东西?

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

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

【问题讨论】:

    标签: ruby uml associations


    【解决方案1】:

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

    1. “错误”的感觉来自上面的解释。您的办公室将只有一个办公室。有多个人员实例链接到一个完全没问题的办公室。
    2. 对于 1:1 和 1:N 关系,一个实例知道另一个实例通常就足够了。对于 1:1,“双重”链接也很容易实现。在你的办公室:人关系中,每个人都“知道”它所属的办公室,这就是为什么你传递办公室实例让这个人记住的原因。保留属于某个办公室的人员列表是可能的,但只要有某种方法可以查询“谁是属于该办公室的人员......”

    【讨论】:

    • 您好,感谢您的回答,很抱歉回复晚了。在这种情况下,我希望(除了为了学习之外没有其他原因)将建筑物映射到类模式。例如,我可能正在查看 House1::Office、House1::Bathroom 等。在这种情况下,我只需要类和实例化对象。这是一种愚蠢的编程方式吗?对我来说,这就是我想象的 ORM 的运作方式,其中类代表表(房间)。在某种程度上,这似乎几乎是一个文档数据库?
    • @ZachSmith - 请通过我的联系方式之一给我发送个人信息。完成您的示例后,我们可以在此处发布结果。
    【解决方案2】:

    您的问题与 UML 无关,只是您使用了“关联”一词。无论如何,我会尽力回答。

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

    如果你需要,我可以为你的类添加 UML 图。

    【讨论】:

    • 感谢您的回答,在 Ruby 中,类本身就是对象,因此上面定义的类作为对象工作,您无需实例化它即可使用它。在这种情况下,我想更多地将类用作命名空间,而不是真正的对象模板。我想它实际上更像是一个表格的 ORM 表示。除了你可能不会将数据存储在命名空间本身......而是存储在文件或数据库中
    • 我了解 Ruby 并使用 UML 对一些东西进行了建模。您可能正在谈论您可以在 Ruby 中做的脚手架。但是你把事情搞混了。类是一个抽象概念,实例是它的生命表示。 Ruby 类仍然是一个概念。你应该考虑一下 Ruby 实现得相当完美的 MVC。
    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    相关资源
    最近更新 更多