当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

C++从零开始(十二)何谓面向对象编程思想

    前面已经说明了C++中最重要的概念——类,并且介绍了大部分和类相关的知识,至此,已经可以开始做些编程方面比较高级的应用——设计程序,而不再只是将算法变成代码。要说明如何设计程序,有必要先了解何谓编程思想。

    编程思想

    编程,即编写程序,而之前已经说过,程序就是方法的描述,那么编程就是编写方法的描述。我知道如何到人民公园,然后我就编写了到人民公园的方法的描述——从市中心开始向东走400米再向右转走200米就是。接着另一个人也知道如何去,但他编的程序却是——从市中心沿人民东路走过两个交叉口,在第三个交叉口处右转,直走就能在右手方看到。很明显,两个程序不同,但最后走的路线是相同的,即大家的方法相同,但描述不同。

    所谓的编程思想,就是如何编程,即编写程序的方法。那么之前在《C++从零开始(八)》中说的编程的三个步骤其实就是一种编程思想。这也是为什么不同的人对同一算法编写出的程序不同(指程序逻辑,不是简单的变量或函数名不同),不同的人的编程思想不同。

    如果多编或多看一些程序,就会发现编程思想是很重要的。好的编程思想编出的程序条理分明,可维护性高;差的编程思想编出的程序晦涩难懂,可维护性低。注意,这里是从程序的易读性来比较的,实际出于效率,是会使用不符合人脑思维习惯的编程思想,进而导致代码的难于维护,但为了效率还是会经常在程序的瓶颈位置使用被优化了的代码(这种代码一般使用汇编语言编写,算法则很大程度上是数学上的优化,丢弃了大部分其在人类世界中的意义)。

    本系列一直坚持并推荐这么一个编程思想——一切均按照语义来编写。而语义是语言的意义,之前说它是代码在人类世界中的意义。比如桌子,映射成一个结构,有桌脚数、颜色等成员变量,那么为什么没有质量、材料、价格、生产日期等成员?对此有必要说明一下“人类世界”的含义。

    世界

    我们生活在一个四维的客观物理世界中,游戏中的怪物生活在游戏定义的游戏世界中,白雪公主生活在一个童话世界中。什么叫世界?世界即规则的集合。比如客观世界中,力可作用于有质量的物体上,并进而按照运动学定律改变物体的速度;电荷异性相吸同性相斥;能量守恒等,这些都是对客观世界这个规则的集合中的某些规则的描述。注意它们都只是规则的描述,不是规则,就好像程序是方法的描述,但不是方法。即方法和规则都是抽象的逻辑概念,各自通过程序和论调来表现。程序就是我们要编写的,而论调就是一门理论,如概率论、运动学、流体力学等。而前面所说的游戏世界,是因为游戏也是一系列规则,关于这点,我在我写的另一篇文章《游戏论》中做了详细的阐述,如果还未理解世界的概念,《游戏论》中关于何谓游戏的阐述希望能有所帮助。同样,童话世界也是由一系列的规则组成。如白雪公主能吃东西,能睡觉,并且能因为吃了毒苹果而中毒;魔镜能回答问题等。

    那么就算了解了世界这个概念又怎样?有什么用?前面说了本系列是推荐按照语义来编写程序,即知道了算法后按照《C++从零开始(八)》中说的三步来编写程序。而算法是基于某些规则的,如给出1到100求和的算法是(1+100)*100/2,这里就暗示已经有那么些规则说明什么是加减乘除,什么是求和。即一个算法一定是就一个世界来说的,它在另一个世界可能毫无意义。因为算法就是方法,是由之前说的命令和被操作的资源组成,而命令和资源就是由世界来定义的。

    前面说根据算法写代码,其实是先制订了一个世界来做为算法展示的平台。如之前的商人过河,其就在如下的一个规则集上表现的:有一只能坐两人的船可以载人过河;有三个商人和三个仆人在河的一边;河的任意一边仆人数多过商人数商人就会被杀。这是对过河问题所基于的世界的严重不准确的描述,但在这过于抽象并没什么好处,只用注意:上面的商人和仆人不是现实世界中的商人和仆人,他们不能吃饭不能睡觉不能讲话,甚至连走路都不会,唯一会的是通过坐船过河来改变自身的位置。当某一位置(即河的某一岸)的仆人的实例多于商人的实例时(且商人的实例至少有一个),则称商人被杀。上面的描述暂且称为商人仆人论,它是对过河问题所基于的世界的一个描述。

    另一个人却不像上面那样看待问题。河有两个岸,每个河岸总对应着两个数字——商人数和仆人数。有一个途径能按照某个规则改变河岸对应的两个数字(就是坐只能坐两人的船过河),而当任何一个河岸所对应的仆人数多于商人数时(且商人数不为零),则称商人被杀。此人没有定义商人和仆人这么两个概念,而只定义了一个概念——河岸,此概念具有两个属性——商人数和仆人数。这是另一个论调,暂且称为河岸论。

    什么意思?上面就是对商人过河问题所基于的世界的两个不同论调。注意上面论调不同,但描述的都是同一个世界,就好像动力学和量子力学,都是对客观世界物体之间作用规则的描述,但大相径庭。算法总是基于一个世界,但更准确点的说法应是算法总是基于一个世界的描述,而所谓的设计程序就是编写算法所基于的世界描述,即论调,而论调其实就是问题的描述。

    现在考虑前面说的商人仆人论和河岸论,它们都是同一世界的描述,但前者提出两个名词性概念——商人和仆人,各自具有“位置”这个状态和“坐船”这么一个功能以及“商人被杀”这个动词性概念;后者提出一个名词性概念——河岸,具有“商人数”和“仆人数”两个属性和“商人被杀”及“坐船”两个动词性概念。在此,说后者比前者好,因为后者定义的名词性概念更少(即名词性概念比动词性概念更容易增加架构的复杂性,因为其代表了世界中东西的种类,种类越繁多则世界越复杂,越难以实现),虽说不一定更容易理解,但结构更简单。

    易发现,所有的论调都可以只由“名词性概念”和“动词性概念”组成,其中前者在数学中就是数、实数、复数等,后者是加减乘除、求导等,它们都被称作定义。在《游戏论》中,我将前者称为类,而类的实例就是方法中被操作的的资源,后者称为命令。而在方法中,前者是资源的类型,后者是操作的类型。一个论调,提出的概念越少,结构就越简单,也就越好。但应注意,就电脑编程来说,由于电脑并不是抽象的概念,而是存在效率因素的,因此基于前述的好的论调的算法而编出的代码的运行效率并不一定高。

    因此,所谓的程序设计,就是设计算法所基于的论调,而好的程序设计,就是相应的论调设计得好。但前面说了,效率并不一定高,对此,一般仅在代码的瓶颈位置另外设计,而程序的整体架构依旧按照之前的设计。随着程序的日趋庞大,清晰简明的程序架构越显重要,而要保持程序架构的简明,就应设计好的论调;要保持架构的清晰,就应按照语义来编写代码。下面,介绍如此风靡的面向对象编程思想来帮助设计程序。

共5页 首页 上一页 1 2 3 4 5 下一页 尾页 跳转到
相关内容
赞助商链接