Я определяю лучший подход к проектированию для объекта, который может иметь отношения с другими типами других объектов.Но может принадлежать только одному типу одновременно.Взаимоисключающие отношения «один ко многим» - это лучшая фраза, которую я могу придумать, чтобы описать ситуацию.
Пример:
У меня есть и проекты, и процедуры.Каждый может содержать несколько задач.Задача может принадлежать Проекту или Процедуре, но не более чем одновременно.Задача может быть перемещена из Проекта в Процедуру и наоборот.
Таким образом, в любой конкретный момент Задача имеет отношение один-ко-многим с Проектом или отношение один-ко-многим с Процедурой.
В данный момент я рассматриваюЗадача как таковая:
class Task(id, name, project_id, procedure_id):
if project_id and procedure_id:
throw Exception("A Task can not be assigned to a Project and a Procedure at the same time")
self.id = id
self.name = name
self.project_id = project_id
self.procedure_id = procedure_id
def move_to_project(project_id):
self.procedure_id = None
self.project_id = project_id
...
Задача защитит инвариант, что она может принадлежать только одному проекту или процедуре.Фабричные методы в Project и Процедуре могут создавать Задачу с соответствующим ID отношения.
Задача не находится в одной и той же совокупности, поэтому я хочу смоделировать отношения по идентичности.
Мне кажется, что единственный способ защитить этот инвариант - это смоделировать задачупуть.В противном случае я бы получил гигантскую совокупность процедур / проектов / задач.
Похоже ли это на здравый подход, или у кого-нибудь есть советы по альтернативным подходам к проектированию, которые, возможно, стоит изучить?