今天跟大家分享一个很容易搞混的知识点即面向对象编程和面向对象编程语言。
你觉得它们的联系与区别是什么?说的是一回事吗?
答案还真的不是一回事。我们好好分析一下
1
面向对象编程语言(OOPL)
是什么
是一门语言!
如JAVA、C++、C#等语言都是一门面向对象编程的语言。
背景
面向对象语言借鉴了20世纪50年代的人工智能语言LISP,引入了动态绑定的概念和交互式开发环境的思想;始于20世纪60 年代的离散事件模拟语言SIMULA67,引入了类的要领和继承,成形于20世纪70年代的Smalltalk。
面向对象语言的发展有两个方向:一种是纯面向对象语言,如Smalltalk、EIFFEL等;另一种是混合型面向对象语言,即在过程式语言及其它语言中加入类、继承等成分,如C++、Objective-C、JAVA等。
设计意图
为了能更加直接地描述客观世界中存在的事件(及对象)以及它们之间的关系。通过抽象把同一类事物共同属性、行为组合在一起最终以类的形式展现。
2
面向对象编程(OOP)
是什么
是一个编程范式、是一种编程思想。
作用
推动了高级语言的快速发展和工业化进程。它的封装、继承、多态特效使软件大规模化成为可能,有效降低软件开发成本。它实践了软件工程的三个目标:可维护性、可重用性、可扩展性。
谈面向对象编程我们势必会拿面向过程编程进行对比
3
区别与联系
我们拿开门场景举例:
“open(Door door)” 在面向过程编程中,door是被当作入参传人方法体内的,方法内才详细定义开门的各个步骤
比如
public void open(Door door){
//步骤一
//步骤二
}
而在面向对象设计中,先抽象出门的具体属性与动作。属性包括尺寸、颜色等。动作包括开门方式(往里开或往外开)和防盗功能等。
所以区别是:面向过程结构比较松散,强调流程化的解决问题,而面向对象的思维更加内聚、强调高内聚、低耦合。先抽象模型,定义共性行为,解决实际问题。
草图大致是这样的:
public class Door{
//属性 一:尺寸
//属性二:颜色
public void open(){
//什么样情况往里开
//什么样场景往外开
}
}
public class Demo{
public void main(String[] arts){
Door door=new Door();
door.open();//往里开还是外开已经在door对象定义了;这就是内聚的体现
}
}
4
写到最后
最后我们抛一个问题,虽然比如像JAVA是一门面向对象编程语言,但你自查一下你平时写的代码是采用面向对象编程还是面向过程编程呢?
延伸一下
业界有事务型脚本模式和领域驱动模式跟本文讲的思想有一定的异曲同工之妙。
比如事务型脚本模式是不是更像面向过程编程这种范式
领域驱动模型更像面向对象编程范式
有兴趣大家可以去了解一下,有时间我也会单独写一篇讲解一下。