Различные способы обеспечения отношений ассоциации

Для связи между двумя объектами:

Если у меня есть объект "Офис" и объект "Персона". Я бы смоделировал это как ассоциацию, и я придумал приведенный ниже пример кода как средство его принудительного применения.

Но, глядя на это, есть много вещей, с которыми я бы хотел чувствовать себя более комфортно.

Первый вопрос: объект 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

2 ответа

Решение

В мышлении UML отношения существуют между экземплярами, а не между классами, а также между классами и экземплярами. Но есть случаи, когда было бы естественно иметь связь между двумя классами или между классом и экземпляром. Давайте возьмем ваш личный / офисный пример. Класс офисов может быть назван "Офисы" и "Офис единого экземпляра". Таким образом, между Офисами и Офисом будет естественная связь 1:n. Класс лиц может быть назван Persons и один экземпляр Person. Таким образом, между людьми и людьми будет естественное отношение 1:n. Отношение Office-Person будет тем, что вы получите, когда проведете линию между офисами и сотрудниками на диаграмме UML.

  1. "Неправильное" чувство исходит из объяснения выше. Ваши офисы будут иметь только один офис. Есть несколько экземпляров, связанных с этим одним офисом, что совершенно нормально
  2. Для отношений 1:1 и 1:N обычно достаточно, если один экземпляр знает другой. Для 1:1 "двойное" связывание также легко возможно. В вашем офисе: отношения между людьми, каждый человек "знает" офис, которому он принадлежит, поэтому вы передаете офисный экземпляр, чтобы этот человек запомнил. Ведение списка лиц, принадлежащих к офису, возможно, но излишне, если есть какой-то способ сделать запрос "кто те, кто принадлежит к этому офису..."

Ваш вопрос не имеет отношения к UML, за исключением того, что вы используете термин Ассоциация. Во всяком случае, я постараюсь ответить на него.

  1. Если я вас правильно понимаю, вы хотите, чтобы ваш Office класс должен быть одиночным (только один экземпляр). В UML вы можете визуализировать это, применяя <<singleton>> стереотип или путем наследования от класса, который вы называете Singleton (это немного вопрос вкуса и обстоятельств). Но вам всегда нужен экземпляр, так как в реальном мире класс становится экземпляром. Только у этого есть биты и байты. Класс - это просто его концепция.
  2. С точки зрения UML не имеет значения, как вы понимаете свою связь. Там просто концепция, что между ними есть какая-то связь. Так ли вы создаете экземпляр с помощью new и держать это, или вы получите это не имеет значения.

Я могу добавить диаграмму UML для ваших классов, если вам это нужно.

Другие вопросы по тегам