关于继承的一般问题

时间:2013-08-14 22:49:24

标签: c# oop inheritance

我正在为医生创建一个期刊系统,医生可以进入并看病人,也可以看病人的X光片以及属于X射线的图像。

  • 可能有多名患者。
  • 每位患者可以有不止一个X射线。
  • 每个Xray都可以有多个XrayImage。

这是课程布局:

enter image description here

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时检索对象而不是检索信息?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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