如何处理面向对象语言中的类之间的关系?

时间:2019-05-13 12:01:21

标签: java class oop kotlin

我正在尝试使用Java / Kotlin(实际上是任何OOP语言)对情况建模。我必须制作一个任务管理应用。

要求

  • 应该有一个Task类和一个Tag
  • 一个Task可以有多个Tag,而一个Tag可以有多个Task与之关联
  • 每个Task可以具有多个子任务。每个子任务本身就是一个Task


我正在使用具有以下4个表的关系数据库:

  • 任务
  • 标签
  • TasksAndTags(关联任务和标签)
  • TasksAndSubTasks(将Tasks与Tasks关联起来代表子任务)

数据库架构非常简单,但我在选择应用程序代码中的最佳选项时遇到了麻烦。

我有3个选项。如果您更喜欢GitHub要点,请参见this链接。它突出显示了代码。


选项1

data class Tag (val id: Long, val name: String, val icon: Int)
data class Task(val id: Long, val name: String, val tags: List<Tag>, val subTasks: List<Task>)

优点

  • 设计更加“面向对象”和直观

缺点

  • 使用关系数据库确实很难。循环使这一点更加复杂
  • 即使我根本不访问子任务字段,每次加载任务时我都必须加载所有子任务
  • 由于这些子任务中的每个子任务都有自己的子任务,因此上述问题变得更加严重

选项2

data class Tag (val id: Long, val name: String, val icon: Int)
data class Task(val id: Long, val name: String, val tags: List<Tag>, val subTasks: List<Long>)

优点

  • 由于我们仅存储ID,因此必须加载较少的数据
  • 没有问题,因为周期

缺点

  • 使用id就像处理关系模型而不是面向对象模型

选项3

data class Tag (val id: Long, val name: String, val icon: Int)
data class Task(val id: Long, val name: String, val tags: List<Tag>)

优点

  • 结构与db(最小化的映射代码)中实体/表的结构匹配
  • 每个对象很小

缺点

  • 我们必须使用其他方法来访问子任务。例如:通过使用getSubTasksForTask(task)
  • 形式的方法
  • Task类本身并没有告诉我们有关子任务概念的存在

问题1 :由于对象之间的关系而出现此问题。我认为这种情况确实很普遍,必须有一个很好的方法来应对。请让我知道首选哪个选项,以及如何最大限度地减少它的缺点。

问题2 :在所有选项中,我都使Task持有其标签,但没有使Tag持有其Task。虽然这对我来说可能很直观(不一定正确),但是处理这种关系的最佳方法是什么?

编辑:我在Android上。因此,延迟加载对我来说是不可能的:(

0 个答案:

没有答案