OO 不难,难就难在如何掌握好粒度的粗细程度,是需要经验的,你说对吗。
msn: bill_lyp@hotmail.com(欢迎交流)

用OO的开发方式去分析,设计一个系统,
掌握OO还是需要掌握许多的,我认为有以下几点必须掌握:
1. UML 这是OO的工具,OO 开发人员交流思想的工具.
2. 了解RUP. 掌握好的软件开发过程才能开发出好的软件,RUP其实就是指导我们OO分析与设计的一个开发过程.我一直认为RUP是正宗,虽然他烦琐.
3. 理解建立领域模型的重要性.Evan的DDD的确是这样的好书.这个到现在也说不出什么道道.
4. GOF 23 DP DP其实就是OO思想的最好的体现,是牛人OO思想的结晶.学习DP的时候不光要理解怎么用,更重要的要理解从重构到模式的思想.这个过程其实就是理解 OO设计原则的过程. OCP,SRP等等这些.学习设计模式是方法,而最根本的还是要掌握最根本的OO 设计原则.
5. 编码的过程中,要彻底理解"针对接口编程"这句话.这个其实就是建立在好的设计基础上的.我当时理解这句话的时候有所体会的时候,在看李建忠设计模式视频的时候.
6. 学习IOC.OO设计原则OCP是实现程序易扩展的一个理论保证,IOC 我觉得就是实现的一个良好手段.这也正是构件化编程的基础.我在.NET里面学习的是Castle, Java里面当然是Spring了.
7. O/R Mapping.当了解了O/R Mapping以后,数据库真变的不是那么重要了.的确是不能太关注数据库,我的实践已经证明过度关注数据库的后果肯定是面向过程.

最后在提一点:OO设计很重要,但我觉得更重要的还是OO分析,即建立领域模型.
面向对象的最独特之处,在于他分析需求的方式,不要过分的纠缠于程序的画面、操作的过程,数据的流程,而是要更加深入的探索需求中的一些重要概念。

唉,大家为了讨论“什么是OO思想”,又把什么UML、RUP、某某框架之类的东西摆出来,这些对解释“什么是OO思想”真的很不重要,尤其对初学者来说。

大家编程序是为了让编出来的程序帮我们做事情、解决问题的。简单地说,在目前的计算机体系下,所有程序最终的形式都是一大堆机器指令对数据的操作,操作的结果就是我们想让计算机帮我们做的事情。所以我们写程序从根上来说就是写一条一条的机器指令教计算机怎么一步一步地操作,最终实现我们要做的事情。这也是计算机刚开始出现时人们就采用的编程序的方法,目前大家称这种方法为“面向过程”的编程方法。

“面向过程”的编程方法基本的编程方式如下:
一切以“我”为中心考虑问题:要做某件事情,第一步要做A、A做完后要做B事情、如果B不成功那么我做C,否则我做D......等等。在这个过程中,把重复出现的一些步骤(完成了更高层概念的事情)包装在一起当作一个整体使用,称之为“函数”(这是一个层层包装递归的东西,直至最底层的机器指令);把逻辑上相关的一下数据(代表了更高层概念的事物)包装在一起当作一个整体使用,称之为“结构”(这也是一个层层包装递归的东西,直至最底层的存储器)。

这种编程方法其实是人们很自然的做事的方法,大家考虑做事的时候一般都是这么考虑的。

而“面向对象”的编程方法(即OO思想)打破了以“我”为中心考虑问题的习惯:要做某件事情,首先考虑应该由“谁”来做,或者说做这件事情是“谁”的责任(“谁”来负责这件事情),接着考虑“谁”应该和“谁”协作来完成更高层概念的事情。指定由“谁”来做这件事情的时候不必考虑他是如何做的(即如何实现的),只知道他负责这件事情能得到需要的结果就行了。而这个“谁”就称之为“对象”,所谓的“对象”就是负有责任的东西。而“对象”在实现自己负责的事情时也可以做同样的考虑(应该由“谁”来做;“谁”应该和“谁”协作来完成),这个过程也是一个层层递归的过程,直到最后总是由逃脱不了责任的对象简单地亲自操作一下:)。

“面向对象”编出来的程序与“面向过程”编出来的程序在代码的组织上一个明显的特点是决没有一个主控对象来统一指挥,而是一些相互协作的平等对象组成的一个协作网络;决没有一个主控对象到处搜集信息来完成某件事情,而是把事情交给知道这些信息的对象来完成。

(至于为什么会提出“面向对象”编程和“面向对象”编程的好处,在这里我就不说了)

但是光有“面向对象”的思想并不能保证写出来的程序一定好的,而是要遵循“面向对象”的一些编程原则才有可能写出好程序,比如:封装原则、隐藏原则......等等,介绍这些编程原则的书籍很多。总的来说:每种对象负责的责任越单一越好,不要让一类对象负太多的责任尤其是不相关的责任;对象在完成自己负责的事情的时候,最好不要让外面知道或者说这方面信息外面知道的越少越好。尤其要注意的是:一定要把握多态性这个概念。
GoF的设计模式更是提炼了优秀的“面向对象”编程原则和思想,例如:
封装变化点;
面向接口编程;等等,把“面向对象”的思想提到了一个新的高度,真是绝了!


我的以上这些思想不是以专家的身份来说的,我只是一个普通的程序员、一个编了十几年程序员;我也不是计算机科班出身,也没受到过系统的计算机教育。这只是我的一点悟出来的体会,并从一些书上得到认可的思想,不当之处请大家拍砖;希望有机会和大家分享一下我更多的悟出来的一些思想。

题外:
有人讨论说“use case 和场景”引入UML(或者说RUP)不是面向对象的,哈哈,真是笑死人了,那是他们不了解面向对象思想的真谛罢了,关键是你以什么样的眼光来看待它。照他们这么说,对象方法的实现里最终不都是过程语句吗?在我眼里,1+2这样的语句都是面向对象的。

有人说“对象”就是把相关的数据和相关的操作方法封装在一起。这是彻底的垃圾思想,千万不要这样看待对象。

23种设计模式我有看了一些,但是中间有很多我不明白,有很多时候反而发现那些设计模式反而会使代码变的更难己理解!。。。。。。。。。

OO思想的--核心--应该是“泛型编程”,也就是尽可能地把变量定义为抽象数据类型,即基类优先。

程序中,所有的数据都是有类型的,如整型,浮点型,串型,某个结构,某个类。
传统编程语言中也有封装对象的概念,如我们可以基于c的struct,union封装出一个函数集合,因此封装不是传统编程语言和OO语言的根本差别;但在传统编程语言中,变量的类型是固定的(僵硬的,明确的,有唯一性的。。。)。而OO语言中,变量的类型可以是抽象的(大概的,不确定的。。。),OO程序中,到处都是抽象类型的引用。很多新手学习OO语言只知道“封装”、"继承",其实“多态”才是OO的灵魂,“多态”彻底推翻了传统语言中的固定数据类型观念。


所谓“面向接口编程”,只是“泛型编程”的一种极端情况,请高手们不要舍本逐末,只把一些古怪的咒语灌输给新手,而不告诉他们为什么。


实际上,只要你真正了解OO语言的“泛型编程”这个OO的DNA,其他如设计模式、建模等等,都是自然而然的东西。


好!

终于明白OO是什么了。难啊。

什么呀。。谈到思想为什么要说大学呢?
大学真的没学到东西么?
不上大学你行吗

看了banq得设计模式得前言,我的理解是对象一个功能实体。我们应该把对象做成一个具有某种功能的东西,也不应该把他放在一个具体的业务环境中,我们在考虑到业务需要时,我们不应该判断一下(用一个if else来实现)。

for sure,oo thought is very importance for java and other oo language.But the arithmetic and data-configuration are also very importance.Because after u know well with arithmetic and data-configyration, u know how to choose Objects, such as arrayList and linkedList have same effect but different implement mode and different use stage.

我认为不是在大学学了什么,而是你怎么学的,大学并不是包教包会,
它只是提供了一种竞争环境!(有的是养猪场!)

同意楼上的“养猪场”,现在的学校都是教数据结构,算法,说是基础,可是那要看什么人了,我学java,学oo要什么数据结构,算法,浪费时间,java都封装了,只等我们用。有人说什么都是外国弄出来的,我承认,可是那是另一方面的知识,就像搞密码学的,图形学的要学数学,用java需要吗?搞java就是oo,不懂oo的去看,不要瞎捣乱,喜欢底层的也不能这样。

语言是思想表达的工具
java是语言,OO是思想

语言与思想的互动是一个相互促进,相互提升的过程,我们需要java,也需要oo
。不要把java与oo完全割裂来理解。

目前为止,java是帮助我们理解oo比较合适的工具。

同意youway的观点,java外力,oo是内力,我们应该内外兼修,内修文德,外治武训!

楼上说的很精彩,顶你!!