面向对象和面向过程之浅见

先以最为直观的例子开始。
比如我想实现 点击按钮给div设置红色背景 这个功能。大致分为以下几个步骤。
1.获取button
2.给button添加点击事件
3.获取div
4.改变div的背景色
面向过程的代码:
/1.获取button/
var btn = document.querySelector(“button”);
/2.给button添加点击事件/
btn.addEventListener(“click”, function() {
/3.获取div/
var divNode = document.querySelector(“div”);
/4.改变div的背景色/
divNode.classList.add(“red”);

面向对象的代码是什么样子的呢?
/按钮对象/
var btn = {
getTag: function(tagName) {
return document.querySelector(tagName);
}
};

/div对象/
var div = {
getTag: function(tagName) {
return document.querySelector(tagName);

			},
			setBg: function(node, className) {
				node.classList.add(className);
			}
		};

/1.获取button/
var btn = btn.getTag(“button”);
/2.给button添加点击事件/
btn.addEventListener(“click”, function() {
/3.获取div/
var divNode =div.getTag(“div”);
/4.改变div的背景色/
div.setBg(divNode, “red”);

以上两段代码比较,不变的是四个步骤,不一样的在于实现每个步骤的方法。
不变的四个步骤就是所谓的上层业务逻辑,这部分需要稳定,而不应该区分面向对象还是OOP。
但是在面向过程的实现代码代码段1里,不管是获取标签的方法:document.querySelector(“button”);
还是操作node.classList.add(className)。其使用的都是特定语言和框架的方法。
也就是说,面向过程是针对实现编程的,其代码特点就是不变的业务逻辑和特定的具体实现死死捆绑在一起。可以想象,不管是这种特定语言本身的接口变化还是换一种语言,代码段1都只能重写。也就是说,底层的任何实现的变化都会导致代码段1的重写。于是,本应该稳定不变的业务逻辑被迫随着底层实现剧烈变化。
从这个意义上说,类不是面向过程和OOP的分水岭,面向实体类的代码仍然是面向过程编程。

再看面向对象的代码段2,每一步的实现方法,不管是获取标签getTag还是操作方法setBg,这些接口都和具体语言无关的,而是和业务相关的语义接口。具体语言实现的细节都被封装在but和div两个类中,从而实现细节的变化就被从业务逻辑中隔离出来。从而业务逻辑代码就是稳定不变的,可以想象,不管是特定语言本身的变化,还是换其他任何一种语言,这段业务逻辑都是稳定不变的,可以到处拿来复用。
所以说,OOP是面向抽象编程,而抽象的具体变现就是类的接口。所以说,。
OOP的特点就是把业务逻辑代码和具体实现代码隔离开来,所以OOP实际上就同时拥有两套接口体系:一套是属于业务逻辑的接口,也就是类的接口,一套是属于底层实现的接口,而这部分接口被类隔离封装起来。
OOP的本质就是两个字:复用。
实现复用的技术手段就是:把业务逻辑代码和底层实现代码解耦隔离。
通过解耦就可以实现最大程度的复用:底层代码可以被不同的接口复用,同一个接口也可以复用不同的底层代码来实现。
因此,是否实现代码解耦就是区分面向过程和OOP最本质的区别。二者最浅显的区别就是,OOP多设计了一套业务逻辑类。所以OOP实际上表现为两套接口:一套是底层实现细节的接口,一套是封装这些底层接口的高层接口,编程过程中只使用抽象出来的那一套高级接口。而面向过程只有一套特定语言规定的接口。
解耦的实现方式就是对“业务逻辑”进行抽象,抽象的产出物就是类,因为“业务逻辑”作为逻辑,在现实世界中是没有实体物对应的,所以说,OOP是面向抽象编程。
类就是“业务逻辑”和“底层实现”之间联系的纽带,其中接口定义代表了“业务逻辑”部分,接口的实现代码就是对“底层实现”的封装。
既然进行了解耦,那么一旦把底层封装成类,那么应用程序就只要对“业务逻辑”编程即可,而“业务逻辑”是由接口来标识的,所以说,OOP就是针对接口编程。

上面是理论。
以开头的代码段1和代码段2来看,代码段1展示了面向过程,代码段2展示了面向对象。
二者最浅显的区别就是,代码段2多设计了两个类。
代码段1使用的只有特定语言规定的一套接口,而代码段2则有两套接口,其中只使用抽象出来的那一套高级接口。

对象具有状态和行为,状态由属性数据来表述,行为由接口来表述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值