浅谈Java类的设计

需求:

  • 有一个在线教育的系统一个练习题模块,需要在练习模块设计题目。题目有母题(每种类型题的典型题),重点题和普通的题目。
  • 一道题可能是母题也可能是重点题,或者两者兼得;但如果某道题没有分配类型,那它就不可能是母题,因为类型题是根据母题来分配的

分析:

  1. 母题、重点题、普通题都是题目的一种,那么题目就是他们仨的最高抽象,这么来看题目可以暂定为接口(因为接口比继承关系要好得多)。
  2. 母题和重点题不是相互排斥的关系,也不是相互包含的关系(如果使用聚合,那么到底是母题包含重点题?还是重点题包含母题?这肯定不对吧)所以这两者的关系不太好确定,那么最后再回来看他。但我觉得母题和重点题应该是同级的关系
  3. 还需要考虑一个问题,母题和类型题之间的关系,母题一定是类型题,但类型题不一定是母题,这么看来是类型题包含了母题
    题目可能是有类型的,也可能是无类型的。

那我们来看看现在能整理出什么来

浅谈Java类的设计_第1张图片

  • 看似还可以,但是没有体现出母题和重点题之间的关系,如果一道题既是母题又是重点题,那么将无法表示。
  • 那么,如果我们将母题和重点抽象为接口呢?尝试这种方案,普通题不能再抽象,他就是实体。注意,无类型的题需要特别关注,母题不可能没有类型,因为类型就是它自己,而重点题和普通题是可以没有类型的

画出草图,这样我们解决了一道题既是母题又是重点题无法表示的问题

浅谈Java类的设计_第2张图片
注意:母题和无类型互斥的,所以在类型的接口里添加方法判断是否有类型
浅谈Java类的设计_第3张图片

  • 不过这样会导致一个问题,一道无类型的题也可以是母题,这就得在母题的接口去添加判定是否有类型的方法。这也是我能想到的最好的解决方案。希望如果您有更好的点子,烦请提出意见,感激不尽

PS:我也想过是否可以用一个题目类来表示所有的题,母题和重点题用类中一个属性来表示,没有没么做的原因就是“上帝类“太冗杂,改动起来十分困难,扩展性极差。

你可能感兴趣的:(java)