我正在为医生创建一个期刊系统,医生可以进入并看病人,也可以看病人的X光片以及属于X射线的图像。
这是课程布局:
http://i44.tinypic.com/w9w37d.png
我遇到的问题是,我似乎总是向患者询问信息而不是Patient.Xray或Patient.Xray.XrayImage。这是对的吗?
例如:
患者有一个getPatient方法,该方法从数据库中检索数据并设置患者的所有字段,到目前为止一直很好。
然后我在数据库中有三个Xray属于这个患者,我想创建3个Patient.Xray实例,所以我在Patient中有一个名为getXrayIDs的方法。这将检索属于该患者的所有XrayID,并将ID存储在Patient中的列表中,这些ID将在UI中的下拉框中显示。当我在下拉框中更改ID时,会调用另一个名为Patient.getXray(int XrayID)的方法,这将创建一个新的Xray实例,并在UI中显示信息。
除了Xray有一个名为getXrayImageIDs的方法之外,XrayImages几乎一样。问题是我想对一个类对象(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时检索对象而不是检索信息?
答案 0 :(得分:2)
您所谈论的问题是关于加载策略。基本上我们必须区分lazy loading和热切加载(这些策略的名称在不同来源可能有所不同)。顾名思义,延迟加载仅在实际使用时从数据库加载一个值。相反,一旦从数据库请求任何根对象,急切加载就已经从数据库中加载尽可能多的数据或可能需要的数据。
这与面向对象的设计或继承无关。您可以通过一种方式设计对象而无需更改它们,使用一种或另一种加载策略。
您选择的加载策略取决于您的应用程序和通常面临的用例。其中没有一个正确或更好的。
例如,急切加载通常会导致用户在新页面加载开始时等待更长时间,但是当他点击此页面上的某些内容时,响应会立即生效。这与延迟加载相反:有了这个,开头的页面加载速度很快,但是对于使用页面时的所有微小重新加载,必须执行新的数据库访问,因此用户总是有一个很小的等待时间对于他在页面上的每个动作。作为开发人员,您必须决定哪种方法对用户来说可能更方便。您也可以尝试这两种方法,让用户测试您的应用程序,并向您提供有关哪个应用程序让他们感觉更舒服的反馈。
在某些情况下,约束可能会迫使您进入一种或另一种策略。例如,当您处理数据库中的大型对象层次结构时,急切加载策略可能会导致非常长的加载时间。我在实际应用程序中看到加载时间超过1分钟。而你很可能不需要所有获取的信息。在这种情况下,有必要使用延迟加载。