我会用一个问题回答你的问题;当您今天早上开车去工作时(我假设您实际上已经这样做了),您是否真的在乎引擎如何打开气门以引入燃油-空气混合物,然后点燃它们?不,你不关心如何您的汽车引擎,当你驾驶的道路工程。您关心它是否有效。
假设有一天,您的汽车无法工作。没有开始,扔了一根杆,断裂了一条皮带,在您忙着发短信时,莫名其妙地犁入了那个混凝土障碍,没有您自己的过错。现在,您需要一辆新车(至少是暂时的)。您是否在乎这款新车的工作原理?不。您关心的是,它首先起作用,其次,您可以使用驾驶旧车时所使用的相同知识和技能来驾驶新车。理想情况下,您应该会发现自己驾驶的汽车没有任何变化。实际上,这种新车的工作方式应该给您尽可能少的“惊喜”。
这些基本原则是封装和抽象背后的核心原则。了解对象如何执行其操作不应成为使用该对象执行其操作的必要条件。即使在计算机编程中,运行程序的CPU内电气路径的详细信息也至少要在六层I / O指令,驱动程序,OS软件和运行时之后才抽象出来。许多非常成功的软件工程师编写了完美的代码,而不必担心会运行该代码的确切硬件体系结构或操作系统构建。包括我。
封装/信息隐藏允许“不在乎它如何工作,在乎它在做什么”的思想。您的对象应该以对消费者有用的方式公开对消费者有用的东西。现在,回到现实世界中,这并不意味着汽车不应该向用户提供任何有关内部工作的信息,也不意味着汽车仅应向用户提供点火,方向盘,和踏板。所有汽车都有速度表和燃油表,转速表,白痴灯和其他反馈。实际上,所有汽车还具有用于各种独立子系统的开关,例如前大灯,转向信号灯,收音机,座椅调节装置等。一些汽车允许用户进行一些深奥的输入,例如限滑中央差速器的灵敏度。在所有情况下,如果您足够了解,您可以打开它并进行更改以使其工作方式略有不同。但是,在大多数情况下,也许,也许也许,用户不应该能够直接和独立地从机舱内部控制燃油泵吗?也许,也许,用户不应该踩下制动踏板就不能激活他们的制动灯?
抽象允许“这并不相同,但是因为它们都是XI可以像使用任何X一样使用它们”的思想。如果您的对象继承或实现了抽象,那么您的使用者应该期望您的实现产生与其他已知的抽象实现相同或相似的结果。丰田凯美瑞和福特Fusion都是“汽车”。因此,它们具有一组通用的预期功能,例如方向盘。逆时针旋转,汽车向左行驶。顺时针旋转,汽车向右行驶。您可以在美国乘坐任何汽车,并期望该汽车具有方向盘和至少两个踏板,右侧的一个是“汽车行驶”踏板,而中间的一个是“汽车停靠”踏板。
抽象的必然结果是“最少惊讶的理论”。如果您开着一辆新车试驾,顺时针旋转方向盘而汽车向左转,至少可以说,您会感到惊讶。您指责交易商兜售POS,并且不太可能听到他的任何原因,说明新行为“比您惯用的”要“好”,或者这种行为被“证明”的程度如何,或者“透明”的控制系统。尽管有这辆新车,但您驾驶的其他所有车仍然是“汽车”,在驾驶这辆车时,您必须更改一些有关如何驾驶汽车的基本概念,以便成功驾驶新车。这通常是一件坏事,而且只有在新范例具有直观优势的情况下才会发生。也许增加安全带就是一个很好的例子。50年前,您只是进进出出,但是现在您必须系好安全带,直觉上的好处是,如果发生事故,您不会穿过挡风玻璃或进入乘客座椅。即便如此,驾驶员还是拒绝了。许多车主将安全带从汽车上拉下,直到通过法律强制使用安全带。