淺談Java類的設計

需求:

  • 有一個在線教育的系統一個練習題模塊,需要在練習模塊設計題目。題目有母題(每種類型題的典型題),重點題和普通的題目。
  • 一道題可能是母題也可能是重點題,或者兩者兼得;但如果某道題沒有分配類型,那它就不可能是母題,因爲類型題是根據母題來分配的

分析:

  1. 母題、重點題、普通題都是題目的一種,那麼題目就是他們仨的最高抽象,這麼來看題目可以暫定爲接口(因爲接口比繼承關係要好得多)。
  2. 母題和重點題不是相互排斥的關係,也不是相互包含的關係(如果使用聚合,那麼到底是母題包含重點題?還是重點題包含母題?這肯定不對吧)所以這兩者的關係不太好確定,那麼最後再回來看他。但我覺得母題和重點題應該是同級的關係
  3. 還需要考慮一個問題,母題和類型題之間的關係,母題一定是類型題,但類型題不一定是母題,這麼看來是類型題包含了母題
    題目可能是有類型的,也可能是無類型的。

那我們來看看現在能整理出什麼來

圖1 初步草圖

  • 看似還可以,但是沒有體現出母題和重點題之間的關係,如果一道題既是母題又是重點題,那麼將無法表示。
  • 那麼,如果我們將母題和重點抽象爲接口呢?嘗試這種方案,普通題不能再抽象,他就是實體。注意,無類型的題需要特別關注,母題不可能沒有類型,因爲類型就是它自己,而重點題和普通題是可以沒有類型的

畫出草圖,這樣我們解決了一道題既是母題又是重點題無法表示的問題

圖2 終極草圖
注意:母題和無類型互斥的,所以在類型的接口裏添加方法判斷是否有類型
圖3 最終UML圖

  • 不過這樣會導致一個問題,一道無類型的題也可以是母題,這就得在母題的接口去添加判定是否有類型的方法。這也是我能想到的最好的解決方案。希望如果您有更好的點子,煩請提出意見,感激不盡

PS:我也想過是否可以用一個題目類來表示所有的題,母題和重點題用類中一個屬性來表示,沒有沒麼做的原因就是“上帝類“太冗雜,改動起來十分困難,擴展性極差。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章