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

我也同意

>OO思想简言之,我们谈的 想的 编的 做的 都是围绕一个个对象
言简意赅,但是做起来很难,实际中我们谈的 想的 编的 做的 都是围绕一个个“数据表”。

这实际就是以什么为中心的问题中心位置的改变带动整个软件业的革命,就象过去国家以阶级斗争为中心转变到以经济建设为中心一样,不可小觑。

[该贴被banq于2008-03-27 11:06修改过]

banq真是nice啊,说的这么详细

其实我觉得OO这个东西真的是要靠领悟和经验的,没有这样的OO环境让你实际的去感受OO,只是在那里看书是不会有很快的进展的。

我有个小小的经验分享,国内的程序员大部分时间都是在维护别人的代码,在上面修正bug,很难有很多机会去设计一个全新的系统,这个时候我们可以去试着去对已有的代码进行重构,看能不能结合教材上的设计模式给出更好的设计方案,这样也可以起到一个对设计模式更深刻理解的作用。

说得很对

这些东西,没有实践,说的再好,我也不相信。

说的真的很好,现在看一些论坛,看着总是很懵,好多对初学者陌生的词,感觉很难理解,所以看一遍和看一百遍没有什么区别。这位高人在这里确实说了一些实质的东西,学习了。

为什么搞Swing等图形程序员容易接受OO,因为他们没有关系数据库干扰,而搞J2EE得则经常被数据库和过去数据库编程经验干扰,围绕数据库编程容易导致过程编程,这些都是与OO格格不入的.


支持,同感

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

真正做起来真的很难,学了两年大学,虽然刚开始接触Java,但深入领悟真的很费神,想问banq,到底大学学什么?如何去适应这个千变万化的世界?


还是 zhaoping_yu 说得比较透彻。


要理解OO先要追溯它的起源:

simula 67是面向对象编程语言的鼻祖,Simula这一语言是Ole-Johan Dahl和Kristen Nygaard在挪威奥斯陆计算机中心为模拟环境而设计的。(据说,他们是为了模拟船只而设计的这种语言,并且对不同船只间属性的相互影响感兴趣。他们将不同的船只归纳为不同的类,而每一个对象,基于它的类,可以定义它自己的属性和行为。)这种办法是分析式程序的最早概念体现。在分析式程序中,我们将真实世界的对象映射到抽象的对象,这叫做“模拟”。Simula不仅引入了“类”的概念,还应用了实例这一思想——这可能是这些概念的最早应用。

可见OO是从仿真领域产生出来的,它天然就适用于像仿真,游戏这一类领域。试想一下你要写个简化版的星际争霸,魔兽争霸之类的游戏。估计你第一想到的方法就是OO,对象、类、属性、操作、继承...多么亲切而自然阿。要真是让你用结构化的方法来写,呵呵一个头两个大。

当然,后来OO因为其优点(比如能表达更高层、更大的概念从而简化了系统,使得我们能够构筑更大更复杂的系统。比如能够较好的应对需求变化)被扩大应用到大部分的领域,尤其是企业计算领域。但这并不表示OO的思维和方法也天然适用于这些领域。企业的很多东西是过程化的,比如流程。在这里结构化的方法更为直接自然,OO方法有难度。我想这也就是为什么很多人都会用OO语言的写出结构化的代码了。

OO也好,结构化也好都是思想和方法嘛,在计算能力上是等价的,一样的活两个都能干,为什么在企业计算领域哦OO成为主流。那是因为,虽然OO应用于企业计算领域在某些方面思维不是很自然,但是OO的其它优点太具有决定性了。所以呢,初学者还是要想办法克服这个思维障碍的,具体的办法就是在OO的最初产生的领域多做练习,多写一些游戏,多体会就OK了。

等有些体会了,再看设计模式,DDD之类的。

正在学习中:抽象,封装,继承,多态;开闭原则,单一职责,面向接口或父类,里氏替换;设计模式;

OO直接翻译过来就是“面向对象”,它作为一种编程思想可以说是划时代的进化。虽说可能不是传说中的“银弹”(解决软件太复杂的万能灵丹),但是却能使挣扎在“焦油坑”中,那些绝望而无助的受难者猛然间看到希望。写《人月神话》的时候OO还没有出来,现在作者很可能对于这一项技术性的变革投以赞赏的目光。
有人说,编程是门艺术。而我认为,更重要的思想认识是——软件工程是门哲学。事实上,面向对象最重要的思想我认为就是来源于哲学思想。具体来说,就是——抽象化。这里我直接把百度百科里面关于哲学里的抽象引述一遍——“抽象是认识复杂现象过程中使用的思维工具,即抽出事物本质的共同的特性而暂不考虑它的细节,不考虑其他因素。 ”通过抽象化,我们的软件系统就可以抓住事物的共性,从而抓住事物的本质。由于诸多因素,导致的结果是——软件需求在不断变化。而事物本质变化却不会像需求变化那样大。这样,应付需求的变化,我们只需要在原来抽象化的软件模型的基础上做局部修改。举个例子:我们制造出汽车,放在普通公路上,我们的需求是安全、便捷的行驶,放在赛道上则是需要尽可能跑得快。两者需求大不同,却不需要我们重复创造两个汽车类,而是只要在汽车类的基础上做局部的修改。从这个方面来看,我认为,可以把“面向对象”理解为“面向类”。
另外,通过面向对象的方法建立的软件模型也符合人类认识事物的习惯,便于理解。这一点,对于一个软件团队来说,是高效沟通的有力保障,它所带来的益处完全可以提高到战略高度。因为一个清晰明了的设计模型,是团队成员相互沟通的有力保障。这一点,在《人月神话》书中也花了大量篇幅介绍团队成员如何有效沟通,前辈们甚至用上了微型胶片来减少存档量。如今,一个简单明了的设计模型减少了很多这方面的投入。
关于“面向对象”的认识,到了这一层,我们似乎可以用平静的心去实现陌生领域中的软件建模,而不是面对复杂多变的需求焦虑又不知所措,就像“焦油坑”中绝望无助的怪兽,越挣扎下沉的越快,也不会面对当下层出不穷的新技术、新概念产生迷茫、踌躇不前。剩下的问题就是捕获需求,抽象化,寻找其中的类……而那些设计模式、持久化等概念便会自上而下的体会到。到那时,我们或许会因为与前辈在思想上产生共鸣而会心一笑。

2011年01月29日 21:03 "showerxp"的内容
“面向对象”理解为“面向类” ...

其实这样说是不对的,对象= new 类,这里思维方式有点不同了,在对象思维中,我们有对象活在内存中,但没有说类活在内存中的说法。例如javaScript,他的对象很特殊,但他的确是面向对象。所以说类与对象是两回事,类可以说是由语言去决定的。可以这么说,我们的面向类思维是被java“强奸”了,呵呵。
[该贴被SpeedVan于2011-01-30 10:36修改过]