面向对象为何而死

生如秋叶 2011-04-13 06:31:43
加精
参考文章:
月薪7K的面试题---交通灯管理系统http://blog.csdn.net/zhangxiaoxiang/archive/2011/03/24/6273384.aspx#1636343

这篇文章其实蛮老的,只是最近看到有关“面向对象即将死亡”的论调,心中有不平,就拿它来血祭一番。

在这个简化的十字路口环境中,文中抽象出了道路、红绿灯两个对象类,并分别建立12个实例对象来模拟实际的状态。我没看完他的文章,因为看到这,我已被震到精分了。。。

以红绿灯为例,当前通行路线上的红绿灯状态决定了此路线上的车辆能否通行,乍一看,绝对是一个重要的对象啊。但是,如果把问题换一种方式来描述就会发现另一个天地:“用红绿灯来表示当前交通管制系统中允许通行的路线”,很显然,“交通管制系统”才是隐藏在红绿灯背后真正需要被抽象出来的对象,红绿灯只是该对象中一个状态值的表达形式。
再进一步思考,那么对于到达路口的汽车来说,是否需要获取这个“红绿灯”值来决定自己是否通过呢?如果需要,那至少需要建立表达红绿灯状态的一个公共结构来让汽车或其他对象理解交通管制系统的当前状态,但如果那样,我将亲手杀死面向对象。
红绿灯只是“交通管制系统”的某个状态值的一种表达形式,而决定这个状态值的又是什么呢?显然,就是整个题目本身所描述的一套“游戏规则”。汽车能否通行,本质上不是红绿灯决定,而是这套规则决定的。规则是什么?在这里很简单,无非就是一系列的函数调用,最后返回一个True或者False的值来决定汽车能否通行。如此一来,在“交通管制系统”中设置一个方法(函数?子过程?随意。。。)即可,而方法中的检查规则嘛,就看交警们想怎样折腾了。

对比文中的解决方法,现在,12个“红绿灯”对象实例已经被缩减为1个“交通管制系统”对象实例,与之类似的,12个道路对象实例也可以被简化为一个对象实例。最终,只需要两个Class,1个简单的数据结构、两个起辅助作用的枚举即可解决这个问题,而且最重要的通行规则被封装在一个独立的地方,可扩展性也得到了保证。

想到法国DGM时期一句名言:正义而正义,多少罪恶假汝之手以行。想说一句:对象啊对象,多少不智假汝之名以行。如果某一天,面向对象真的死了,像这样滥用对象的人们,该不该去教堂忏悔一下自己的罪行呢?
...全文
6153 190 打赏 收藏 转发到动态 举报
写回复
用AI写文章
190 条回复
切换为时间正序
请发表友善的回复…
发表回复
白斌 2011-06-23
  • 打赏
  • 举报
回复
什么面向对象,什么面向结构,对于每个人来说只有一种方法来分析问题。
人的大脑无法有效处理复杂的事务,所以我们一般是将一个复杂问题分解为几个较大的复杂问题,在这个层次进行分析,当分析清楚后在对其中的一个较大的复杂问题再次分解,直至分解到人的大脑可以有效处理的程度为止。

软件也一样按照这个思路去分析,然后再设计,再划分对象就不会出现楼主所述的问题。
baoganghan 2011-06-18
  • 打赏
  • 举报
回复
追求不同罢了,何来生死啊?
生如秋叶 2011-05-30
  • 打赏
  • 举报
回复
引用错了,请大家无视此楼
[Quote=引用 230 楼 zjarcher 的回复:]
引用 212 楼 ivantalk 的回复:

引用 24 楼 sp1234 的回复:
没看懂。或者,可能是玩概念先入为主的缘故,反而让人看不懂了。

比如说,我们经常把一个对象的属性值声明为一种对象(比如汽车有一个“厂商”属性或者“车门集合”属性,甚至种类就是自己(比如二叉树就有“左子树、又子树”两个属性)。说什么对象的状态值就不是对象了,红绿灯就不能作为对象了,这就奇怪了。

只……
[/Quote]
生如秋叶 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 212 楼 ivantalk 的回复:]

引用 24 楼 sp1234 的回复:
没看懂。或者,可能是玩概念先入为主的缘故,反而让人看不懂了。

比如说,我们经常把一个对象的属性值声明为一种对象(比如汽车有一个“厂商”属性或者“车门集合”属性,甚至种类就是自己(比如二叉树就有“左子树、又子树”两个属性)。说什么对象的状态值就不是对象了,红绿灯就不能作为对象了,这就奇怪了。

只有当一个对象极度简单,以至于根本没有应用领域概念,……
[/Quote]

不得不佩服一下,你的总结非常一针见血
生如秋叶 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 103 楼 sp1234 的回复:]

引用 102 楼 ulorrylorry 的回复:

我看不懂呀


其实很简单。看看lz是怎么说的:
绿灯只是“交通管制系统”的某个状态值的一种表达形式,而决定这个状态值的又是什么呢?显然,就是整个题目本身所描述的一套“游戏规则”。汽车能否通行,本质上不是红绿灯决定,而是这套规则决定的。规则是什么?在这里很简单,无非就是一系列的函数调用,最后返回一个True或者False的值来决定……
[/Quote]

抱歉,看你挺活跃,回覆你一下。我的意思是对OO的滥用杀死了面向对象。我的例子说明的是如何合理地辨识对象,通过行为的不同来区分对象,而非问题描述中的“名词”
zlcp520 2011-05-19
  • 打赏
  • 举报
回复
内容存入剪贴板
anwert 2011-05-19
  • 打赏
  • 举报
回复
泰山压顶啊,这根本是理解问题。
lifelongemail 2011-05-18
  • 打赏
  • 举报
回复
好吧,不明真相围观~
blisdom 2011-05-18
  • 打赏
  • 举报
回复
我是来赚分的下资源的,一不小心就碰到这么牛的贴子,三生有幸
accessbeiju 2011-05-18
  • 打赏
  • 举报
回复
死不了的
ns22020426 2011-05-18
  • 打赏
  • 举报
回复
恩 是的 深有同感
卡卡Gemini 2011-05-18
  • 打赏
  • 举报
回复
LZ提到的那篇文章的作者脑子有问题
lgjyxenos 2011-05-17
  • 打赏
  • 举报
回复
好文章
k_top_new 2011-05-17
  • 打赏
  • 举报
回复
个人觉得面向对象不那么容易死吧,最多就是在这个思想基础上进行改进,比如说java中的Spring框架有一个AOP思想,即面向切面编程,感觉在面向对象的基础上,对不足之处加以补充和完善。
hyz8888 2011-05-17
  • 打赏
  • 举报
回复
质量最重要
上岸の鱼 2011-05-17
  • 打赏
  • 举报
回复
楼主强词夺理,搬弄是非,鉴定完毕
虾说说 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 88 楼 bluedoctor 的回复:]

"面向对象"技术将在10-20年后“死亡”,当然不是严格意义上的,意思是很少有人提起了,就像今天的汇编语言一样,为什么?主要是基于以下几个趋势:
1,云计算,软件主要以“服务”的形式直接提供,不需要你去写复杂的程序了;
2,脚本语言,有没有注意到,JS即不像OO语言,也不像正真的函数语言,但现在却是大行其道,其它的脚本语言Python,Ruby等逐渐流行就说明了这一趋势;
3,多核CPU带……
[/Quote]

UP
xiongchangjing 2011-05-17
  • 打赏
  • 举报
回复
面向过程,面向对象,CGJB,不都是为了解决问题啊
qidaidu 2011-05-17
  • 打赏
  • 举报
回复
这些东西难了我就是一陪衬
zycfeixiang 2011-05-17
  • 打赏
  • 举报
回复
加载更多回复(170)

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧