Class 版本相关时的建模版本控制

Class 版本相关时的建模版本控制,class,web-applications,versioning,modeling,class-diagram,Class,Web Applications,Versioning,Modeling,Class Diagram,我正在为类图建模,我完全被这个问题所困扰: 我的新web应用程序有“卡片”(关于主题的条目),用户可以通过wiki修改这些卡片。但与维基不同,不同的卡片持有不同的数据。与Wiki不同,卡片与数据库中的其他卡片明确相关。让我用一个虚拟示例向您展示我最初是如何设计它的: /** Similar to strategy/bridge pattern */ class Card<T extends CardInfoVersion> is composed of T // container

我正在为类图建模,我完全被这个问题所困扰:

我的新web应用程序有“卡片”(关于主题的条目),用户可以通过wiki修改这些卡片。但与维基不同,不同的卡片持有不同的数据。与Wiki不同,卡片与数据库中的其他卡片明确相关。让我用一个虚拟示例向您展示我最初是如何设计它的:

/** 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
/**类似于策略/桥接模式*/
类卡片由T//版本容器组成
类CardInfo版本//一个版本
类绘制扩展了CardInfo版本
班级博物馆由绘画组成
优雅、干净,但错误。使用这种方法,博物馆与绘画版本相关,而不是与绘画本身相关。我想到的第一个解决方案是:

class Card<T extends CardInfoVersion> is composed of T
class CardInfoVersion
class Painting extends CardInfoVersion
class Museum extends CardInfoVersion is composed of Card<Painting>
类卡由T
类信息
类绘制扩展了CardInfo版本
课堂信息由卡片组成
这种方法很有味道。CardInfo版本下的类层次结构是巨大的,所以UML模型将是不可读的,而Card类将充满对CardInfo版本子类的ORM引用。然后我想到了这个:

class Card is composed of proposedModifications: Set<Card>
class Painting extends Card
class Museum extends Card is composed of Paintings
类别卡片由提议的修改组成:集合
班级绘画扩展卡
班级卡是由绘画组成的
它也有气味。事实上,这一切都是混乱的,因为版本消失了。它还要求管理员验证对卡片提出的修改

我真的不知道如何解决这个问题记住:如果CardInfo的子类不相互关联,那么原始设计就可以了。


请帮忙

我会采取领域驱动的方法。你的用户会称之为“卡片”吗?这似乎是一个技术问题,但你把技术问题(卡片)和领域问题(博物馆、绘画)混为一谈

如果不了解您的域和用户,很难猜测您的最终解决方案是什么

也许这是:

class Museum extends Content is composed of Paintings
class Painting extends Content

class Card is composed of Set<Content>
类博物馆的内容由绘画组成
类绘画扩展了内容
班级卡由一套
这样,您就可以将域模型(博物馆、绘画)与视图模型(卡片)分离。我甚至会更进一步,不使用继承(使用普通的旧java对象)路线,但我不知道您的确切实现


如果你想了解更多关于这种设计风格的信息,这是很有帮助的。

@Michael有一个很好的观点。博物馆是一个领域对象,绘画也是。听起来你好像在用这些“卡片”收集人们对这些画的评论。这表明您正试图建立一个CardFile模型。卡片档案是一组卡片。卡片上有相关博物馆或绘画的参考

以下是一些提示:

  • 写出一些用户故事或用例。你陷入了程序员过早思考的困境;先想想你想做什么。如果你不喜欢这样做,那么使用这个模型:“某人”“做了某事”“以获得一些结果。”例如,“我得到了所有关于Magritte'CeçI n'es pas une pipe'的卡片,以便找出哪个博物馆有它。”

  • 为类编写一些“用户代码”。伪代码很好,但它确实有助于设计接口

所以你可以写:

cards := cardfile.getAllCards(ceciNesPas)
for each card in cards
do
    print card.getPainting().getMuseum()
od
我不是发誓这是最好的方式,而是一个例证

  • 如果这里的“版本控制”是指有许多cardcs与同一幅画相关联,那么现在就设置好了。如果卡片上的格式、方法、数据项随着时间的推移而改变,那么您需要确定卡片的特定内容,并将其作为超类。然后,您可以使更高版本的卡成为卡的新子类:保持不变的内容在超类中,不同的parfts是子类的业务

感谢您的评论!我会考虑的。