计算机中的抽象层

这篇文章翻译自medium的这里,我觉得这个比喻挺好的,所以翻译了一下。

本质上来说,程序员的工作是在一个实际上并不存在的东西(物理意义上的不存在)上创造另一个并不存在的东西。这种抽象的性质使得向外行人解释清楚这种工作可能有些困难,甚至我们自己也想知道自己是如何理解他们的。本文试图使用简单,明显的比喻来解释一些基本的概念。

基础

想象一下,你在家里想去一家新开的餐厅,你叫了一辆出租车。当你告诉他你要去这个餐厅,他说他不知道餐厅在哪里(可能他对城市不熟悉而且GPS坏了,这并不重要),而你知道在哪里,所以你对他说:“那我给你指路吧,你照着我指的开”。

汽车启动了,司机开着车,等待你的指令。到路口了,你说左转,司机开车左转,然后又到路口了,你说右转,司机开着车右转。最后,在你的指导下,成功的开到了餐厅,然后你说停止,司机把车停下来了。你成功到底餐厅。

现在来考虑一个问题:在这一路上,是谁在控制出租车?

从物理意义上来说,是司机在驾驶车子,所以当然是司机了。但是,从广义上来说,是你在控制出租车。司机不是独立的行动,他只是把你的指令转换为汽车的一系列特定的动作(你说向左转,他控制车子向左转)。

这用编程术语来说,驾驶员就是你和出租车之间的一个抽象层。

通常,抽象层旨在简化某些操作的一部分代码。被抽象的事物(可以是一个硬件,也可能是另外一段代码)通常有许多小的操作。抽象层可以控制这些操作,把他们分组为预定义的序列,然后把向外界暴露出更少,更简单的操作,这些操作集也被称为接口。

在我们的例子中,汽车可以有以下操作:

  • 踩/松油门
  • 踩/松刹车
  • 打开/关闭 左转向灯
  • 打开/关闭右转向灯
  • 向左/向右打方向盘
  • 等等。。。。。

这就是所谓的低级指令。当你告诉司机左转的时候,你是发出一个高级指令,这些指令被转换成一系列低级指令:

  • 打开左转向灯
  • 等待绿灯亮
  • 向左转动方向盘
  • 踩油门
  • 等汽车左转90度后回正方向盘
  • 关闭左转向灯

作为乘客,你无法在车上执行这些低级指令,也许是因为你不会开车,或者是你没有驾照。所以你必须通过司机这个中间层来控制车辆。

更进一步

抽象层使控制复杂系统变得更加容易,而且他的好处远不止使控制变得更简单。再思考一下我们的例子,出租车的品牌和型号对你的目的有多重要?答案是一点也不重要(至少从技术角度来说是这样的)。作为坐在后座上的“驾驶员”,你所要做的就是告诉司机左转,右转,直行。无论他是小汽车,还是三轮车。

用编程术语来说,抽象层允许高层代码和实现无关。简而言之,抽象层让你少考虑许多东西。

另外一个重要的方面就是安全性。还是上面的例子,你需要驾驶员的原因之一是你不会开车,如果你坐在方向盘前面,那最好的结果就是车熄火了,最糟的情况是出了大的交通事故。抽象层保证了你不会做出任何非法的操作,无论是偶然还是故意的。

如果你再进一步思考我们的例子,你可能会意识到并不止一个抽象层起作用。例如要让汽车加速,司机需要踩油门,但是这个动作本身并不会引起加速,他是有汽车定义好了的。你通过各种踏板,开关来控制汽车,而这些不需要你了解汽车的工作原理。

每一个软件都具有相当数量的抽象层,你用来看这篇文章的浏览器并没有直接再屏幕上显示文字,它和操作系统通信,操作系统和硬件通信,最后把它转化为电子脉冲,表现为各个像素的正常显示。作为一个开发者,我不知道这些是怎么工作的,事实上,我非常确定上面的表述里有错误。如今没有任何一个人可以确切的告诉你任何一个设备的所有部分是如何工作的。但是,如上所述,这就是抽象层的好处:不需要知道。

猜你喜欢

转载自www.cnblogs.com/acgq/p/12543734.html