一星期8天

Eight Days a Week - by The Beatles & 小陆

也讨论一把:不必非oo不可

看了一篇讨论:
http://www.cnblogs.com/yimlin/archive/2006/11/30/578333.html
有些感想:并不是所有的行为都必须属于某个对象,有的行为似乎放在任何一个对象中都不合适,那就单独放在那里好了,没必要非要造出一个对象来,更不能把它硬安在某个对象上。

按照oop的方法,软件的逻辑架构可以分成下面几个层次:

1:基础设施层——这个层次解决的是物理问题,比如database gateway、网络通信、对象容器……这个部分与业务需求关系不大,是系统的物理条件。有很多技术框架帮助我们尽快的把这个层搭起来,比如web server、中间件、ACE。搞软件的公司会在这方面形成自己的技术积累。开始搞一个项目的时候,经常把以前的东西拿来复用,尽快进入后面的工作。

2:business对象——在这个层次上,业务要素出现了,业务领域中的概念在这里实现。比如一个航运公司的系统,这里就应该有航线、航班、座位、乘客、登机牌……这些对象应该拥有与实际业务领域相符的属性、方法。长期在某个业务领域开发的公司,在这方面也应该形成自己的技术积累,形成可以直接复用的对象模型。这个层次上也是有一些现成的产品可以用的,比如SAP、工作流引擎,可以在这些东西的基础上做定制开发。

3:business流程——这个流程不是指程序解决问题的流程,而是用户的商业活动的流程。他体现的是端到端的业务流程。比如:检票员为旅客办理登机牌。business流程的输入参数是business对象,输出参数也是business对象。business对象在这里组合、串接,实现业务流程的自动化。这个层次是在直接实现用户的需求。

4:UI和接口——这个层面调用business流程,将执行的结果交给软件的用户,或者别的系统。

在“3:business流程”这个层次上,并不是每个行为都可以在系统中找到一个归属的对象,这是正常的。没有必要为了oo而oo,一定要给某个行为找到一个对象。尤其是不能把这些行为硬安在某个不相关的business对象上,那样反而会使系统变得混乱,难以理解。business流程的独立存在不会误导任何人。

从一个大的范围上说,这些business流程的所属对象,应该是系统的使用人。不应该花太大的精力,过多的考虑这些行为应该属于哪个实体。

posted on 2006-12-01 03:20 小陆 阅读(6885) 评论(9)  编辑 收藏 网摘 所属分类: 软件工程实践

评论

#1楼 2006-12-01 05:33 Henry Liang      

其实说穿了,还是一个DSL的问题。一般来讲,这些问题应该由行业专家负责解释——他们根据的就是他们对于特定行业基本运作规律的认识和经验。这些认识和经验通常都是程序员所不具备的。
未来需要的恐怕更多的是这类型的行业专家,而“编程”这种事情,就交由代码自动生成的IDE来完成了。
  回复  引用  查看    

#2楼 2006-12-01 08:09 aspnetx      

@Henry Liang
支持

"尤其是不能把这些行为硬安在某个不相关的business对象上"
这个我同意

但针对于是否非要oo的问题,这个我认为还是要分具体的情况的,假如这些被孤立的元素太多,好比在一大型项目中,就不一定是误导不误导了的问题了.

当在一个大环境中被鼓励的元素太多,我想社会学家一定会为咱们解释这样会有什么后果.

呵呵,就当以上是我在"叫板"吧,最后,支持楼主所说
"不必非oo不可"
  回复  引用  查看    

#3楼 2006-12-01 08:13 PureEviL      


要不java 或 C#这些语言就是纯OO的了
而不是现在这种状况了
  回复  引用  查看    

#4楼 2006-12-01 10:12 木野狐[匿名]

"并不是所有的行为都必须属于某个对象"

这句话如果不考虑使用什么语言的时候是有道理,但是如果你采用了纯 OO 的语言和框架,则每个行为必然属于一个对象,这也是 OO 分析的基础。要不然谈何职责分离呢,如果放任全局函数的存在,则最终会产生所谓的通用垃圾类。
  回复  引用    

#5楼 2006-12-01 10:42 simonw      

合理的分类才能让别人更好的理解程序, "并不是所有的行为都必须属于某个对象" 这个也需要合理的放置在相应部分, 而不是平铺.
  回复  引用  查看    

#6楼 2006-12-01 13:17 itwalker[匿名][未注册用户]

需要不需要OO?我个人觉得一定是要的,最基本的,体现了一个开发人员是否专业,利于提高项目的代码质量、可复用性、优化程序结构,易于增加系统稳定性,只是一个项目通过设计人员、开发人员的工作,能把OO做到哪个程度,这个是不确定的。一个项目中,即使做完了OOD,最后程序代码实现的时候,也不会完全百分百的做到OOP,这个依赖于设计、开发人员自身对OO的理解掌握和应用程度。

楼主在文章中提到:在“3:business流程”这个层次上,并不是每个行为都可以在系统中找到一个归属的对象。这种情况是可能的,还有一种情况,就是一些不相关的工具方法和操作函数,也没有归属的业务对象,但是我不觉得这意味着不必OO,只是没有找到合适的类。

假设,business流程中的行为,需要在Web应用中用,也需要在windows应用中用,那就只有在Asp.net和C#程序代码中各自维护一份吗?我的经验是,可以把前者直接归属到一个“ProcessHandle”流程处理类,或者把后者归属到一个“PubUtility”工具类中,一样可以进行OO的开发处理。甚至可以封装成一个单独的dll,既能提供在web应用中用,也可以提供在windows应用中用。这时,我们就做到了OO的封装和复用。

个人观点,欢迎讨论。
  回复  引用    

#7楼 2006-12-01 19:18 张明亮      

@Henry Liang

支持
OO容易理解,建立在OO的理念上比较容易重构
如果都不是OO的,那么除了领域专家,在其他人看来很难理解的
  回复  引用  查看    

#8楼 2007-06-27 19:02 从建筑圈到IT圈的异类[未注册用户]

看了你对我文章的点评,非常有水平,使我也好奇地过来看看。
在你的blog里面转了转,观点都写得很细,收获良多。
  回复  引用    

#9楼 2007-09-08 22:48 有容乃大      

comment_content   回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 578444





相关文章:

相关链接: