天天看点

编程基础概念:面向对象编程

编程基础概念:面向对象编程

面向对象编程

        现在的世界,大家都用面向对象编程。这是结构化编程的基础上进一步发展出来的。以前编程的范式是数据结构+算法,后来软件规模越来越大,于是在一个程序里面出现了成百上千个函数过程和数据结构,程序很不容易维护。于是人们就把程序分解成子程序,子程序里面包含更小的组成部件,每个部件由一些数据结构及相关的算法组成。这些部件我们叫做对象。

        按照这样的观点,程序由一堆对象及对象间的消息互动组成。听起来好像很平常,甚至认为很自然很理所当然。这个思想却是一大进步。这个范式最后成为主流,现在几乎所有的系统都是按照这个范式构建的。

        这个范式为什么好呢?理论上的研究表明,需求构成了“问题空间”,程序构成了“解决空间”,两个空间的相似度决定了解决的困难度。传统上,我们要解决一个问题,计算机给我们提供的却是寄存器、内存、加法器这一类机器的概念术语,所以那个时候将问题空间映射到解决空间的时候很复杂。而面向对象事件驱动的模型,跟现实世界的问题空间有一定程度的相似度,我们能够比较省力地进行映射,解决问题。这个现实世界,本就是一个一个主体客体构成,它们发生了什么事情,本来就是通过消息传递方式联系在一起的。面向对象编程有一些新的术语,如类,对象/实例,消息,方法,属性。我们后面会接触到。

        不过我们要了解,任何一种编程范式都是有局限的,面向对象范式的缺点是过于强调名词(对象),而把动词(操作/算法)隐藏在名词中没有独立抽象出来,遇到有些场景会设计得比较别扭复杂。比如关系数据库的场景,1970年代发展出来的关系理论非常强大,但是跟面向对象思想不是很兼容,在设计软件的时候,我们被迫采用一种叫做ORM的方式进行映射,很复杂而且低效。我个人的观点,关系数据库是一种流,不是对象,应该采用代数演算来处理,我们的设计模式需要改变,要对等考虑对象、动作和关系。

Python支持多种类型的编程范式,例如过程式编程、函数式编程、面向对象编程,而且还可以融合多种类型的范式。我们后面写的程序也是过程和对象编程混合的,都会介绍一点。

Python类的结构是:

        类是相同对象的一个抽象,包含了属性和方法,可以理解为传统编程中的变量和函数,也可以理解为一个完成某功能的独立程序单元。

类本身只是一个定义,运行的时候要根据这个类的定义生成一些实例去执行,这些实例也叫对象。对象里面有自己的属性和方法,两个对象之间这些属性的值是独立的,互不干扰。

        而一个类还可以有子类,子类继承了父类的属性和方法,之外还可以有自己特殊的方法和属性。一个实际的系统都会构建一整套继承体系,这也是面向对象编程的难点,不小心设计,很容易把体系构建得乱七八糟。所以,架构师一般会设计一些接口或者纯粹虚的类,作为对外的界面,然后构造一些抽象类进行基础部分的实现,最后让程序员实现具体的子类完成特定的业务逻辑。

        在实际语言的实现中,除了常规的用实例去运行,还会提供类级别的运行,可以直接使用类里面的变量和方法。

看一个例子:

测试一下:

历史上,好些科学家都为面向对象编程贡献了想法,所以我们不能确切地说谁发明了面向对象的概念。我这里要提到的Alan Kay是比较出名的一个,他1960年代就提出了这个想法,发明了Smalltalk语言,为图形界面做出了先驱性贡献,于2003年获Turing奖。他最有名的一句名言是“The best way to predict the future is to invent it.”。

编程基础概念:面向对象编程

(Alan Kay,1940.5.17 - ,图片来源:维基百科)