关键词 面向对象编程范式 (Object Orientation paradigm ) 面向对象编程思想
★面向对象编程范式是以人们熟悉的、习惯的现实世界和思维方式为隐喻(metaphor),以概念/类型或其实例化的对象为思考单元,进行程序组织的编程范式。【这句话中包含4个关键词:编程范式、隐喻、概念/类型、组织。】
一个实用主义的定义,可以用3大原则作为面向对象编程范式的基础。即
★面向对象编程范式是基于柏拉图(Plato)原则、Liskov原则和Parnas原则的编程范式。
1.范式-编程范式。参考《编程导论(Java)·1.4》
面向对象编程范式是以人们熟悉的、习惯的现实世界和思维方式为隐喻(metaphor),以概念/类型或其实例化的对象为思考单元,进行程序组织的编程范式。
托马斯•库恩通过对科学革命的深入研究、揭示逻辑实证主义科学观的缺陷后指出:科学作为人类的一种社会事业还必须考虑到认识领域以外的社会问题和心理学问题。他在《科学革命的结构》(《TheStructure of Scientific Revolution 》)中指出,范式的变化即科学革命。1978年,斯坦福大学罗伯特•弗洛伊德(Robert W.Floyd)的图灵奖的授奖演说题目《编程的各种范式》(The Paradigms of Programming )。此后,编程范式成为计算机科学中常用的术语,它或许是学习任何一门编程语言时要理解的最重要的术语,因为讲授一门具体的语言不是计算机科学教育的目的,而应该介绍语言背后的范式。
《编程导论(Java)》将范式归纳为3个方面或层次:
上述介绍,将引出许多理论上的议题,如多范式、心智模型(mental model)、《编程的各种范式》包含哪些范式等等。
从学习编程的角度,我们可以用3大原则作为面向对象编程范式的基础。换言之:
- 面向对象编程范式是基于柏拉图(Plato)原则、里氏(Liskov)替换原则和Parnas原则(PLP)的编程范式。
- 不懂PLP,别说学过OOP。
①柏拉图(Plato)原则:类的世界独立存在,对象世界由类创建而来。
②里氏替换原则(LSP):子类型(必须)能够替代其父类型。
③Parnas原则:用户仅需要了解接口。
介绍LSP的文章,yqj2065最早是从Robert C. Martin 的工程笔记专栏C++报导(Engineering Notebook columns for The C++ Report)中看到的,也不知道当时他的《敏捷软件开发》出版了没有。LSP是OCP的底层支撑原则,是面向对象技术的核心。但是,教学中,有太多的同学不知道LSP的重要性,有太多的教师只讲继承和多态。我将里氏替换原则作为面向对象编程范式的三大原理之一,因为LSP是正确设计类层次的指导原则,它检测和保证类层次的正确性,进而维护针对父类型编写的程序的正确性。因为她/Liskov由此获得了图灵奖。你可以不知道继承和多态,但是你不能够不知道里氏替换原则。
相比较而言,Parnas原则(接口与实现分离)在我国的教学中,令人惊讶地,更少有人讨论。为此,我在介绍Parnas的图片中加上了这样的话:“他于1972年所提出的Parnas原则 或 接口与实现的分离(separation of interface and implementation)是软件工程中最重要的原则,没有之一。Parnas原则奠定了面向对象软件开发的基石。”
柏拉图(Plato)原则的捏造,则是更困难的事情。在2011年老严我才将他的观点构造/改造成面向对象范式的基石性原理,随后导致《编程导论(Java)》的结构发生巨大的变化。毕竟,基于类的语言是主流。
相对而言,对编程范式的理解,从2005年开始,基本稳定。
《编程导论(Java)·1.4.1 范式》 (随笔)
《编程导论(Java)》的一个基本目标,就是给面向对象(Object Orientation、OO)或面向对象编程范式一个简洁明快的定义。然而,重新定义面向对象,或者说重构面向对象技术,是一个艰巨的工作,其难度超出我的预计。因而时间的积淀,对于《编程导论(Java)》的形成至关重要,虽然显得太没有效率。在讲授OOD/面向对象设计时,我重新审视了这一部分的内容(可能成为《OOD》的0.1节)。
当看见各种书籍、文章、博客中谈起面向对象,只会说它的3大特征——xxxxxx,我很着急;当看见一些人吹捧《Java编程思想》,其实我很同情;
最后编辑时间:2018.5