gpt4 book ai didi

design-patterns - 如何在类图中显示具有两个可能值的两个不同变体的类?

转载 作者:行者123 更新时间:2023-12-05 04:23:51 25 4
gpt4 key购买 nike

我的项目中有一个实体 Question(摘要)。可以用英语或俄语询问。此外,它可以由学生或非学生询问。所以,我正在寻找在我的类图中显示它的完美方式。

我看到的唯一方法是创建四个不同的类(English-Student、English-NonStudent、NonEnglish-Student、NonEnglish-NonStudent)。我想,将它们存储在不同的表(类图中的不同类)中将是最有效的方法。

这种方法有什么缺点?会有更好的设计吗?

最佳答案

当前设计的局限性

您当前的设计忽略了这样一个事实:无论谁用哪种语言提问,问题都有一些共同的特征和行为:

  • 这会在设计和实现中引入冗余,从而降低维护效率并更容易出错。例如,假设您想向问题添加一些投票分数,例如在 StackOverflow 上:您必须在 Question 的每个变体中引入您的更改。如果您在修订版中忘记了其中一个,代码会在某些特定情况下中断(通常是未经过良好测试的情况)。

  • 设计不符合 open/closed principle : 如果您要添加其他语言,例如乌克兰语和法语,你的设计会被破坏,你将不得不添加更多的类并修改所有使用/处理问题的类/代码。

如何改进?

首先,作者的语言或身份(学生与非学生)是否会导致问题行为发生任何变化?

如果不是,最简单的方法是向类Question 添加一个属性language。本着同样的精神,你会添加一个 «enumeration»识别作者的类型(除非问题尚未与提供类​​似信息的作者相关联)。

如果确实存在不同的行为,或者根据组合的不同,您需要一些额外的属性,那么您可以使用继承。但是您很快就会陷入非常深的类层次结构或多重继承。

更好的选择是选择 composition over inheritance : 通常使用 strategy pattern语言和作者类别;虽然我可以想象你应该考虑 decorator pattern例如,如果学生问题比非学生问题包含更多信息。

关于design-patterns - 如何在类图中显示具有两个可能值的两个不同变体的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73637463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com