su_junwei 发表于 2009-6-25 20:57:31

[转载]面向对象—我的一点理解

OpenFOAM的程序架构实在令人折服,最近在做有限容积格子波尔兹曼方法,感受颇深。有些OpenFOAMfans可能被C++面向对象的东西搞的焦头烂额。面向对象说起容易,实现却难。植入openfoam小功能容易,植入大模型比较难。其实大程序的实现,并不是实现细节而是程序架构。决定程序是否成功,关键不在于写程序的人,而在于设计程序架构的人。软件开发而言,设计程序和写程序差别甚大。说白了,就是程序设计思想的事,软件开发过程中的思想培养才是最重要的。我对面向对象了解也是限于皮毛,现就我理解的面向对象给大家列于此,仅供参考。
下面从面向对象的四个基本特性——封装、继承、虚拟、多态给大家简单的介绍一下,并给出我在程序设计的时候一贯遵循的原则。
1)封装:
正如起表面意思所述,封装就是将一些东西封在一起,只能看到外表,不能看到内部。对程序而言,就是对外隐藏实现,封装后的东西只需要向外提供一个通用的接口。只要接口不变化,实现变了,不会影响调用的程序。面向对象中经常提到的类(class)就是为大家提供的一种封装平台,接口部分就是那个public里面的东西,而里面具体怎么实现的,类的使用者无需知道,就算里面实现变了,也不会影响使用者的使用。 个人感觉,“封装”是面向对象程序设计的关键。如何封装,如何设计接口呢。我一向奉行的原则就是——"发现变化然后封装",这里就是封装的是变化,这里的变化并不是毫无关系的变化,是相似中的差异。比如,不同的湍流模型,他们是相似的,因为他们都是湍流模型,他们有差异,因为不同的湍流模型,实现是不一样的。这时候就要封装了,设计一个类,湍流模型为父类,不同的湍流模型为子类,变化作为他们的接口。
继承:
继承是子类具有父类的行为。有了他,一些父类的行为,无需在子类进行重新定义。继承的就是那些相同的东西。如前面说的湍流模型,所有湍流模型的共同的东西,可以写在父类中,子类自动具有这种能力。但是,在程序设计时候,应尽量少用继承,因为继承子类的访问会减慢程序的执行速度。一种比较好的程序设计思想就是利用聚集,就是将各个功能分为很多小功能,然后每个小功能组成大功能。可以这样实现:定义大功能类,大功能类中带有小功能类的一个对象,这样大功能的实现,可以通过不同的小功能协调来完成。 小功能类的封装也要遵循前面的封装原则。
虚拟和多态
虚拟和多态是上面封装继承的实现及其实现后所呈现出来的行为。
前面已经说了,封装的是变化,但是如何让这些变化对于不同的模型表现出不同的实现呢? 那就靠虚拟。就是将那些变化的东西写成虚拟的接口,然后不同的模型对这些接口进行实现。这样对于同一个函数调用,对于不同的模型,表现出来的行为就不一样(因为他们的实现不一样)。用面向对象里面的话来说,对于相同的消息,不同对象将得到不同的相应。

再举个简单的例子
老师说下课了,回家吧。
对于不同的同学,执行的行为肯定不一样(因为所有同学回家的路都不一样)。
变化——不同的同学,回家过程有差异,但他们有相似之处——都是回家
这时候就要封装了。封装什么阿?---变化,就是封装的是回家的行为
这样对不同同学给出不同的实现。 这样在老师说“回家吧”的时候,对于不同的同学对于这一消息,才会表现出不同的行为。

回头看看这个例子,封装的是什么?
变化(回家的行为)
什么变化?
不变中的变化(回家这个事)。

总而言之:面向对象设计个人感觉应该遵循一个基本原则:找到相同中的变化,封装之。

我说明白了吗?

转自OpenFOAM研究:http://blog.sina.com.cn/openfoamresearch

[ 本帖最后由 su_junwei 于 2009-6-25 20:59 编辑 ]
页: [1]
查看完整版本: [转载]面向对象—我的一点理解