`

Java软件开发中可能出现的几个错误观点

阅读更多

http://developer.weaseek.com/2008/0903/50721390.shtml  (转载自)

 

越来越多人开始使用Java,但是他们大多数人没有做好足够的思想准备(没有接受OO思想体系相关培训),以致不能很好驾驭Java项目,甚至 导致开发后的Java系统性能缓慢甚至经常当机。

 

越来越多人开始使用Java,但是他们大多数人没有做好足够的思想准备(没有接受OO思想体系相关培训),以致不能很好驾驭Java项目,甚至 导致开发后的Java系统性能缓慢甚至经常当机。很多人觉得这是Java复杂导致,其实根本原因在于:我们原先掌握的关于软件知识(OO方面)不是太贫乏就是不恰当,存在认识上和方法上的误区。

软件的生命性

软件是有生命的,这可能是老调重弹了,但是因为它事关分层架构的原由,反复强调都不过分。

一个有生命的软件首先必须有一个灵活可扩展的基础架构,其次才是完整的功能。

目前很多人对软件的思想还是焦点落在后者:完整的功能,觉得一个软件功能越完整越好,其实关键还是架构的灵活性,就是前者,基础架构好,功能添加只是时间和工作量问题,但是如果架构不好,功能再完整,也不可能包括未来所有功能,软件是有生命的,在未来成长时,更多功能需要加入,但是因为基础架构不灵活不能方便加入,死路一条。

正因为普通人对软件存在短视误区,对功能追求高于基础架构,很多吃了亏的老程序员就此离开软件行业,带走宝贵的失败经验,新的盲目的年轻程序员还是使用老的思维往前冲。其实很多国外免费开源框架如ofbiz compiere和slide也存在这方面陷阱,貌似非常符合胃口,其实类似国内那些几百元的盗版软件,扩展性以及持续发展性严重不足。

那么选择现在一些流行的框架如Hibernate、Spring/Jdonframework是否就表示基础架构打好了呢?其实还不尽然,关键还是取决于你如何使用这些框架来搭建你的业务系统。

存储过程和复杂SQL语句的陷阱

首先谈谈存储过程使用的误区,使用存储过程架构的人以为可以解决性能问题,其实它正是导致性能问题的罪魁祸首之一,打个比喻:如果一个人频临死亡,打一针可以让其延长半年,但是打了这针,其他所有医疗方案就全部失效,请问你会使用这种短视方案吗?

为什么这样说呢?如果存储过程都封装了业务过程,那么运行负载都集中在数据库端,要中间J2EE应用服务器干什么?要中间服务器的分布式计算和集群能力做什么?只能回到过去集中式数据库主机时代。现在软件都是面向互联网的,不象过去那样局限在一个小局域网,多用户并发访问量都是无法确定和衡量,依靠一台数据库主机显然是不能够承受这样恶劣的用户访问环境的。(当然搞数据库集群也只是五十步和百步的区别)。

从分层角度来看,现在三层架构:表现层、业务层和持久层,三个层次应该分割明显,职责分明:持久层职责持久化保存业务模型对象,业务层对持久层的调用只是帮助我们激活曾经委托其保管的对象,所以,不能因为持久层是保管者,我们就以其为核心围绕其编程,除了要求其归还模型对象外,还要求其做其做复杂的业务组合。打个比喻:你在火车站将水果和盘子两个对象委托保管处保管,过了两天来取时,你还要求保管处将水果去皮切成块,放在盘子里,做成水果盘给你,合理吗?

上面是谈过分依赖持久层的一个现象,还有一个正好相反现象,持久层散发出来,开始挤占业务层,腐蚀业务层,整个业务层到处看见的是数据表的影子(包括数据表的字段),而不是业务对象。这样程序员应该多看看OO经典PoEAA。PoEAA 认为除了持久层,不应该在其他地方看到数据表或表字段名。

当然适量使用存储过程,使用数据库优点也是允许的。按照Evans DDD理论,可以将SQL语句和存储过程作为规则Specification一部分。

Hibernate等ORM问题

现在使用Hibernate人也不少,但是他们发现Hibernate性能缓慢,所以寻求解决方案,其实并不是 Hibernate性能缓慢,而是我们使用方式发生错误:

“最近本人正搞一个项目,项目中我们用到了struts1.2+hibernate3, 由于关系复杂表和表之间的关系很多,在很多地方把lazy都设置false,所以导致数据一加载很慢,而且查询一条数据更是非常的慢。”

Hibernate是一个基于对象模型持久化的技术,因此,关键是我们需要设计出高质量的对象模型,遵循DDD领域建模原则,减少降低关联,通过分层等有效办法处理关联。如果采取围绕数据表进行设计编程,加上表之间关系复杂(没有科学方法处理、侦察或减少这些关系),必然导致 系统运行缓慢,其实同样问题也适用于当初对EJB的实体Bean的CMP抱怨上,实体Bean是Domain Model持久化,如果不首先设计Domain Model,而是设计数据表,和持久化工具设计目标背道而驰,能不出问题吗?关于这个问题N多年就在Jdon争论过。

这里同样延伸出另外一个问题:数据库设计问题,数据库是否需要在项目开始设计?

如果我们进行数据库设计,那么就产生了一系列问题:当我们使用Hibernate实现持久保存时,必须考虑事先设计好的数据库表结构以及他们的关系如何和业务对象实现映射,这实际上是非常难实现的,这也是很多人觉得使用ORM框架棘手根本原因所在。

当然,也有脑力相当发达的人可以 实现,但是这种围绕数据库实现映射的结果必然扭曲业务对象,这类似于两个板块(数据表和业务对象)相撞,必然产生地震,地震的结果是两败俱伤, 软的一方吃亏,业务对象是代码,相当于数据表结构,属于软的一方,最后导致业务对象变成数据传输对象DTO, DTO满天飞,性能和维护问题随之而来。

领域建模解决了上述众多不协调问题,特别是ORM痛苦使用问题,关于ORM/Hibernate使用还是那句老话:如果你不掌握领域建模方法,那么就不要用Hibernate,对于这个层次的你:也许No ORM 更是一个简单之道: No ORM: The simplest solution

http://www.theserverside.com/blogs/thread.tss?thread_id=41715

Spring分层矛盾问题

Spring是以挑战EJB面貌出现,其本身拥有的强大组件定制功能是优点,但是存在实战的一些问题,Spring作为业务层框架,不支持业务层Session 功能。

具体举例如下:当我们实现购物车之类业务功能时,需要将购物场合保存到Session中,由于业务层没有方便的Session支持,我们只得将购物车保存到 HttpSession,而HttpSession只有通过HttpRequest才能获得,再因为在Spring业务层容器中是无法访问到HttpRequest这个对象的,所以, 最后我们只能将“购物车保存到HttpSession”这个功能放在表现层中实现,而这个功能明显应该属于业务层功能,这就导致我们的Java项目层次混乱,维护性差。 违背了使用Spring和分层架构最初目的。

领域驱动设计DDD

现在回到我们讨论的重点上来,分层架构是我们使用Java的根本原因之一,域建模专家Eric Evans在他的“Domain Model Design”一书中开篇首先强调的是分层架构,整个DDD理论实际是告诉我们如何使用模型对象oo技术和分层架构来设计实现一个Java项目。

我们现在很多人知道Java项目基本有三层:表现层业务层和持久层,当我们执著于讨论各层框架如何选择之时,实际上我们真正的项目开发工作还没有开始, 就是我们选定了某种框架的组合(如Struts+Spring+Hibernate或Struts+EJB或Struts+JdonFramework),我们还没有意识到业务层工作还需要大量工作,DDD提供了在业务层中再划分新的层次思想,如领域层和服务层,甚至再细分为作业层、能力层、策略层等等。通过层次细化方式达到复杂软件的松耦合。DDD提供了如何细分层次的方式

当我们将精力花费在架构技术层面的讨论和研究上时,我们可能忘记以何种依据选择这些架构技术?选择标准是什么?领域驱动设计DDD 回答了这样的问题,DDD会告诉你如果一个框架不能协助你实现分层架构,那就抛弃它,同时,DDD也指出选择框架的考虑目的,使得你不会 人云亦云,陷入复杂的技术细节迷雾中,迷失了架构选择的根本方向。

现在也有些人误以为DDD是一种新的理论,其实DDD和设计模式一样,不是一种新的理论,而是实战经验的总结,它将前人 使用面向模型设计的方法经验提炼出来,供后来者学习,以便迅速找到驾驭我们软件项目的根本之道。

分享到:
评论

相关推荐

    2009年Java认证考试重点指导

    [学习资料] 09年Java认证考试:Java软件开发中可能出现几个错误观点 [学习资料] 09年Java认证考试:Java开发工具及选择理由经验谈 [学习资料] 09年Java认证考试:学Java切忌浮躁 [学习资料] 09年Java认证考试:Java...

    自考软件开发工具真题

    15. **国际电子电气工程师学会的观点**:2008年,《软件》杂志的一期专刊中提到了对于软件开发工具的几种观点,其中指出存在的一种错误观念是认为在信息处理、知识表达、事务处理等问题上存在着已经被完全认识的普遍...

    java项目开发全程实录09

    在这个阶段,我们将重点讨论以下几个关键知识点: 1. **MVC设计模式**:在BBS系统开发中,我们通常采用Model-View-Controller(模型-视图-控制器)架构,将业务逻辑、数据处理和用户界面分离,提高代码的可读性和可...

    面向Java开发者的函数式编程

    ”中,作者提出了几个重要的观点来解释为什么Java开发者应该关注并学习函数式编程: - **并发编程的需求**:随着多核处理器的普及,编写高效、可维护的并发程序成为现代软件开发中的一个重要挑战。函数式编程提供了...

    Java实习总结范文.doc

    同时,我也明白了错误处理的重要性,如何编写健壮的代码以应对可能出现的问题。 4. **团队协作与沟通**:在实习中,我不仅与团队成员共同合作完成任务,还学会了如何与不同角色的人员交流,如项目经理、产品经理...

    面向对象软件工程(使用UML,模式与Java) 习题答案

    具体来说,当我们获得新的信息时,可能会发现之前认为正确的某些观点实际上是错误的。例如,伽利略通过观察木星的卫星和金星的相位,推翻了地球中心论的宇宙观,这表明新知识可以改变我们对旧知识的理解。 #### 5. ...

    IBM教育学院-软件测试 内部试题

    1. **软件开发生命周期模型**:题目中提到了瀑布模型,这是一种经典的软件开发模型,要求按顺序进行需求分析、设计、编码、单元测试、集成和系统测试等阶段。 2. **软件架构与投资回报**:软件架构对项目的质量、...

    金蝶中间件2011校招笔试题

    选项C中的观点是错误的,因为测试不能确保程序完全无错误,只能尽可能多地找出已存在的问题。选项A、B和D是正确的,它们阐述了软件测试的主要目标和价值。 2. **数据类型比较**(第二题): - 在Java中,不同类型...

    培养卓越软件工程师的实用指南.pptx

    - **增加团队生产力**:一支高素质的软件开发团队能够显著提高工作效率,减少错误和返工。 - **提高团队效率**:良好的团队协作和高效的开发流程有助于缩短产品上市时间。 成为卓越软件工程师需要具备以下条件: -...

    2021-2022计算机二级等级考试试题及答案No.12492.docx

    26. **Java继承机制**:题目涉及Java继承的一些错误观点。 - **正确答案**:B. 在Java中一个类只能实现一个接口 - **知识点拓展**:实际上,Java中的类可以实现多个接口,而一个类只能继承一个父类。 以上是对...

    朱伟事理的两面共9页.pdf.zip

    3. **朱伟与IT**:虽然没有明确的信息表明朱伟与IT领域有关,但如果他在这个领域有所贡献,那么可能涉及到他的技术观点、编程经验、软件开发理念或者关于技术行业的分析。 4. **赚钱项目**:在IT行业中,"赚钱项目...

    二十三种设计模式【PDF版】

    下去,浓淡几个叶子,待毛笔的水墨要干枯时,画一下树干,这样,一个活生写意的树就画出来. 我上面这些描述其实都是一种模式,创建模式的人是大师,但是拘泥于模式的人永远是工匠. 再回到传统建筑中,中国的传统建筑是过分...

    商业编程-源码-时尚留言簿多用户版 Build 0921.zip

    深入到具体的源码中,我们可以关注以下几个关键知识点: 1. **数据库设计**:留言簿系统需要存储用户的账号信息、留言内容、时间戳等数据,因此会涉及数据库的设计,如MySQL或SQLite等。数据库表结构的合理性直接...

    c++批判(第三版,英文版)

    下面选取几个核心观点进行讨论: ##### 3.1 虚拟函数 虚拟函数是C++中支持多态性的关键特性之一。尽管它提供了强大的功能,但其设计也存在一些问题。例如,虚函数表机制可能会导致额外的性能开销;此外,在某些情况...

    2021-2022计算机二级等级考试试题及答案No.4603.docx

    14. **知识点:**软件危机是指在软件开发过程中遇到的一系列问题。 - **题目解析:**题目要求选出不属于软件危机表现的一项。选项A“软件过程不规范”实际上是软件危机的表现之一。 - **正确答案:**A(软件过程不...

    朋友圈转发截图生成工具源码

    在生成朋友圈转发截图的过程中,开发者可能需要关注以下几个关键知识点: 1. 图片处理:使用如PIL(Python Imaging Library)或sharp(Node.js库)等库来处理图片,包括裁剪、合成、添加文字等操作。 2. 布局设计...

    基于jsp的小学校园网源码数据库论文.doc

    在系统功能上,狼牙山中心小学校园网站主要包括以下几个方面: 1. **中学信息查询**:用户可以方便地查找学校的基本信息、师资力量、课程设置等,提高信息获取的效率。 2. **行程查看查询**:展示学校的日程安排,...

Global site tag (gtag.js) - Google Analytics