`
lgx522
  • 浏览: 125798 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

有了OO、分层、DI、AOP、TDD和Refector,DDD不再是空谈

    博客分类:
  • Java
阅读更多
一晃眼搞了7、8年的企业应用管理和研究,各种技术、思想翻来覆去折腾了很久,最近总算是有点持拨云见目的感觉了,于是放出点大标题和各位论论道。

主要观点其实在一年半前,已经在jdon首发的文章“坚持发扬EJB、Spring的光辉思想,将组件化进行到底!”(可参http://www.jdon.com/jivejdon/thread/31834.html)进行过论述。当时虽然观点比较激烈,然实际上笔者领悟得不够深刻,故有后面一年多的RoR和PHP之实践。随着时间的推移,与各相关方(上级领导、企业领导、用户、开发商主管、设计人员、开发人员、维护人员等等)的更多观点接触,让我逐渐深入领悟了Java和Spring所蕴含的开发哲学和思想,于是又有此文。
(上文刚刚收到blog,由于是老文,不再发布了,仅作为整理收录)

如果说,每种编程语言和技术都有自己的目标和归宿和话,那么简单来说,JavaEE和后来的Spring是为企业应用而生的。他们诞生的基本目标,正是为了解决困扰企业应用多年的各种复杂问题。故而他们能够达到现在的领导地位,并将一直延续下去。

世间各种事业,都应该是“统一规划,分步实施”。放到信息工程来说,就是“自顶向下设计,自底向上实现”。道理谁都明白,可现实当中执行下来,总是要走样。问题就在于,这二者该如何结合?于是实际项目中,企业用户、分析师、设计师、程序员、维护人员总是不欢而散,最后往往各行其事,一盘散乱。上层的总是抱怨下层在“乱搞”,而下层则嘲笑上层只会“空谈”。结果往往是早已扔进档案袋的系统方案和图表,一堆各种公司、各种程序的“系统”,蒙头蒙脑瞎忙的维护人员。

那为什么结合不了?因为大家没有“共同语言”。开初UML跳出来了,分析师讲得头头是道,程序员看得心烦意乱,用户更是云山雾水。于是连MF都有点烦了,干脆推起了RoR。这乍东西一看太理想了。几乎是分析员可以直接实现程序,而程序员也可以直接分析了。可惜世间难有完美的事物,RoR这种过于“霸道”的东西也许还是有问题的。前有foxpro,后有VB、PB,也许是笔者总是心有余悸,对这种过于“完美”的东西还是先放一放吧。

那是不是说,大家真的不可能有“共同语言”?笔者以为,有,但要折衷(又闻到了实用中庸主义的味道了吧)。如题,OO、DI、AOP、TDD和Refector正是当前的解决之道。

OO是根本,可以作为基本的“共同语言”。图表不必要像UML那么复杂,否则最后除了分析师谁都不会看。只需要简单建上模型,标上属性和接口功能,最多连几根线说明相互关系,这样大家都懂(也就是说,这个类是个什么东西,有什么属性,要实现些什么功能)。这种东西既可做系统说明书,也可以给开发人员,甚至生成Doc做维护文档。
大家要说这不是“空谈”吗?要的就是空谈(就好比不识字的老百姓也会谈治国问题),就是只谈“有什么”和“做什么”,这样才能有共识。但这种“空谈”其实最难最费时,因为要“共识”。有了共识之后就可以下一步了。

下一步是实现。这个阶段,分层、DI、AOP就可以大展本领了。Spring流行那会,大家是言必DI和AOP。可惜风头一过,现在RoR和Seam时尚年代,很多人大概忘了七七八八。其实笔者现在看来,分层、DI和AOP是继OO之后最重要的思想,它们的核心在于“接口和实现分离”。这样一来,就可以把“做什么”和“怎么做”分家,这才是它们的伟大之处。大家天天把“高内聚、低耦合”挂在嘴边,各搞一套,乱七八糟。J2EE太复杂,大家觉得用不上。好不容易Rod推行了用得上的标准方法,大家本可以有“共同语言”了。可惜人之天生的惰性又把我们推回到“一体化”的泥潭,一代代程序员和系统就这么不了了之了。

OO还是要坚持,它是当前信息世界和现实世界实现映射的最好方法。DI和AOP也是要坚持,只有这样才能屏蔽掉具体实现技术疯狂变化的信息世界。坚持OO,我们才能不受数据存储方式变化的困扰;坚持分层、ID、AOP,我们才能明确地分工合作,摆脱系统规模和事务要求变化所带来的烦恼。

最后还有TDD和Refactor,业务在变,系统在变,我们的技术也在变。一定要能测试和重构,要能很好地测试和重构,否则系统必被变化所毁。要想能够很好地测试和重构,如果你的系统没有OO、分层、DI、AOP,大家是否真可以充满底气地回答“能”。在这一个问题上,Java是最令我放心的伙伴,而Spring更总是带来惊喜。

DDD(领域驱动设计)是一个好的设想,而如今像Spring这类的标准化框架则可以把这个设想变为现实。在这个设想里,管理人员、分析师和用户定义模型功能要求,架构师根据要求选择技术方案,不同的程序员(有做dao的、做service的、做view的)根据接口要求实现代码,通过测试后提交。而因为有支持分层、DI、AOP的框架存在(比如说Spring),布署人员就可以简单地把他们组装在一起。
面对不断的需求变化,分析师仍然只需增加/变动模型和功能接口,测试人员和编程人员按作相应变化即可。
总体设计、分步实施、按需定制、分工合作、无缝组装,这种工业标准化的软件开发方式才是企业应用的答案。而OO、分层、ID、AOP、TDD和Refactor是真正支撑这个开发方式的支柱。以这样的方式,DDD会真正成为现实。


信息发达国家的软件业其实很大程度上已经实践了这种开发方式(想想那些大规模的外包吧)。这些年国内搞Java的,张嘴闭口便是SSH。可惜很多人搞了一些年后,还是“不识庐山真面目”,成天抱怨“好烦”。在这样浮燥的产业环境下,国内大多数企业应用的质量是低劣的。
即使你天天在写Java、天天在用Spring,如果不能够“知其所以然”,那么你的SSH注定是偷工减料的豆腐渣。所以在此劝诸位从事企业应用的同道,好好静下心来,认真思考一下你的应用所面对的各种问题,再好好思考一下OO、DI、AOP、TDD和Refator给你带来的福音。

愿大家的系统质量都能更上一层楼,这样才可变恶性竞争为良性合作,让我国的信息系统发挥更大更好的作用。
分享到:
评论
5 楼 mellen 2011-10-11  
设计 是把现实中的 系统,通过抽象的 方式 进行模拟化,并进行实现。。注意 我们无论怎么做 是要面对的是一个“系统”,然后 是建设实现这个系统的功能的“另一个系统”,前系统会随时间变化而提示变化,后系统也同样会如此。
  那么设计的真正目的是在于 根据你的系统的本质和特点 ,来运用“适合”的技术,而使用技术前 是 把前系统 设计架构成 后系统。这个设计架构过程,即是需要很好的设计。
设计包括:使用现有的要素(素材-组件)或自建的要素,采用现有的结构(框架,架构)或自建的结构,运用适合的语言 。实现和解决系统的问题。而系统的关键在于:要素、功能、组织、扩展。 那么设计的关键需要不离开这些。 有时候我想设计这样一个架构: 生产者,决定调度者,分析执行者。 所有的要素(组件)由生产者产生,组合。 而决定者负责根据系统需要 让生产者产生那些要素。 而决定者先要让分析者 执行或分别系统的状体,问题,业务,功能 后 再去操作。 这样 把要素,组织,功能分开。
4 楼 netfork 2009-01-03  
感觉我国确实需要“软件工厂”。有时看上去与国外差别似乎不大,其实软件基建方面差距还是巨大的。在痛恨计算机硬件技术落后的时候,想想软件方面的差距还真不亚于硬件。
3 楼 打倒小日本 2009-01-03  
说道最后 感觉说的怎么好像是"软件工厂"?流水线的模式?
2 楼 AaronHu80 2008-12-31  
我觉得有点理想化,现在可能水平还有限,还处在TDD和Refactor的过程中,体会不到这种深层次的哲学和思想。

但是支持楼主的探索,关注中
1 楼 leobluewing 2008-12-31  
分层,封装,强调可变化,越来越隔离的代码,越来越多的模块,越来越羞涩的调用,越来越要求设计师要牛逼。

可惜 大部分公司设计师水平都不到家,DDD就目前来说还是太远了。

相关推荐

    IOC(DI)与AOP概念的理解

    "IOC(DI)与AOP概念的理解" IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是软件设计中两个重要的概念。控制反转的意思是依赖关系的获取方式被反转了。所谓依赖,从程序的角度看,...

    关于spring的AOP ,IOC,DI的理解

    Spring的核心特性包括AOP(面向切面编程)和IOC(控制反转),以及依赖注入(DI)。以下是对这些概念的详细解释: **面向切面编程(AOP)** AOP是一种编程范式,它允许开发者将关注点从主业务逻辑中分离出来,例如...

    spring ioc di aop详解

    在 Spring 中,IOC(Inversion of Control,控制反转)和 DI(Dependency Injection,依赖注入)是两个核心概念,而 AOP(Aspect Oriented Programming,面向切面编程)则是实现模块化和解耦的重要工具。现在,我们...

    springioc和spring aop

    Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    总之,AOP通过提供一种新的角度来解决OO编程中存在的问题,使得我们能够在保持业务逻辑清晰的同时,增加额外的通用功能。利用Java反射机制和Spring AOP框架,开发者可以方便地实现AOP,从而提升代码的模块化和可维护...

    spring AOP 切面日志 分层打日志

    在Spring框架中,AOP(面向切面编程)是一种...通过上述方式,我们可以有效地利用Spring AOP实现分层日志记录,提高代码的可维护性和问题排查效率。同时,合理的日志设计和管理对于任何应用程序来说都是至关重要的。

    PHP-设计模式: AOP切面编程,DI依赖注入,DIC容器DEMO。简单易懂哦

    在这个压缩包文件"design_pattern"中,你可以找到关于这些概念的DEMO,它们将帮助你更好地理解AOP、DI和DIC的实际应用。通过实例,你可以看到如何定义切面、如何创建依赖注入容器,以及如何在PHP中实现这些设计模式...

    AOP 和WCF 例子

    AOP通过使用“通知”(advice)、“连接点”(join point)、“切点”(pointcut)和“切面”(aspect)等概念,使得这些横切关注点能够以声明式的方式插入到主体代码中,减少了代码的冗余和耦合。 **Windows ...

    Spring重要概念 AOP DI 讲解

    在提供的课件"Spring_AOP_DI.ppt"中,会详细解释这些概念,并通过实例展示如何在Spring中实现IoC和AOP。辅助文件"辅助文件.doc"可能包含了练习题或额外的讲解内容,帮助进一步理解和掌握这两个重要概念。 理解并...

    aop所依赖的所有包

    它定义了一些基础的切面接口,如Advisor(顾问)、Pointcut(切点)和Advice(通知),这些接口在不同的AOP框架中通用,有助于实现跨框架的切面代码重用。 Aspects则是AspectJ中的核心概念,它代表了关注点的封装...

    Spring相关的笔记,包含ioc、DI、AOP、Spring事务等等

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能闻名。这份笔记涵盖了Spring的核心概念和技术,包括IOC(Inverse of Control,控制反转)、DI(Dependency Injection...

    基于Spring DI与AOP的Java装备类与玩家类设计源码

    该项目是一个基于Spring框架的Java设计源码,包含30个文件,包括9个JAR包、6个...主要涉及装备类(Equip)和玩家类(Player)的设计,利用Spring的依赖注入(DI)来配置玩家的装备,并通过AOP技术对指环装备进行升级处理。

    SpringIOC,DI+dynamic proxy 实现盗版AOP

    本文将深入探讨如何使用Spring的IOC和DI特性,结合动态代理(Dynamic Proxy)来实现一种类似AOP(面向切面编程)的功能,以达到在不修改原有代码的情况下增强或拦截方法调用的目的。 **一、Spring IOC(控制反转)*...

    AOP@Work AOP 工具比较

    在Java领域,有多个AOP工具,如AspectJ、AspectWerkz、JBoss AOP和Spring AOP,它们各有特点和适用场景。 AspectJ是AOP社区中最成熟、功能最强大的工具之一。它提供了一套完整的编译时和运行时AOP解决方案。AspectJ...

    xoohoo c# mvc3 aop ioc di

    在IT行业中,C#、MVC3、AOP(面向切面编程)、IOC( inversion of control,控制反转)和DI(Dependency Injection,依赖注入)是关键的开发概念和技术,尤其在构建可扩展、灵活和可维护的Web应用程序时。...

    aopalliance和aspectjweaver和javassist

    aopalliance-1.0.jar aspectjweaver-1.5.3.jar javassist-3.9.0.GA.jar 解决java.lang.ClassNotFoundException: org.aopalliance.aop.Advice的问题

    aopalliance最新完整jar包

    在Java应用中,aopalliance.jar包扮演着至关重要的角色,它包含了一些核心接口,如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.aop.Advice`,这些接口定义了拦截器和通知的概念,它们是AOP的...

    aopalliance-1.0.jar及aopalliance源码

    AOP Alliance的核心在于它的简单性,它仅定义了一些基本的接口,如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.intercept.MethodInvocation`,这些接口是大多数AOP框架共有的基础。...

    aopalliance-1

    这个插件允许Struts 2应用程序利用Spring的依赖注入(DI)和AOP特性,比如可以方便地管理Struts 2的动作类(Action),以及在Spring容器中定义和管理服务。 2. `aopalliance-1.0.jar`:这就是AOP Alliance的1.0版本...

    AOP思想和事务注解应用

    AOP思想和事务注解应用

Global site tag (gtag.js) - Google Analytics