用的SSH,可一点也不OO

dandan_5956 2010-06-04
用SSH也做了好几个项目,都是传统三层架构,也许还会加Web Service的功能,在项目开发的过程中,感觉我们一点也不OO,拿到需求,功能模块划分,建表,整合好SSH,分清包结构,将表导成PO,就开始各自分工做了,最近也在看Rod Johnson的《Expert One-on-One - J2EE Development without EJB》,很多现在的做法,都是书里面建议避免的,罗列一下问题,希望能逐步改进:
  • DAO层重复的代码过多,其实有了Spring的再次封装,DAO层代码不多了,关键在于一个组员提炼出来的DAO基础代码(中途提炼出来的),其他同事不用,随着项目的进展,继承和耦合关系零乱,再想统一也就不容易了,所以好的开始等于成功的一半,强调使用的一致性。
  • Hibernate使用的很初级,有个项目就只是用Hibernate将表映射成PO,都是单表操作,没有关系映射,还有个项目用了关系映射,在映射权限管理,常规实现,用户,角色,资源,两两多对多,开发的同事在对这些实体具体数据持久化的操作时,感觉都是在操作数据库表的思维,而不是OO的思维,导致产生SQL语句多,其实可以避免的。
  • 在PO中习惯用ID属性,而不是对象引用来描述PO之间的关系,项目中有个功能,在对歌曲信息操作时需要记录歌曲的操作日志,对于歌曲和歌曲日志两个实体,是一对多的关系,应该在歌曲日志对象中声明一个歌曲对象引用,有个同事在歌曲日志中声明了一个歌曲ID来表明关系,没错,看看逻辑也走得通,保存歌曲日志时,给歌曲ID赋值就行,如果要查询那个歌曲有那些歌曲日志,from 歌曲日志 where 歌曲ID=?,也出来了,查看歌曲日志时,点下歌曲名看看具体的歌曲信息,又要用歌曲ID再去数据库查询,如果是歌曲对象引用,也就没有这个问题了,占且忽略掉这个问题,用ID属性和用对象引用最大的区别在于,后者对缓存利用率高,也符合OO的思想,之所以我的同事习惯于这样做,还是因为我们分析问题方式,我们并不OO。
占且说这些,怎么都是数据持久的问题
dandan_5956 2010-06-07
又来说一条
  • 禁止使用Open Session in View,看起来很好用,其实问题多多,破坏了传统三层架构,视图层就是做展现,不应该和持久层有关系,就如同在页面上开了数据库连接,视图层也就和持久层耦合起来了,持久层如果有所变动,必然要影响视图层,那么多页面难道一一排查,之所以使用Open Session in View,是因为想让延迟加载的数据也能在视图层展现出来,最好手动来控制,页面要展现什么,你当然知道,在DAO返回数据时就把需要的数据都准备好,延迟加载的数据就先取一次。
Leon&ZM 2011-05-11
小弟最近正在自学Hibernate,感觉Hibernate东西多而杂,但它生成表和拿数据的确挺方便的,继续学习ing....
dandan_5956 2011-05-12
正确地运用Hibernate很关键,对Hibernate深入学习会对你对持久层设计产生深远的影响,我以前看的《Hibernate in Action 2》
ltian 2011-07-28
Hibernate就是一个持久化的工具,SSH不过是一个工具组合,它们本身用了OO思想,但不代表这些工具的使用者就OO了。

OO归根到底是对所面向的业务领域的面向对象的抽象,不研究业务并对业务进行抽象和建模,而试图从工具层面来达成OO,我认为是缘木求鱼。
mengzhiang 2011-07-29
其实OO不OO不是关键,关键是你能实现客户的需求,完成客户需要的功能,以前没有OO的时候软件照样使用的挺好,所以OO不OO不是关键,关键是满足客户需求,另外同时保证代码的可维护性和可扩展性。

OO的目的就是因为它能更高的处理复杂的问题,并保证代码可维护和扩展。所以不要为了OO而OO,而要看具体问题具体分析,如果问题简单,就不需要OO,如果为了OO而OO就走错了。
ltian 2011-08-04
mengzhiang 写道
其实OO不OO不是关键,关键是你能实现客户的需求,完成客户需要的功能,以前没有OO的时候软件照样使用的挺好,所以OO不OO不是关键,关键是满足客户需求,另外同时保证代码的可维护性和可扩展性。

OO的目的就是因为它能更高的处理复杂的问题,并保证代码可维护和扩展。所以不要为了OO而OO,而要看具体问题具体分析,如果问题简单,就不需要OO,如果为了OO而OO就走错了。


不知道你是否认为所有管理类的应用软件都很简单,最终归结为对数据库的增删改查。我接触过一些与你相同观点的人,他们的最终结论就是这样,最后他们的结论是,所进行的所有基于数据库的软件都没有必要OO。
mengzhiang 2011-08-05
ltian 写道
mengzhiang 写道
其实OO不OO不是关键,关键是你能实现客户的需求,完成客户需要的功能,以前没有OO的时候软件照样使用的挺好,所以OO不OO不是关键,关键是满足客户需求,另外同时保证代码的可维护性和可扩展性。

OO的目的就是因为它能更高的处理复杂的问题,并保证代码可维护和扩展。所以不要为了OO而OO,而要看具体问题具体分析,如果问题简单,就不需要OO,如果为了OO而OO就走错了。


不知道你是否认为所有管理类的应用软件都很简单,最终归结为对数据库的增删改查。我接触过一些与你相同观点的人,他们的最终结论就是这样,最后他们的结论是,所进行的所有基于数据库的软件都没有必要OO。

最近我也在想这个问题,是不是因为我做的项目太简单了,还是我没有理解什么是OO。
不能说基于数据库的软件都没有必要OO,或许要是情况而论,而且我觉的OO只是一种解决方案,既然是基于数据库的软件,是不是可以使用数据模型而不用对象模型呢。最近想学习下数据模型。毕竟现在做的是数据库应用。
ltian 2011-08-09
mengzhiang 写道
ltian 写道
mengzhiang 写道
其实OO不OO不是关键,关键是你能实现客户的需求,完成客户需要的功能,以前没有OO的时候软件照样使用的挺好,所以OO不OO不是关键,关键是满足客户需求,另外同时保证代码的可维护性和可扩展性。

OO的目的就是因为它能更高的处理复杂的问题,并保证代码可维护和扩展。所以不要为了OO而OO,而要看具体问题具体分析,如果问题简单,就不需要OO,如果为了OO而OO就走错了。


不知道你是否认为所有管理类的应用软件都很简单,最终归结为对数据库的增删改查。我接触过一些与你相同观点的人,他们的最终结论就是这样,最后他们的结论是,所进行的所有基于数据库的软件都没有必要OO。

最近我也在想这个问题,是不是因为我做的项目太简单了,还是我没有理解什么是OO。
不能说基于数据库的软件都没有必要OO,或许要是情况而论,而且我觉的OO只是一种解决方案,既然是基于数据库的软件,是不是可以使用数据模型而不用对象模型呢。最近想学习下数据模型。毕竟现在做的是数据库应用。

我觉得面向对象与面向数据的区别在于,面向对象的方法可以通过抽象建立起业务领域知识的语义表达,而所谓的面向数据的方法实际上是直接设计物理模型(库表索引等),物理模型是为了解决技术问题(考虑性能),而用于表达业务抽象则显不足。按照面向数据的开放方法实际上是被广泛采用的,业界称之为“智能界面(Smart UI)”,随着信息系统的复杂,考虑到跨部门的企业级应用的建设,美国在上世纪末开始逐渐转变为领域模型驱动的方法,就是按照面向对象来进行业务建模的方式。这个可以看一本经典的书籍,叫做《领域模型驱动设计》,我们从2005年开始探索按照面向对象的方式开发管理信息系统,只要层次分的合理,也没有很复杂,系统的重构性很好,提高了易维护性(按照面向数据的开发方法,大家对业务的操作都是针对库表,这样对持久化对象的管理可能很不容易统一到一个入口)。关键在于,面性对象可以充分利用抽象接口隔离变化,使得系统具有很好的柔性。面向对象的方法主要是能够培养一种抽象能力,这对于构建复杂,且希望走产品化的业务领域很有帮助。
dandan_5956 2011-08-10
引用
这个可以看一本经典的书籍,叫做《领域模型驱动设计》,我们从2005年开始探索按照面向对象的方式开发管理信息系统,只要层次分的合理,也没有很复杂,系统的重构性很好。

羡慕使用领域驱动,现在面临处境是,披着面向对象的外衣做着面向数据的开发,四不像。
Global site tag (gtag.js) - Google Analytics