`
sslaowan
  • 浏览: 384371 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

企业级应用,有什么理由不用OO?

阅读更多

         这里所谓的企业级应用,就是Martin Fowler的企业应用架构模式中论述的企业级应用。

         在软件工程过去的40年里,虽然没有任何一种方法论能够达到舍我其谁的程度,但是确实在工业界和学术界达成了一些共识:封装,行为优先于数据考虑,依赖于抽象而非具体,迭代开发,领域驱动设计……而OO范型是这些最佳实践的最好集合。

         软件的设计,来自对于问题域的抽象,随着对于需求的理解深入,我们的设计会随之演化。结构化范型中首先设计数据库,我认为过早的对问题域进行了数学抽象,往往那些抽象过于远离问题域,它代表了当时对于问题域的理解。而数据库又属于依赖的最低层,这种不牢靠的抽象必然会造成设计的不稳定,因此从本质上讲,这种方法就是不可靠的。而OO可以直接去模拟业务领域,可以尽可能的去贴近实际。因为实际业务运行良好,那么你所设计的模型也会更容易的运行良好。我发现越是贴近现实领域的建模,其进化性越好。

       问题领域中不仅包含实体,还包含值对象,服务[Evans03],而数据库建模则往往只强调实体。那么其他有用领域概念就在设计中丢失了。制作大而全的对象是不切实际的,对象属性和行为的确定要来自于业务需求,对象使得添加和减少属性和行为都变得容易。

       把一些行为和数据按照主题加以分类,写到不同文件里,就像我们写文章需要划分段落一样,每个段落表达一个意思,如果想补充表达某个意思,就去相应的段落扩展。而类就是这一个个段落。当某个段落表达了不同的意思,就按不同的意思分解。我想这和单一职责原则是有同构性的。那一个个函数就像一个个句子,面向过程设计将这些句子按照应用分布在应用中,而面向对象设计奖这些句子按主题分布在具有业务语义的类中。

     企业级应用的特点是:复杂和多变。一个复杂的东西在变是最让人痛苦的。于是尽可能要把它分解为小而简单的东西,让每个变化只局限于一个方面。

     某些东西是不容易变化的,比如商业,申请服务,提供/享受服务,结帐,这个大方向是不会变的。商业的一个子集,餐馆,上千年了,基本流程还不是点菜,上菜,买单?菜和帐是千年不变的实体。

     无疑,OO比数据库建模向前又走了一步。

      做了几个大型系统,和一些需求模糊、变化无常的项目,真找不出什么理由,做企业级应用可以不用OO。

     2008年4月10号补充:但是,现实情况却是,很少有项目采用OO范型,人们认为无论什么方法都不可能彻底解决企业应用核心复杂性(即问题域复杂),转而走向干脆不尝试OO。特别是在这个行业混迹多年、并且在学校只学了结构化方法的人。我与几个公司的信息部的人聊天,他们采用的方法都是先设计数据库,然而我用OO为系统添加了一项功能(我们为他们公司开发了系统,然后我去添加新功能),他们对于使用OO表示赞同,觉得是好方法。但是却没有使用。

  

      2008年4月13号补充:需求调研一个阶段告一段落,回到北京准备考试。在火车上一直跟同学讲领域驱动开发,讲我过去做的两个使用OO开发的项目的感受,并对比之前使用面向过程方法做项目的感觉:

      1 领域驱动设计,越是复杂、变化灵活的项目越要采用贴近领域的对象模型,只有小的项目才可以尽可能简化对象使得测试刚好通过即可。

      2 切忌UI驱动设计。我做的视频监控项目从最初的需求里包含GUI,到后来不要UI,真是惊天动地的大变化。另外一个作业管理的界面我们修改了20多版,而业务还是那点儿业务。UI可以辅助挖掘需求,但是把它作为最后一件事完全可以。

      3 切忌数据库驱动设计。关系数据库以数学为基础,距离现实领域太远,过早陷入其中危害无穷。

      4 面向对象是比面向数据、面向过程更加先进的方法。我说,当做那个作业管理子系统时,我将函数拆分的非常细,每个函数都是单一职责的,但是管理起来很费劲。我举例说,比如你有一堆帮助文档,包含了J2EE的方方面面,为了方便查找,我想你可能会按照主题将他们放在不同的文件里,然后再放到不同的文件夹里。那么这些文件就是类,文件夹就是包。虽然面向过程编程,你可以采用良好的命名规范,并将其放入单独的文件里(比如Delphi的unit,VB的module),但是其封装性和复用性明显要弱于OO。也就是这种最佳实践再向前迈一步就是OO了。

      5 我的感觉是,越是大型、复杂的商业应用越适合采用OO。虽然OO不完美,OO不是银弹,OO也没有REST、SSOA等时髦,也许话题很陈旧,很“入门”,但是,OO在国内应用的现状,就足以反映出,这是个值得探讨的问题。

 

 

[Evans03]Eric Evans,2003,领域驱动设计:软件核心复杂性解决之道。

分享到:
评论
14 楼 sslaowan 2008-04-14  
agate 写道
嗯~已经扯偏题了……
o(∩_∩)o...
反正选择适合项目本身的架构是最符合现实的,OO是好,大大提高了我们看清问题域的可能性,我们也不能排斥非OO的开发模式!这就是我的领悟~


嗯,当我实践了几种主流的方法,并且研究了它们的渊源,发现OO在本文一再声明的项目中是最好的~~

我不排斥,因为没用过就没有发言权,所以每种方法都做过真实的项目~~
13 楼 agate 2008-04-14  
嗯~已经扯偏题了……
o(∩_∩)o...
反正选择适合项目本身的架构是最符合现实的,OO是好,大大提高了我们看清问题域的可能性,我们也不能排斥非OO的开发模式!这就是我的领悟~
12 楼 sslaowan 2008-04-13  
agate 写道
sslaowan 写道
agate 写道
我觉得不必过于叫真,OO的确是一个十分好的设计方式,企业级应用中似乎国外的很多开发公司都注意到了过去不断叫嚣OO是无意义的,因为企业中最大量的还是数据,处理这样大量的数据很大程度上使用一个稳定的、成熟的数据结构式的编程还是十分理想的开发方式。


在开发过程中过早奢望定义一个稳定的数据结构几乎是不可能的
我说了,数据结构的确定依赖于对问题域的理解,除非是小项目,或者是重编某个系统
否则这种假设是危险的

OO不是不重视数据,而是不只重视数据,而且完整数据结构并非必须,考虑核心数据,问题域核心才是关键的


呵呵,只是探讨探讨,个人是OO支持者。但是在开发的过程中觉得我们开发的程序并不是你所谓的OO。
我们用的是Java这样的OO语言;使用着Hibernate,Spring这样的框架;写着DAO这样的接口;我觉得这是各大公司的普遍现象,这是OO吗?我觉得不是……但是这种开发方式很好,充分利用了Java的OO特性,但是不是OO,是一种建立在数据基础上的开发方式。

这样做可能是OO,也可能不是。
就像很多人宣扬RoR的简单批评J2EE的“无限分层”,我觉得就是对于方法学要活用的无视。但是那些大牛何尝不都是看过《企业应用架构模式》一类书的人,分不分层,分多少层,为何分层他们不是不知道的,那这样说的原因终究在哪呢?
怎样算OO?我在大三做铁道部的项目时,将数据放进VO,将方法放进Bean,自以为是OO,程序的可维护性可扩展性有了很大提高,然而在看了Bob大叔、Larman、Fowler等人的著作后,才逐渐的知道了如何建模。
在我做过的几个项目中,我发现越是大型、复杂、需求模糊、需求变化频繁的项目越适用于OO,越贴近OO设计准则越能有效地完成任务~~~

11 楼 agate 2008-04-12  
sslaowan 写道
agate 写道
我觉得不必过于叫真,OO的确是一个十分好的设计方式,企业级应用中似乎国外的很多开发公司都注意到了过去不断叫嚣OO是无意义的,因为企业中最大量的还是数据,处理这样大量的数据很大程度上使用一个稳定的、成熟的数据结构式的编程还是十分理想的开发方式。


在开发过程中过早奢望定义一个稳定的数据结构几乎是不可能的
我说了,数据结构的确定依赖于对问题域的理解,除非是小项目,或者是重编某个系统
否则这种假设是危险的

OO不是不重视数据,而是不只重视数据,而且完整数据结构并非必须,考虑核心数据,问题域核心才是关键的


呵呵,只是探讨探讨,个人是OO支持者。但是在开发的过程中觉得我们开发的程序并不是你所谓的OO。
我们用的是Java这样的OO语言;使用着Hibernate,Spring这样的框架;写着DAO这样的接口;我觉得这是各大公司的普遍现象,这是OO吗?我觉得不是……但是这种开发方式很好,充分利用了Java的OO特性,但是不是OO,是一种建立在数据基础上的开发方式。
10 楼 sslaowan 2008-04-11  
agate 写道
我觉得不必过于叫真,OO的确是一个十分好的设计方式,企业级应用中似乎国外的很多开发公司都注意到了过去不断叫嚣OO是无意义的,因为企业中最大量的还是数据,处理这样大量的数据很大程度上使用一个稳定的、成熟的数据结构式的编程还是十分理想的开发方式。


在开发过程中过早奢望定义一个稳定的数据结构几乎是不可能的
我说了,数据结构的确定依赖于对问题域的理解,除非是小项目,或者是重编某个系统
否则这种假设是危险的

OO不是不重视数据,而是不只重视数据,而且完整数据结构并非必须,考虑核心数据,问题域核心才是关键的
9 楼 agate 2008-04-11  
我觉得不必过于叫真,OO的确是一个十分好的设计方式,企业级应用中似乎国外的很多开发公司都注意到了过去不断叫嚣OO是无意义的,因为企业中最大量的还是数据,处理这样大量的数据很大程度上使用一个稳定的、成熟的数据结构式的编程还是十分理想的开发方式。
8 楼 sslaowan 2008-04-10  
rtdb 写道
就算是OO无处不在,和企业级应用扯到一起,
就好比举起榔头,到处都是钉子一样。


我说的是:目前来说,企业级应用最好的方法是OO
我没说OO无处不在,数学运算等领域,OO并不适用或最好
7 楼 sslaowan 2008-04-10  
downpour 写道
要看项目的类型。

往往一个项目起来的时候,用户最大的需求是保留当前已有系统的使用习惯,或者要与已有的很多系统进行无缝整合。此时,已经存在了一些很多年前设计的数据库表,以及大量的数据,你要OO,可以啊,先把这些数据迁移过来再谈编程哲学,这时,往往会觉得力不从心。

还有一类项目,完全就是从无到有的,那么尽可能的放开手脚,想怎么玩就怎么玩吧。


其实这些并不矛盾
数据库只是作为持久化的工具而已
跟OO设计并不矛盾,将对象映射为一个并不OO的数据库表也是可以的
我大四做的项目就是为一个遗留系统(一个大型公司的生产业务系统)添加视频监控功能,采用的OO设计,迭代了17版,没什么问题。
6 楼 rtdb 2008-04-10  
就算是OO无处不在,和企业级应用扯到一起,
就好比举起榔头,到处都是钉子一样。
5 楼 downpour 2008-04-10  
要看项目的类型。

往往一个项目起来的时候,用户最大的需求是保留当前已有系统的使用习惯,或者要与已有的很多系统进行无缝整合。此时,已经存在了一些很多年前设计的数据库表,以及大量的数据,你要OO,可以啊,先把这些数据迁移过来再谈编程哲学,这时,往往会觉得力不从心。

还有一类项目,完全就是从无到有的,那么尽可能的放开手脚,想怎么玩就怎么玩吧。
4 楼 Joo 2008-04-10  
ray_linn 写道
OO出来前也有企业级应用..甚至现在80%的企业应用(出自CICS的说明书)还都不是OO, COBOL照样可以支撑一个企业的系统.

OO照样处理不了需求变化的情况,对于需求来说,OO太细小了.

你这个太细小做何解释 不太明白
3 楼 linhong_1001 2008-04-10  
OO可以成就项目,也可以破坏项目,非OO也可以成就项目,同样也可破坏项目,既然如此,OO不是重要的结果才是重要的,OO就像C++,不完美,也不简单。为什么你任务OO对企业应用而言就是最重要的吗,最重要的是什么,是金钱和时间,OO也许不总是对的
2 楼 sslaowan 2008-04-09  
ray_linn 写道
OO出来前也有企业级应用..甚至现在80%的企业应用(出自CICS的说明书)还都不是OO, COBOL照样可以支撑一个企业的系统.

OO照样处理不了需求变化的情况,对于需求来说,OO太细小了.


我只是说对于企业应用而言,与众多方法比较,OO是最好的,那么为什么我们不用OO呢~~

关于应对需求,我只是觉得,OO能更好的随需求变化提供进化式设计的可能。


1 楼 ray_linn 2008-04-09  
OO出来前也有企业级应用..甚至现在80%的企业应用(出自CICS的说明书)还都不是OO, COBOL照样可以支撑一个企业的系统.

OO照样处理不了需求变化的情况,对于需求来说,OO太细小了.

相关推荐

    系统集成项目管理工程师

    系统集成项目管理工程师是专门负责将不同的计算机软硬件产品及网络组件集成到一个企业级的解决方案中,以实现系统的最优性能、最优成本和最优可靠性。这一职位通常需要掌握一系列的知识和技能,包括项目管理、系统...

    基于A*算法的往返式全覆盖路径规划改进及其Matlab实现

    内容概要:本文详细介绍了如何利用A*算法改进传统的往返式路径规划,解决扫地机器人在复杂环境中容易卡住的问题。首先构建了一个可视化的栅格地图用于模拟环境,然后引入了优先级运动规则,使机器人能够有规律地进行往返清扫。当遇到死角时,通过A*算法计算最佳逃生路径,确保机器人能够顺利脱困并继续完成清扫任务。实验结果显示,改进后的算法显著提高了清洁覆盖率,降低了路径重复率。此外,还讨论了一些潜在的优化方向,如动态调整启发函数权重、断点续传以及能耗模型等。 适合人群:对路径规划算法感兴趣的科研人员、自动化专业学生、扫地机器人开发者。 使用场景及目标:适用于需要高覆盖率和低重复率的室内清洁任务,旨在提高扫地机器人的工作效率和智能化水平。 其他说明:文中提供了详细的Matlab代码实现,并附带了仿真测试结果,有助于读者理解和复现该算法。

    爬取喜马拉雅听书(1).py

    爬取喜马拉雅听书(1)

    安卓向上传递数据学习笔记总结

    安卓向上传递数据学习笔记总结

    tigervnc-selinux-1.11.0-9.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统tigervnc-selinux-1.11.0-9.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf tigervnc-selinux-1.11.0-9.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    户外储能电源双向逆变器板生产资料及技术规格详解

    内容概要:本文详细介绍了户外储能电源双向逆变器板的技术资料及其特点。涵盖原理文件、PCB文件、源代码、电感与变压器规格参数等,适用于2KW(最大3KW)的户外储能电源。文中强调了双向软开关DC-DC设计、两颗M0+ 32位MCU的分工、SPWM调制方式、H桥IGBT的应用、详细的电气参数和技术特性。此外,还包括了SPWM信号生成代码示例、硬件设计细节、生产注意事项等。 适合人群:从事户外储能电源开发的技术人员、电子工程师、产品经理等。 使用场景及目标:帮助开发者快速掌握双向逆变器板的设计和生产要点,缩短产品研发周期,提高产品质量和可靠性。具体应用场景包括但不限于户外应急电源、便携式储能设备等。 其他说明:本文提供了丰富的技术细节和实践经验,如双向软开关DC-DC设计、SPWM调制、IGBT驱动、EMC整改记录等,有助于解决实际开发中的难题。同时,附带的实际案例展示了该方案的成功应用,进一步证明了其可行性和优越性。

    电能质量分析:间谐波分析.zip

    电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。

    【计算机科学领域】美国计算机学会(ACM):组织架构、使命愿景、核心价值及活动项目介绍

    内容概要:美国计算机学会(ACM)是一个成立于1947年的国际性计算机专业组织,致力于推动计算机科学的发展,提供教育、资源和专业发展机会。ACM的使命是促进计算机科学和信息技术领域的进步,愿景是成为全球计算机专业人士的首选组织。其核心价值包括卓越、诚信、包容性、合作和创新。ACM定期举办学术会议,如SIGGRAPH和图灵奖颁奖典礼,出版高质量的学术期刊和会议论文集,涵盖人工智能、软件工程、网络安全等领域。此外,ACM还提供在线课程、研讨会、认证项目等教育资源,以及职业规划、网络机会和领导力培训等职业发展服务。ACM图灵奖被誉为“计算机界的诺贝尔奖”,每年颁发给对计算机科学和技术做出重大贡献的个人。; 适合人群:计算机科学领域的专业人士、教育工作者、工程师和学生。; 使用场景及目标:①了解计算机科学领域的最新研究成果和发展趋势;②获取高质量的教育资源和职业发展机会;③参与计算机科学领域的学术交流和合作。; 其他说明:ACM作为一个全球性的组织,在教育、研究和行业实践中发挥着重要作用,推动了技术创新和社会进步。

    最新版logstash-8.17.4-windows-x86-64.zip

    logstash-8.17.4-windows-x86_64.zip

    一个基于Springboot使用Aspect实现一个切面,以记录日志为例

    springboot 一个基于Springboot使用Aspect实现一个切面,以记录日志为例

    音箱底部折边设备sw22可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    音箱底部折边设备sw22可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    基于Python Django MySQL的个性化图书推荐系统:协同过滤算法及远程部署实现

    内容概要:本文详细介绍了如何使用Python、Django和MySQL构建一个完整的个性化图书推荐系统。系统从前端界面设计、后端逻辑实现到数据库设计,涵盖了用户管理、图书管理、评分系统等功能模块。重点讲解了基于用户和项目的协同过滤算法实现,以及在用户评分数据不足时的标签推荐备份方案。此外,还包括了系统部署、测试和优化的具体步骤,如云服务器部署、性能测试、数据库优化等。 适合人群:具备一定Python和Web开发基础的研发人员,尤其是对推荐系统感兴趣的技术爱好者。 使用场景及目标:适用于希望深入了解图书推荐系统的工作原理和实现细节的技术人员。目标是帮助读者掌握从零开始搭建一个完整的个性化推荐系统的方法,包括前后端开发、算法实现和系统部署。 其他说明:文中提供了大量代码示例和实战经验,如数据库设计、爬虫实现、权限管理等,有助于读者更好地理解和应用相关技术。

    Ai和python学习资料

    Ai和python学习资料

    文本摘要.py

    文本摘要

    冲击试验机sw22_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    冲击试验机sw22_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    Java开发MybatisPlus框架详解:增强Mybatis功能实现高效CRUD操作与代码生成

    内容概要:本文详细介绍了MyBatis Plus(MP),它是MyBatis的增强工具,旨在简化CRUD操作、提高开发效率。其主要功能包括内置分页插件、简化CRUD操作以及代码生成器。使用时只需引入相应依赖,自定义Mapper接口继承BaseMapper泛型接口,并通过实体类反射获取数据库表信息。文章还介绍了常用注解如@TableName、@TableId、@TableField、@TableLogic和@Version,配置项如全局配置、类型别名和Mapper文件路径,以及核心功能如批量插入、分页查询、条件构造器(Wrapper)等。此外,扩展功能涵盖逻辑删除、枚举处理器和JSON处理器,插件功能则包括分页插件的配置和使用。 适合人群:具备一定Java开发经验,尤其是熟悉MyBatis框架的开发者,特别是那些希望提高开发效率、减少重复代码的工作1-3年研发人员。 使用场景及目标:①简化数据库操作,提高开发效率;②快速生成代码,减少手动编写SQL语句的工作量;③实现分页查询、逻辑删除、枚举和JSON字段处理等高级功能,提升应用的灵活性和可维护性。 其他说明:本文不仅提供了MyBatis Plus的功能介绍和使用方法,还深入探讨了条件构造器(Wrapper)的使用技巧,帮助开发者更好地理解和掌握这一强大的工具。在实际开发中,合理利用这些功能可以显著提高开发效率和代码质量。建议在学习过程中结合具体项目实践,逐步掌握各个功能的应用场景和最佳实践。

    电路仿真:射频电路仿真.zip

    电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。

    【java毕业设计】Springboot+Vue高考志愿填报系统 源码+sql脚本+论文 完整版

    这个是完整源码 SpringBoot + vue 实现 【java毕业设计】Springboot+Vue高考志愿填报系统 源码+sql脚本+论文 完整版 数据库是mysql 随着高考制度的不断完善和高等教育资源的日益丰富,高考志愿填报成为考生和家长关注的焦点。本文旨在开发一个基于Spring Boot后端框架、Vue.js前端框架和实现以下功能:考生信息管理、院校信息查询、专业信息查询、志愿填报、志愿评测等。通过Spring Boot框架构建后端服务,提供 API接口与前端进行交互;Vue.js框架用于构建前端用户界面,实现数据的动态展示和交互操作;MySQL数据库用于存储考生信息、院校信息、专业信息等数据。 在系统设计过程中,我们充分考MySQL数据库的高考志愿填报系统,提高志愿填报的效率和准确性,为考生和家长提供便捷的服务。 系统主要实现以下功能:考分考MySQL数据库的高考志愿填报系统,提高志愿填报的效率和准确性,为考生和家长提供便捷的服务生信息管理、院校信息查询、专业信息查询、志愿填报、志愿评测等。通过Spring Boot框架构建后端服务,提供 API接口与前端进行交互;Vue.js框架用于构建前端用户界面,实现数据的动态展示和交互操作;MySQL数据库用于存储考生信息、院校信息、专业信息等数据。 在系统设计过程中,我们充分考虑了系统的易用性、可扩展性和安全性。通过合理的数据库设计和优化,提高了系统的查询效率。同时,采用Spring Security等安全框架对系统进行安全防护,确保数据的安全性。 本文详细阐述了系统的需求分析、设计、实现和测试过程,并对关键技术和实现难点进行了深入探讨。通过实验验证,本系统能够满足高考志愿填报的基本需求,为考生和家长提供了高效、便捷的服务。此外,本文还对系统未来的发展方向和改进空间进行了展望,以期进一步完善系统功能,提高用户体验。

    基于MATLAB的特征选择算法:SBS与SFS的实现及其应用场景

    内容概要:本文详细介绍了基于MATLAB实现的两种经典特征选择算法——向后搜索(SBS)和向前搜索(SFS)。首先通过构造简单的虚拟数据集展示了这两个算法的基本思想和实现步骤。接着深入探讨了SBS和SFS的具体实现方式,包括特征集的初始化、特征的选择/剔除机制以及评价函数的设计。文中还提供了具体的MATLAB代码示例,帮助读者更好地理解和应用这两种算法。此外,文章讨论了SBS和SFS的特点和局限性,并给出了在实际工程项目中的选型建议。 适合人群:对特征选择有一定兴趣并希望深入了解SBS和SFS算法的初学者,尤其是那些希望通过MATLAB进行特征选择研究的人群。 使用场景及目标:适用于需要从大量特征中挑选出最具影响力的少数特征的情况,如生物医学数据分析、图像识别等领域。主要目标是提高模型性能的同时减少计算成本。 其他说明:尽管SBS和SFS属于较为基础的特征选择方法,在现代工业级项目中已被更先进的算法所替代,但对于理解特征选择的基本原理仍然非常重要。同时,文章强调了评价函数设计的重要性,并指出在实际应用中应综合考虑业务背景和技术因素。

Global site tag (gtag.js) - Google Analytics