什么是OO思想

看见人家在谈OO思想,我很惶恐,也很迷惘,到底什么是地OO思想!怎么来培养自己的OO思想呢?
请各位和Banq大哥,指点我这个迷惘的羔羊!

OO思想简言之,我们谈的 想的 编的 做的 都是围绕一个个对象。

>怎么来培养自己的OO思想呢
了解对象基本概念,对象关系,设计模式, 对象建模,
当然对象框架也必须了解,这是一个渐近过程。

如何来把握,我是不是真的理解了OO思想!我还是觉得很迷惘。
DDD这本书我读了一点,我有的地方真的理解不了!是不是没有OO思想呢?
我很喜欢这个行业,用java编程,但如何才能一步步地往高处走,真的很担心,深怕自己误入歧途,很想Banq大哥和各位指点我一下,如何往下走!

>DDD这本书我读了一点,我有的地方真的理解不了
前几天在TSS上看到一个老外说了,DDD背后就是设计模式,我认为非常正确。

OO不是靠几本书,或几个程序就能练就的,需要一个过程,如果将大学四年都用来进行培养,还是有可能,可是现在国内四年教育不是这么做的,学生毕业后,就没有自己的四年。

所以....在OO方面,大部分都是一穷二白。

你不用担心,都是在一个起跑线,现在认识到了,起步不晚。

2004年左右,OO在J道论坛还被一些人骂得狗血喷头。唉..

Banq大哥,你说现在我认识到,起步不算晚,但如何走步!能不说指点一下?万事开头难,我觉得难就难在怎么开头!
谢谢!

我走过路可能不适合你, 如何让初学者更快地掌握OO思想也是我一个研究项目,因为我也搞培训.

所以,你得问题也比较难倒我,有一个强制办法:在项目实践中强行使用GoF设计模式,以使自己了解设计模式,再和别人讨论.

为什么推荐从Gof设计模式这个高难度知识入手呢?因为OO思想是一个说了也白说得问题,过去我用禅来打比喻,OO思想是无法象1+1=2那样传授告诉别人得,必须每个人自己体会,那么体会得实践是什么?就是自己在项目中开始有意识使用设计模式.

下面一步就是使用Struts Hibernate之类正宗对象框架,特别是持久层,摆脱数据库得影响,以前我说数据库时代过去了,就是这个意思,为什么搞Swing等图形程序员容易接受OO,因为他们没有关系数据库干扰,而搞J2EE得则经常被数据库和过去数据库编程经验干扰,围绕数据库编程容易导致过程编程,这些都是与OO格格不入的.

关系数据库与OO存在天然阻抗,也就是不匹配,所以我们要使用O/R mapping如Hibernate之类框架来培养帮助我们对抗数据库的干扰,当你知道什么是OO后,再使用JDBC,这时你心目中的JDBC就是顺服于OO思想下的工具了,而不是主导你破坏你OO思想的恶魔.

数据库时代的终结
http://www.jdon.com/artichect/dbover.htm

总之,要走上OO,需要彻底摆脱过去经验对自己的干扰,因为我们国内大学的软件教育基本都是过程化编程思路,自己走上工作岗位后,又都是自觉学习,这些都其实不是OO,这些知识和经验会干扰OO思想的形成,要和他们做斗争,驱赶他们.说白了,就是与自己进行痛苦斗争,蜕变是一个痛苦过程,尤其是思想方法,所以做到的人很少.

坚持下来的人,达到OO彼岸的,唯有真正对软件热爱和有兴趣的.所以考验你是否走上OO思想,就看你的兴趣和毅力.

很多人说搞Java苦啊,其实也是反映这个艰苦历程.

其实,在这个过程中,需要经常和别人讨论,J道等论坛提供这样场所,我们经常看到很多人在论坛讨论技术秘籍问题,而很少提及设计问题,怎么设计好,如何建立一个对象,对象边界在哪里,这些讨论语言包括在J道论坛都很少看到,这只能说明一个问题.....

Evans DDD其实将对象如何建立这个基本问题进行了总结,就如GoF设计模式总结了23个模式一样,这些需要我们不断讨论....


谢谢您的回复!
我会努力往这方面走的,我也相信我有这样的恒心!
谢谢您Banq大哥,说实话我从Jdon上学到很多东西!
我会一直关注Jdon!

说实话,现在学习OO的环境,无论从理论和实践方面要比我们当初好多了,现在OO在Java领域可谓是瓜熟蒂落了。

如果我们再不抓住的,真的没有必要再做这一行了。

我不同你bang的想法,你把OO神化了。并不是所有的问题都需要用OO来解决的。因地制宜才是合理的选择。

>我不同你bang的想法,你把OO神化了

是的,有人说OO不是银弹,看看国外TSS网站上老外关于OO争论的一个贴子,特别是一个老程序员说:我近几十年的职业生涯的大部分时间是在挽救修改别人低劣的代码,是不是我们还要再等二十年呢?

http://www.theserverside.com/news/thread.tss?thread_id=42602


> OO不是靠几本书,或几个程序就能练就的,需要一个过程,如果将大学> 四年都用来进行培养,还是有可能,可是现在国内四年教育不是这么做> 的,学生毕业后,就没有自己的四年。

大学的四年都培养OO?OO确实是企业应用开发的利器,但没必要上升到这个高度吧。所有的大学毕业生们都一个个的java?基础的算法、数据结构才更应该是乘这四年好好学习的东西,我们更缺一些基础的东西。举个最直白的例子,OO领域打的最火的java/.net,不都是美国人鼓捣出来的吗?

当然如果想做应用开发的话掌握好java以及其中设计模式的思想很重要,学java最好的体验是在具体的项目中,比较代码的优劣,总结成败的得失。现在国内也很缺优秀的java开发人员。
但让国内的大学都四年教授java和OO,就觉得过了。

我们不是在讨论OO吗,为什么一定就要把JAVA拉近来。掌握了OO的概念后可以应用在不同的语言上,JAVA只是比较成熟的一个罢了。4年学一个语言当然是crap,一个学期OOP,一个学期00D(用的是JAVA),足以,往后的就靠自己去研究了,当然还有其他高级的OO应用的科目。BANQ提倡了OO,没有限制在JAVA。Data Structure和procedure programming应该是放在OOP/D之后的,这样对OO的概念会有更深的认识,和对DSPP本身更容易理解和掌握。

中国学生就是拜倒在“基础”上了,一提到什么技术就说,把基础打扎实。要的是科学(SCIENCE),基础(fundamental)是科学的训练的第一步就是最容易的,时间应该是花得最少的,真正在research和后面的advanced环节就很少听到中国学生/教师提倡。网上资源无穷,但总是有学子在求书,求代码等等,就是没有research的能力。如果还不意识到这个问题,那就永远停留在基础上面吧。

PS:楼主,很多东西没有真正的对错的,不值得花时间考究什么是“正道”,“误入歧途”也会给你带来有价值的收获。最好的学习方法是用技术去实现自己想要的东西,如一些dream projects,没有目的的去学,就好比为学习而学习。

Evans DDD和GOF 设计模式可以说是OO思想实战的左右手。

OO其实要解决两个重要基本问题:对象如何设计创建;对象创建后之间关系如何协调。

Domain Model解决了业务对象如何创建设计问题,也就是业务对象应该怎样从需求中提炼出来成为一个对象,如果没有这一步,我们何以面向对象?或基于对象编程呢?

当对象很多时,如何协调组织他们关系,使得更易于变化,就象中国古代阵法一样,一个阵法应对一种情况的。

这两个基本方法思想掌握了,你的系统就不同于以往传统过程化面向功能的系统了。

我来说几句吧,其实所有的design pattern,还有OOD,都讨论同一个问题,那就是当你做一个系统的时候,如果新的需求来了怎么办?你的系统是不是能够不用修改代码或者做最小的修改来满足新需求,(OCP原则),所以围绕这个问题,OO语言,有了他们的解决知道,其实所有的其他过程语言例如c也都可以解决,只不过写出来的代码没有OO语言来的优雅和漂亮,因为是compiler已经支持了那些encap., inherit, poly.特性,所以说白了,也无所谓的是否一定要OO,只要你的解决之道能够,解决OO所优雅解决的问题,也就够了。多想想这个,自然明白了什么是OO。 以上是个人观点。仅供参考 。