首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

面向对象思想解决办法

2012-02-06 
面向对象思想对于“依赖于抽象而非依赖于实现”这句话,我一直都不明白,就这一句话让我苦思了一个多星期之前

面向对象思想
对于“依赖于抽象而非依赖于实现”这句话,我一直都不明白,就这一句话让我苦思了一个多星期
之前一直在学C++语言,对于语言的了解我觉得还不错了吧,但是我对于C++语言特性所写的测试代码根本不能让理解这句话。
恐怕这个问题已经超出了语言特性的范围了,我是说只是研究C++语言的范围。
任何一本介绍C++语言的书恐怕最多也只是几个类之间的事情,像C++primer也同样是这样,但是这个问题并不是几个类就说的清楚。
这句话换句话说是“针对于接口编程,而非针对于实现编程”
这句话同样拗口,真正理解他非常困难,异常困难,简直就是一道鸿沟,被这句话折磨过的人恐怕不在少数吧。
真正要有所理解这句话,恐怕没有3,5个项目经验的积累是不行的,而且还不是仅仅局限在一个小小的模块上(因为可能根本用不上)。
这个问题是一个设计上的问题,主要考虑的是系统的灵活性,扩展性和维护性,是一种大局观思想,我所理解的大局观思想是
一种总揽整个系统,甚至是更加上层的一种思维。也就说最低层次也是能掌控整个系统的对象建模。
感觉上似乎有点恐怖,实际上也没那么恐怖,要学的是思想,抽象是一类事物的统称,他可以被具体化,而在C++里面就是表现为多态,在设计上就表现为接口,本质上没什么区别,但是考虑大局观就更复杂些,为了系统更灵活,更容易扩展和维护基本上所有类的根基类都是抽象类,为什么要这么设计?这个思想要是理解了也算是C++学习上的一个里程碑了,甚至可以说不仅仅是C++,对于任何语言都适用。
至于如何理解这个思想,我目前只是有点概念,实在说不出来,让大牛们来说吧


[解决办法]
C++面向对象概念里的抽象其实说白了,
就是能把问题或者事物用一种通用的情形来描述或表达,
所以有了基类子类的概念,
在解决一些问题的时候,发现某些类和某些类组合在一起更适合解决这些问题,而且让扩展更方便;
所以这些解决问题的方法、思路和思想被总结和抽象一下就是所谓的设计模式。

[解决办法]
项目还得分好几大块呢, 一个块内就那么点东西, 爱怎么设计怎么设计, 只要大块之间通信规定好了就行了.
[解决办法]
当编写一个程序时,首先需要考虑的并不是程序的功能如何实现,而是整个程序的逻辑框架,而抽象类就是用来设计这个框架的,也就是你所说得大局。
[解决办法]
这个多看看设计模式还是好理解吧,不针对接口来编程的话系统的弹性就太差了
而且针对接口这个需要很多项目经验吗??想象计算机网络,计算机操作系统这些大系统的设计,哪个不是针对接口进行设计的呢??
[解决办法]
面向抽象编程,关键就四字:“封装变化”,纵观各种设计模式,无一不体现这一思想,如Builder模式,封装对象构建过程,Strategy模式,封装算法具体实现等等
[解决办法]
本质上来说,面向对象和面向过程的核心思想是一样的,区别在于面向过程的重点在功能划分,并耦合于函数原型;而面向对象的重点是功能+数据的划分,并耦合于接口,接口就是对象的原型!!!

要注意的接口是划分的产物。如果连对象都没划分清楚,就开始设计接口,最后一定会做不少无用功,弄不好整个软件被糟糕的接口绑架而走上歧途。

对象的划分比功能划分要困难许多,因为功能之间的关系可以表示为堆栈模型,是树状结构(或DAG,递归另算,因为一般不会使用复杂递归),而数据之间的关系则非常复杂,它有两个方面:空间和值(相当于lvalue和rvalue,前者用于引用,后者用于计算),数据的空间关系是一般图结构,值关系则是倒挂的树状结构,这也是为什么在自动化静态分析中,数据分析比过程分析困难许多。而数据的两重特性更加重了对象划分的困难。

这在设计模式里面可没提到,因为那本书是先假设你已经划分好了,然后根据划分的关系给你提供了20多种模式让你选择。如果一上来就先考虑模式,那你就输了。但是在某些显而易见的局部设计中,快速选择一种正确的模式,是条捷径,这也是设计模式这本书的目的。

正是因为对象划分的困难,所以才有重构,因为人不可能总是走在正确的路上。重构实际上是一种把你往正确道路上引导的方法,使得软件在演化的过程中不至于撞南墙也不回头。但是实际的效果还是由人决定的,因为最终是人来选择往哪个方向去重构。

[解决办法]
这个是在大的项目在,你提供接口给别人用,这时候别人只关心你的接口是如何声明的,在C++中接口声明为抽象类,通常有virtual声明的虚函数。这时候别人依赖的就是你的接口了,不是实现。你的实现可以修改,接口可以不改。如果有多种实现,具体用哪个实现一般由接口的使用者去选择,可以在配置文件中写。
你可以看看设计模式吧,会理解很多。
[解决办法]

探讨

引用:
这个是在大的项目在,你提供接口给别人用,这时候别人只关心你的接口是如何声明的,在C++中接口声明为抽象类,通常有virtual声明的虚函数。这时候别人依赖的就是你的接口了,不是实现。你的实现可以修改,接口可以不改。如果有多种实现,具体用哪个实现一般由接口的使用者去选择,可以在配置文件中写。
你可以看看设计模式吧,会理解很多。

这句话是为了系统……

[解决办法]
实现各种各样的接口是一个很沉重的负担,必要的时候再用。如果每个类都从接口实现起,会很累。有时候强耦合其实也很好,切莫臆造接口,盲目套用设计模式。这是经验之谈。
[解决办法]
探讨

引用:
看我blog
http://www.cnblogs.com/healerkx/category/136925.html

之前都已经拜读过了
现在的目标是系统的对象建模,几个类之间的关系我可以处理的毫无问题,但是大局观还不够,苦恼的是这个

[解决办法]
依赖于抽象而非依赖于实现
这句话我的理解是: 抽象是一种形式,比如方法名命名规范,文件存放规范,对象之间交互规范(接口),数据传递的格式(json啥的) ,等。那么这样就可以实现将大的项目划分成一块一块的。可以横分,可以纵分,还可以单独出来一个一个子系统。好处是巨大的,就是耦合很小,内聚很大,方便分工。

到底是否需要抽象,我觉得还是需要斟酌的。
因为过分的抽象,会过头,因为,很多时候,某个模块功能很固定,该怎么设计就怎么设计都没错,没必要非要搞个很复杂的设计模式,即使最终那个模块需要调整,但是因为是独立的子系统,随便调整下就好了。

我是搞php的。对面向对象刚刚实践。
------解决方案--------------------


探讨

引用:
引用:

引用:
看我blog
http://www.cnblogs.com/healerkx/category/136925.html

之前都已经拜读过了
现在的目标是系统的对象建模,几个类之间的关系我可以处理的毫无问题,但是大局观还不够,苦恼的是这个
……

热点排行