信息隐藏和抽象是,在研究对象和系统时,去除物理的、空间的或时间的细节或属性,把注意力集中在更重要的细节上的过程。
信息隐藏和抽象是不同的,也是相关的,为了思考软件工程的基本原则,最好把它们放在一起考虑。
在代码中划线或接缝,当我们从外部看那些线时,我们不关心它们后面是什么。作为函数、类、库、模块的使用者,我不应该需要知道或者关心它是如何工作的任何细节,只需要知道如何用它就够了。
隐藏的信息是代码的行为,包括实现细节以及可能使用或不使用的任何数据,我向外界展示的抽象应该实现这个技巧,即对代码的其他部分保密。
我们的目标是管理复杂性,以便我们能够构建超出我们头脑可以轻松掌握的系统,那么我们需要隐藏信息。
难以在代码库上工作的代码称为大泥球。
对于害怕更改代码的问题,现实的解决方案是抽象和测试。对代码进行抽象,就是隐藏系统中一部分的复杂性,而不让另一部分知道。这意味着,我们可以更安全地更改系统中的一部分代码,并且有很强的信心,即使我们的更改是错误的,也不会对其他部分产生不利影响。为了更确定这一点,我们还需要测试。
通过测试改进抽象。
持续的自动化的回归测试是持续交付的基础之一。我们的工作使我们的软件始终处于可发布状态,并且通过高效的、有效的、自动化的测试来确保软件是可发布的。
将测试当做代码理想行为的小型规范,我们就是从外到内描述理想行为。我们的目标是尽可能简单地表达规范,即测试,尽可能清晰、简单地表达对我们想要行为的渴望。我们就是在抽象我们的设计。我们为代码定义一个接口,使表达我们的想法变得容易。我们的代码也更容易使用。编写测试是一种设计行为。我们正在设计与代码交互的方式。这种基于抽象的方法将代码需要做什么和如何做分离开来。这是一种实际的、实用的、轻量级的契约式设计。
现代云供应商正忙于对运行复杂、分布式、可伸缩的应用程序的许多操作进行抽象而隐藏复杂性。抽象是我们处理计算机的基本能力。编写软件就是创建新的抽象。
抽象漏洞即一种抽象泄露了本该隐藏的细节。抽象是一种建模,是真理的代表,但不是真理本身。我们的目标不是尽善尽美,而是建立有用的模型,帮助我们用作解决问题的工具。
抽象及其核心的建模是设计的基础。
对问题领域进行建模将为设计提供一些指导,能够实现问题领域的关注点分离,帮助你更好地理解你尝试解决的问题。
我们的目标是尽可能抽象偶然复杂性领域和本质复杂性领域的接口。
使用抽象将你的代码和第三方代码隔离开。
识别抽象最佳点的能力,通过可测试性的设计得到加强。测试帮我们练习对被测代码接口的理解。加上隐藏信息,为未来的代码变更打开大门。
抽象是软件开发的核心。当我们在代码中构造隐藏信息的接缝时,我们的代码会更好。