找回密码
 欢迎注册
搜索
热搜: 活动 交友 discuz
查看: 1839|回复: 3

原来在其他论坛上回答的一些问题,也许会对作医疗信息系

[复制链接]
发表于 2003-6-6 12:43:47 | 显示全部楼层 |阅读模式
问题:
我现在在设计一套医院管理系统,病人、门诊病人和住院病人类的关系搞糊涂了,请设计高手相助。
第一感觉:病人、门诊病人和病人、住院病人是继承的关系,如果这样,有的接口方法不知道往哪里放,比方说“挂号”,挂号应该作为一个病人的方法,但是这个病人执行这个方法后应该变为门诊病人,一个“病人”对象怎样在运行时变为一个“门诊病人”对象?还有像“住院”方法。
第二感觉:使用“状态”模式,病人类具有两个状态,一个“门诊”状态,一个是“住院”状态,这样可以解决上面的问题,但是这两个状态无法抽象出公用接口,比如说“住院”状态可以获取床位号,而门诊状态就没有,好像也行不通。
第三感觉:门诊病人和病人、住院病人和病人是聚合关系,好像也不对。
大家快帮忙!
回答:
病人就是病人(称之为Patient),跟住院和门诊没有太多的关系,病人来医院进行看病的过程(称之为Visit),这个Visit类才是跟住院还是门诊相关的。所以无论病人是看门诊还是住院,他都是Patient,他的基本信息是不会改变的,Patient类里包含的主要信息是病人的原始信息和一些附加信息,如果要考虑全的话,还需要考虑过敏信息(Allergy类)等,Patient与他的附件信息、Allergy等类之间的关系是聚集关系。
Visit即看病的过程类,是单独的一个类,这个类里可以记录病人的类型(可以参考HL7中的PV1,PV2),这个类型包括,住院、门诊、急诊等等,这个类里除了病人的类型外还会记录很多信息,如,时间、总费用、与其相关的医生是谁,与财务相关联的信息等等。
在这里Patient和医院(Hospital)之间是一种关联关系,这种关联关系就是Visit,所以Visit是Patient和Hospital之间的关联类。
针对挂号来说,它不是Patient的一个方法,而是单独的一个控制类,可以称之为Admit,其实你可以把入院登记和挂号理解为同一种类型的类可以统一称它们为Admit,它提供了一种医院与病人之间的契约,让病人可以在医院里从事一些活动,也就是触发了Visit的产生,所以它是一种控制类,你在使用这个类的时候,需要new patient,new visit等等。
总结来说,这里包括的类包括Hospital,Patient,Visit,Admit等类,如果要把病人信息记得全面还需要包括Allergy等类,住院和门诊只是病人访问的一种形态。
从OO的角度来说,需要注意很多问题,首先类的类型有很多种,不过最重要的是实体类(Entity),控制类(Control)和边界类(boundary),在实际分析的时候不要把认为是动作的东西就向类里面放(如,你们讨论的挂号放入病人类里面),它很有可能是一个控制类。面向对象很重要的一个目的是要保持系统的弹性,那么弹性如何保持呢,这个话题说起来太长,有空时在详谈,在这里只说与你们问题相关的一点,那就是区分业务领域中稳定与善变的界限,然后把善变的东西封装起来。对应到类里又是如何体现的呢?Entity在业务领域里很多时候是比较稳定的,如Patient,Hospital,Visit这些类,它们永远都存在,Control对应到业务上很多时候表达的是一种流程的概念,流程在业务领域是善变的,如挂号,看诊等过程,通过Control类封装了这些善变的流程用来与外界交互,如,针对挂号和入院登记来说,本质上它们都是注册,所以你可以先封装一个注册(Admit)接口,对客户端使用的是Admit接口,而接口里面封装的流程如何变外界是不知道的,这样就体现了弹性,如果你们总是谈模式,那这样设计是FACADE模式的最好体现。而Entity,Control,boundary这样分层的结构也体现了人们常说的MVC这些模式的精髓,所以模式这种东西,你不用刻意去追求,你真正理解了OO的很多精神,你在回过头来看模式,你就豁然开朗了,最重要的是真正理解OO的基础和精髓。
我在来解释一下,为什么挂号不是病人的一个方法,从业务角度来说,挂号是医院规定的一个流程,一定要注意它是医院规定的,与病人没有什么本质上的联系(也要想明白什么是本质),今天医院规定病人来医院需要挂号,明天也许就会取消调挂号这个流程,而无论存在还是不存在挂号流程,病人信息、病人附加信息、病人过敏信息这些类永远都存在,永远都不会改变;如果你把挂号当做一个方法放到病人类中,你又如何能适应这种变化呢?而当你把挂号单独提出来,是不是好很多呢?这只是很小的一个方面,如果你把挂号当做方法放入病人类中,那么看诊,检查,化验你又如何处理呢?如果都放到病人类中,那还有其他类吗?那就又回到传统的方式上去了。

问题:
病人挂号,也可从医院的角度定义了病人,然后他再挂号。换句话说,病人是医院的一部分,怎么见得就没有“调用”医院的挂号功能呢?当然,这只是举个例子,并不是说当初提问者就没有其他层次设计。他并没有展开谈那些问题。  

回答
医院和病人是一种供求关系,就象公司和客户之间的关系一样,你不能说客户是公司的一部分,我今天来你这里买,你的产品不好,服务不好,明天我可以不来的,客户是公司外部的东西,客户来不来你这里买东西,看不看病,是由他自己决定的,不是由公司和医院决定的(这是本质),所以它们之间是通过一种契约建立了一种供求关系,根本谈不到病人是医院的一部分,如果你强调部分,医院里的医生、科室等才是医院的一部分,这些是由医院决定的,所以从模型上来讲病人来你的医院看病或客户来你公司买东西的这次沟通,即本次Visit,才是它们之间本质的关系。至于挂号,它是医院和病人建立契约的一个活动,它是医院规定的一个流程,跟病人的本质没有关系,只是医院需要根据挂号这个活动记录下来病人信息,本次Visit信息等等,这个挂号是单独的一个类,它要new Patient、new Visit等类,它是病人在跟你建立关系时才发挥作用的,不属于病人本质的范畴,所以把它放到病人类里当一个方法是错误的。
发表于 2003-6-6 13:49:25 | 显示全部楼层

原来在其他论坛上回答的一些问题,也许会对作医疗信息系

这好像是www.umlchina.com上的讨论啊?老兄在umlchina上叫什么名字啊?:)
 楼主| 发表于 2003-6-6 15:04:01 | 显示全部楼层

原来在其他论坛上回答的一些问题,也许会对作医疗信息系

xue_zhong
发表于 2003-6-15 23:12:34 | 显示全部楼层

原来在其他论坛上回答的一些问题,也许会对作医疗信息系

实际上,如果不懂得OO和UML,我们会很难理解HL7,特别是V3。所以 xuezhong一点也没有离题。
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

快速回复 返回顶部 返回列表