Различные способы обеспечения отношений ассоциации
Для связи между двумя объектами:
Если у меня есть объект "Офис" и объект "Персона". Я бы смоделировал это как ассоциацию, и я придумал приведенный ниже пример кода как средство его принудительного применения.
Но, глядя на это, есть много вещей, с которыми я бы хотел чувствовать себя более комфортно.
Первый вопрос: объект 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:1 и 1:N обычно достаточно, если один экземпляр знает другой. Для 1:1 "двойное" связывание также легко возможно. В вашем офисе: отношения между людьми, каждый человек "знает" офис, которому он принадлежит, поэтому вы передаете офисный экземпляр, чтобы этот человек запомнил. Ведение списка лиц, принадлежащих к офису, возможно, но излишне, если есть какой-то способ сделать запрос "кто те, кто принадлежит к этому офису..."
Ваш вопрос не имеет отношения к UML, за исключением того, что вы используете термин Ассоциация. Во всяком случае, я постараюсь ответить на него.
- Если я вас правильно понимаю, вы хотите, чтобы ваш
Office
класс должен быть одиночным (только один экземпляр). В UML вы можете визуализировать это, применяя<<singleton>>
стереотип или путем наследования от класса, который вы называетеSingleton
(это немного вопрос вкуса и обстоятельств). Но вам всегда нужен экземпляр, так как в реальном мире класс становится экземпляром. Только у этого есть биты и байты. Класс - это просто его концепция. - С точки зрения UML не имеет значения, как вы понимаете свою связь. Там просто концепция, что между ними есть какая-то связь. Так ли вы создаете экземпляр с помощью
new
и держать это, или вы получите это не имеет значения.
Я могу добавить диаграмму UML для ваших классов, если вам это нужно.