编程范式|对象范式,这不是原来的配方了
编程范式大家都应该不陌生,随口都可以说出来几个,比如 : 过程式,函数式,面向对象......
前言
在正式开始正文之前,我想你思考几个问题:
1.什么是面向对象编程?
2.面向对象的特性是什么?
3.面向对象继承真的好吗?
4.你还记得面向对象中的组合吗?
好了,看完这四个问题,开始正文的内容吧。
正文
面向对象,即对象范式,诞生于20世纪80年代,属于第二次软件危机的产物,解决了结构化编程的危机。
但是真正的发展,是很曲折的,毕竟编程范式,一定程度上解决了当前的环境的困惑,影响了下一代环境。
诞生
1967 年的** Simula-67 语言**,属于第一个面向对象的语言,使用的是直接调用目标对象的方法,也就是我们所称的组合方法。
受到 Simula-67 语言的启发, Smalltalk-71 编程语言诞生,Smalltalk 不同于 Simula ,使用发消息实现对象方法的调用。
在一开始的对象范式中,对象范式思想 : 程序由对象组成,对象之间互相发送消息,协作完成任务。
注意 : 并不包括现在的 类 与 继承。
演变
面向对象编程范式的流行,更多的原因是解决了当时的困境,进行了新的演化。可以将其称为软件方法。
**C++ **编程语言的诞生,带来了对象范式的演化。
由于在原本的对象范式思想中,在对象之间互相发消息,需要知道目标对象有哪些方法。所以,此时就需要在对象范式中,引入定义对象本身有哪些方法的“类”和“继承”。此时的对象,也就是类造出来的,并不重要了。(七夕,程序员new对象,来源于此~)
经过演变,此时的对象范式,核心就变成 : 封装、继承、多态。
而原本的 面向对象 OOP(Object Oriented Programming) 也 演变为了 面向类程序设计 COP(Class Oriented Programming)。
注意 : 此时,你是不是觉得自己一直写的类,并且一直叫的面向对象,是不是可以更名为面向类了呢?
变化与不变
当对象范式变为 COP 之后,已经与初期的面向对象不一致了。
或者说,使用 COP这个概念,是‘错’的。
这里的错,来源于继承与组合。
1994 年 Robert C. Martin 在《** Object-Oriented C++ Design Using Booch Method** 》中,曾建议面向对象程序设计从对象活动图入手,而不是从类图入手。(对象活动图 : 组合,类图 : COP)
1995 年出版的经典作品《 Design Patterns 》中,建议优先考虑组合而不是继承。
2000 年后,工程界明确的提出:“组合比继承重要,而且更灵活”。
好了,看到这里,我不知道大家,在自己写程序的时候,使用的是组合多呢? 还是继承多?
结束语
综上,我介绍了OOP的诞生,一级演化为COP,并且借用例证,表明对象范式的主张。
此刻,不知道你是否对于前言的四个问题有了自己的答案。
其实,面向对象的初衷 : 复合对象的唯一方法是组合。(并不是继承)