该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2003-11-19
借此帖帮助我消除一个疑问吧。
通常我们需要持久的是纯粹的数据对象---只有数据没有业务操作。 但随着如果用对象建模,极有可能存在这么一个问题,我的实体对象具有较多的体现逻辑的行为。比如,实体对象:timeRange. 它不仅具有属性,也具有行为。 public class XxxTimeRange extends ITimeRange{ private XXXX startTime; private XXXX endTime; public ITimeRange intersect(ITimeRange timeRange);; } 从软件分层次以及考虑不暴露实体对象的角度看,也即是采用DTO或者VO,那么我这个timeRange如何处理?客户程序可能要利用我的timeRange的借口。在DTO或者VO里面重复实现一次嘛?这明显不可能。DTO和VO基本上纯粹的数据对象。抑或是增加一个类似Adapeter的东西? 此时,我们应该如何处理, |
|
返回顶楼 | |
发表时间:2003-11-19
bruce 写道 如果考虑OLAP, OLTP的话, 内存和CPU则会变成主要的瓶颈, I/O倒是其次了.
OLAP 中 I/O 是首先需要考虑的瓶颈,所以用于 OLAP 的表中都设计有大量的冗余字段。复杂的 OLTP,I/O 也会成为瓶颈。我综合 potian 和 robbin 的意见,这个瓶颈应该在系统开发之后通过优化来解决,因为这基本上是一个局部问题。Kent 说,不要为明天而设计,我的理解是出于成本上的考虑,过早地考虑一些实现细节会给开发造成很多不便。而且这些问题的影响未必真的那么大。 OLAP 不是基于关系模型的(是以 Cube 为核心的),对象驱动的建模方式在这里行不通(在这里对象建模解决的根本就不是核心问题)。 对于报表一类的复杂应用,对象建模的方式也不是很适合。以后我会把我们遇到的一些复杂的问题贴出来大家讨论。我们用的也不是数据建模,虽然我们设计了很多对象,但是很难说是对象驱动的,甚至可以说是以数据结构和算法为中心的(我们在其中用了一些很精巧的数据结构,抱歉我不能透露)。我们这个报表系统中大量对象都建立在内存中,只有适当的时候才持久保存到数据库中。也不是简单的映射到数据库中,有比较复杂的映射逻辑。 世界上并不只有对象建模或者数据建模两种东西,也不是非黑即白的。多关注一些数据结构和算法会很有帮助。虽然它有些难,但是有时候却是解决问题的利器。比如我们在内存中实现了 BTree 和稀疏距阵,还实现了向量的复杂计算。你能说这是对象建模吗?我的两个朋友在这方面有非常强的功力,掩盖了我很多时候完全依靠对象建模来解决问题所感到的虚弱。 |
|
返回顶楼 | |
发表时间:2003-11-19
weihello 写道 借此帖帮助我消除一个疑问吧。
通常我们需要持久的是纯粹的数据对象---只有数据没有业务操作。 但随着如果用对象建模,极有可能存在这么一个问题,我的实体对象具有较多的体现逻辑的行为。比如,实体对象:timeRange. 它不仅具有属性,也具有行为。 public class XxxTimeRange extends ITimeRange{ private XXXX startTime; private XXXX endTime; public ITimeRange intersect(ITimeRange timeRange);; } 从软件分层次以及考虑不暴露实体对象的角度看,也即是采用DTO或者VO,那么我这个timeRange如何处理?客户程序可能要利用我的timeRange的借口。在DTO或者VO里面重复实现一次嘛?这明显不可能。DTO和VO基本上纯粹的数据对象。抑或是增加一个类似Adapeter的东西? 此时,我们应该如何处理, 两个考虑途径: 1、把控制方法切分出来,单独做一个控制类来控制它。 2、当需要的情况下,给PO加入一些业务方法之后,PO就变成了BO,至于BO如何和PO进行同步的问题,在Hibernate原理版有一个比较深入的探讨,可以参考一下。 http://forum.hibernate.org.cn/viewtopic.php?t=1116 |
|
返回顶楼 | |
发表时间:2003-11-19
potian 写道 理论上虽然如此。
但在我做过的项目中,绝大多数项目,都不存在着ShenLi你说的这种情况。 我做过和数据库相关的项目类型比较多,包括ERP系统、行业软件(例如医院系统和宾馆系统、水泥厂系统、物业软件、证券交易系统)、通用软件(例如个人助理软件、通用进销存)、政府软件(全省性质的人力管理、资源管理,整个地区性质的工商、税务系统、公安交警)、商业运营网站、Web内容管理、和硬件相关的管理软件以及其他一些杂七杂八的软件(我连蔬菜交易系统都做过)。 从需要持久对象模型的复杂度来讲,ERP应当是算最复杂的。某些项目看起来跨的地域很大、部门之间关系很多,但其实是不复杂的。至于一般性的商业运营网站和行业性质的软件,用Hiberante(包括我早期使用的Castor)完全可以符合需要。 能放出话说hibernate满足所有要求,这对初学者是个很大的鼓励,这可是真正的经验。 我考虑的问题ShenLi很像,也是在二者之间如何平衡而犹豫不绝,一方面可能由于对象设计的不合理,另一方面希望自己的设计是个纯正设计,不能因为运用o/r mapping,而使代码进行折中。这并不是说对象建模不好了,只能说现有的o/r mapping还没有完全解决我的问题。我觉的o/r mapping的出发点是以业务类为基础,因此对于因为数据的原因来调整,都不容易做。 |
|
返回顶楼 | |
发表时间:2003-11-19
robbin 写道 两个考虑途径: 1、把控制方法切分出来,单独做一个控制类来控制它。 2、当需要的情况下,给PO加入一些业务方法之后,PO就变成了BO,至于BO如何和PO进行同步的问题,在Hibernate原理版有一个比较深入的探讨,可以参考一下。 http://forum.hibernate.org.cn/viewtopic.php?t=1116 明显,这样就极端不爽了。我为了实现这么一个看来是纯对象的东西,却要引入许多如此复杂的不直观的东西。好像shenli的所说的,为了适应o/r,就不得不修改对象结构。 另外,我个人反对帖子里的把 PO当做VO用,VO并非PO,两者的职责是不一样的。 |
|
返回顶楼 | |
发表时间:2003-11-19
youcai 写道 能放出话说hibernate满足所有要求,这对初学者是个很大的鼓励,这可是真正的经验。
我考虑的问题ShenLi很像,也是在二者之间如何平衡而犹豫不绝,一方面可能由于对象设计的不合理,另一方面希望自己的设计是个纯正设计,不能因为运用o/r mapping,而使代码进行折中。这并不是说对象建模不好了,只能说现有的o/r mapping还没有完全解决我的问题。我觉的o/r mapping的出发点是以业务类为基础,因此对于因为数据的原因来调整,都不容易做。 potian没有说满足所有要求......目前只能说没有遇到难以处理的情况。 |
|
返回顶楼 | |
发表时间:2003-11-19
weihello 写道 明显,这样就极端不爽了。我为了实现这么一个看来是纯对象的东西,却要引入许多如此复杂的不直观的东西。好像shenli的所说的,为了适应o/r,就不得不修改对象结构。
另外,我个人反对帖子里的把 PO当做VO用,VO并非PO,两者的职责是不一样的。 因为我用 Hibernate 不多,所以没有完全理解这个问题。不过我是比较反感一些不必要的复杂性。力求简单是开发人员的最高境界,虽然这个简单很多时候是难以达到的。 |
|
返回顶楼 | |
发表时间:2003-11-19
引用 明显,这样就极端不爽了。我为了实现这么一个看来是纯对象的东西,却要引入许多如此复杂的不直观的东西。
?????? |
|
返回顶楼 | |
发表时间:2003-11-19
基本上一个应用程序里面的领域相关的模型里面需要3种对象:
1。值对象(Value Object),没有身份,内容表示一切,譬如我和weihello都去银行里面存取100大洋,那这个100RMB是一个值对象 2。实体对象(Entity),需要持久,不是按照内容,而是按照它的身份来区分,也就是说即使内容完全一样,也不是同一个对象。这个身份在内存里面是它的实例地址,在数据库里面是关键字,最常见的就是OID.这个实体对象并不是纯数据,它处理本身的实体模型,例如Accout,它的withDraw,它的子Account等等,它也处理自己和其他实体对象之间的关系,例如订单里面的订单行,都是应该在这个Account里面实现的,而不应该有一个什么控制类。在一个Web应用程序里面,涉及到对象关系的一般只需要一个(或几个)DTOFactory负责所有对象的DTO和Entity之间的组装和拆份,不需要专门的管理,这一部分也是和数据建模最相近的地方。 3。服务对象(Service),这是为我们提供服务的类,譬如银行里面服务员,她帮助我们把钱从一个账户转到另外一个账户,并记录相应的交易。 对象的作用是对它自己的内部状态负责,如果它需要存取很多其它对象的状态进行运算,那叫做特性忌妒,是要重构的。应该把这些代码移到那个持有这些状态的类里面 |
|
返回顶楼 | |
发表时间:2003-11-19
辨别一些名词:
1。VO:实际上很模糊,通常指ValueObject和ViewObject 2. ViewObject,界面展现需要的对象,如Struts的FormBean 3。Value Object,早期被作为ValueObject和Transfer Object的总称。实际上Value Object的真正意义在于它的内容,而不是身份 4。Transfer Object:数据传输对象,在应用程序不同层次之间传书对象,在一个分布式应用程序中,通常可以提高整体的性能 5。PO:也许就是Persistent Object,基本上就是Entity了 在不同的体系结构和实现方式里面,这些对象有可能重复,也有可能不重叠。如果你要做一个对所有的体系都能够方便移植的框架,那么每一种对象都需要严格区分。例如JDO的PO不能作为TO,应为它不能脱离PM,譬如你可以选择用ViewObject(如Struts的FOrmBean)直接作为TO,但在tapestry和Webwork里面就不合适了。但在很多时候,能够方便实用是最重要的,不要过度设计就是了。 |
|
返回顶楼 | |