0

我正在为医生创建一个日志系统,医生可以在其中查看患者并查看患者的 X 射线和属于该 X 射线的图像。

  • 可以有不止一名患者。
  • 每位患者可以有不止一张 X 光片。
  • 每个 X 射线可以有多个 XrayImage。

这是班级布局:

在此处输入图像描述

http://i44.tinypic.com/w9w37d.png

我遇到的问题是,我似乎总是向患者询问信息,而不是 Patient.Xray 或 Patient.Xray.XrayImage。这个对吗?

例如:

Patient 有一个 getPatient 方法,它从数据库中检索数据并设置 Patient 中的所有字段,到目前为止一切顺利。

然后,例如,我在数据库中有三个属于该患者的 X 射线,我想创建 3 个 Patient.Xray 实例,因此我在 Patient 中有一个名为 getXrayIDs 的方法。这将检索属于该患者的所有 XrayID,并将 ID 存储在 Patient 的列表中,这些 ID 显示在 UI 中的下拉框中。当我在下拉框中更改 ID 时,会调用另一个名为 Patient.getXray(int XrayID) 的方法,这会创建一个新的 Xray 实例,并且信息会显示在 UI 中。

XrayImages 的工作原理几乎相同,只是 Xray 有一个名为 getXrayImageIDs 的方法。

问题是我想处理一个类对象(Patient、Xray、XrayImage),但同时我不想从数据库中检索到不必要的数据,所以这是一个好方法吗?

感觉就像我没有以正确的 OOP 编程,我应该忽略我从数据库中检索到的数据量,以正确的 OOP 编程,然后修复数据库性能。

所以我应该这样编程:

 Patient patient = new Patient()
 patient.getXrays() // This one should create a new Xray instance
                 // and Patient should have references to these instances.
 patient.xray[i].getXrayImages // This one should create a new XrayImage 
        //instance and Xray should have references to these instances.

另一个想法:当下拉框的值被更改时(如本例所示),它应该从 Xray 和 XrayImage 类中检索数据,而不是从数据库中检索数据。我是否应该尝试一次将数据库中的数据加载到 Xray 和 XrayImage 类中,然后用户将获得信息并将针对对象工作,而不是每次更改 XrayID 时都检索信息?

4

1 回答 1

2

您正在谈论的问题是关于加载策略。基本上我们必须在这里区分延迟加载和急切加载(这些策略的名称在不同的来源中可能不同)。懒加载,顾名思义,只是在实际使用时才从数据库中加载一个值。相反,一旦从数据库请求任何根对象,预加载就已经从数据库加载尽可能多的数据或可能需要的数据。

这与面向对象的设计或继承无关。您可以以一种方式设计对象,而无需更改它们,使用一种或另一种加载策略。

您选择哪种加载策略取决于您的应用程序和通常面临的用例。其中没有一个普遍正确或更好的。

例如,急切加载通常会导致用户在新页面加载开始时等待更长的时间,但是当他单击此页面上的某些内容时,会立即响应。与延迟加载相反:这样,一开始的页面加载速度很快,但是对于使用页面时所有微小的重新加载,必须执行新的数据库访问,因此用户总是有很短的等待时间对于他在页面上的每个操作。作为开发人员,您必须决定哪种方法对用户来说可能更方便。您也可以尝试这两种方法,让用户测试您的应用程序,并就哪一个应用程序让他们感觉更舒服向您提供反馈。

在某些情况下,约束可能会迫使您采用一种或另一种策略。例如,当您处理数据库中的大型对象层次结构时,急切加载策略可能会导致加载时间非常长。我在现实世界的应用程序中看到了超过 1 分钟的加载时间。而且您很可能不需要所有获取的信息。在这种情况下,有必要使用延迟加载。

于 2013-08-14T22:59:54.037 回答