Я моделирую диаграмму классов и абсолютно застрял в этой проблеме:
В моем новом веб-приложении есть «карточки» (записи о предмете), которые могут быть изменены пользователями, например, вики. Но в отличие от вики разные карты содержат разные данные. Кроме того, в отличие от вики, карты напрямую связаны с другими картами в базе данных. Позвольте мне показать вам, как я изначально проектировал это, используя фиктивный пример:
/** Similar to strategy/bridge pattern */
class Card<T extends CardInfoVersion> is composed of T // container of versions
class CardInfoVersion // one version
class Painting extends CardInfoVersion
class Museum extends CardInfoVersion is composed of Paintings
Элегантно, чисто, но неправильно . Используя этот подход, музеи привязаны к версиям живописи, а не к самой картине . Первое решение, которое пришло мне в голову, было таким:
class Card<T extends CardInfoVersion> is composed of T
class CardInfoVersion
class Painting extends CardInfoVersion
class Museum extends CardInfoVersion is composed of Card<Painting>
Этот подход пахнет. Иерархия классов в CardInfoVersion огромна, поэтому модель UML будет нечитаемой, а класс Card будет заполнен ссылками ORM на подклассы CardInfoVersion. Тогда я придумал это:
class Card is composed of proposedModifications: Set<Card>
class Painting extends Card
class Museum extends Card is composed of Paintings
Который также пахнет. На самом деле, это все запутано, так как версия исчезает. Это также требует от администраторов проверять предложенные модификации карт.
Я действительно не знаю, как решить эту проблему. Помните: оригинальный дизайн был бы в порядке, если бы подклассы CardInfoVersion не были взаимосвязаны.
Пожалуйста, помогите!