您的位置:首页 > 运维架构 > 网站架构

JavaEE架构上的思考

2016-10-14 17:40 190 查看
许是我孤陋寡闻吧,我知道Java是面向对象思想的,我也知道Web项目很多都采用MVC架构以及三层架构什么的……

但是,这架构本身与面向对象思想是相背离的!

面向对象思想绝不是"调用任何方法前都要使用对象打点的形式",而是"充分的抽象、利用多态的方式重用代码"

然而在进入到实际工作中我发现,在经典的架构上使用面向对象思想几乎是不可能的。

第一,快速。

不是指的代码运行速度上的快速,而是指开发速度。项目刚开始的时候总是时间紧迫,要快速开发,需求什么的当然有,也都会把工作做好,可是真正投入到工作中之前,谁都不会明白真正的需求是什么。

为了快速开发,Spring自动装载的时候,我们只会去装载一个impl,不会尝试装载多个,甚至没机会去编写另一个impl作为传说中的"候补方案"

这当然有它的好处,毕竟直线逻辑是我们所有人都最容易理解的,这样直线写下来,比一层套一层的接口+实现更容易理解

而作为代价,当业务发生扩展时,我们只能在原来的代码上修修补补,很快就出现了一层又一层的if……这时候再转,你们都懂得,重构是怎样一个可怕的工作——尤其是这并非局部的重构,而是整个项目的重构。

第二,框架。

依据分层原理,一层和数据库打交道,我没记错的话它叫DAO,一层处理业务逻辑,叫Service,一层和页面打交道,叫Action

其中Service层要处理大量的业务逻辑,面向对象想要重载的话,就得从Action中调用各种不同的Service实现

然而,Action是单例的,它只应当Autowired一个Service,这就失去了面向对象的意义

或许"候补方案"的意义仍然存在吧,但我认为这实在不如从SVN上拉个分支出去

想要解决这个问题,这是架构上的问题,就得从架构上解决。

为了快速开发,前期的代码逻辑必然是直线结构,只有当业务出现分支时才开始变复杂

这样,框架就得将"不同的Service实现"这玩意隐藏在框架内部

我知道Spring的Autowire可以择定某一个特定的实现,但我却没想清除该如何将这个功能与面向对象思想联系起来

总之,在Action中Autowire同一个Service的不同实现这样的做法简直不可理喻

依然在想,嗯……想清楚了再说。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: