房间实体和域模型,它们应该分开吗?

时间:2018-03-04 18:26:24

标签: android orm architecture

在我看来,Room上的许多指南(以及其他ORM)专注于创建Room实体,并从此开始将这些作为其域模型使用。但是,如果我的模型需要其实际结构来执行某些业务逻辑呢?

例如,参加以下课程:

class Report(var id: Long, var patient: Patient, var surgery: Surgery) {

    var minimumAllowableBloodLoss: Double = 0.0
        get() = ((this.patient.hemoglobin - this.patient.minHemoglobin) / this.patient.hemoglobin) * this.patient.bloodVolume * this.patient.weight
        private set

    var hourlyDiuresis: Double = 0.0
         get() = this.patient.diuresisOutput / this.surgery.duration
         private set

    var urineOutput: Double = 0.0
        get() = this.hourlyDiuresis / this.patient.weight
        private set

    var intakeSupply: Double = 0.0
        get() = this.patient.totalIntake / this.patient.weight
        private set

    var finalFluidBalance: Double = 0.0
        get() = this.patient.totalIntake - this.patient.totalOutput
        private set

}

如果我把这个类变成了Room实体,我就不得不将我的对象引用改为外键,基本上不可能从这个类中进行我需要的计算。

当然,我的第一直觉是完全废弃这个想法并创建一个表示对象,我相信它也被称为一个持久性模型":

@Entity
data class ReportRow(
    var patientId: Long, var surgeryId: Long) {
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0
}

但这也意味着我必须创建从持久性模型到域的转换方法,反之亦然。

这让我相信也许我完全错过了一些东西,或者我没有正确使用这些工具,这些案例有更好的选择吗?

1 个答案:

答案 0 :(得分:0)

它们应该分开。

来自docs

  

实体:表示数据库中的表。

尽管文献中经常将实体称为“数据模型”,但许多示例简化了设计并假定实体=业务模型。

但是,这种设计很可能违反Single Responsibility Principle,一旦您希望将数据保留在云中就可能很快崩溃,因为在云中可以使用某些非SQL解决方案来保留数据。