面向对象编程 (OOP) 中的抽象:隐藏复杂性
你通过几个简单的动作来驾驶汽车。你踩下油门,转动方向盘,踩下刹车。
你不需要知道燃料是如何进入发动机的。你不需要理解活塞是如何运动或齿轮是如何换挡的。汽车向你隐藏了这些细节。你使用一个简单的接口来控制一台复杂的机器。
软件的工作原理也是如此。
想想发送电子邮件。你只需调用一个命令:emailService.send()。
在幕后,发生了许多事情:
- 系统验证地址。
- 创建 SMTP 连接。
- 与提供商进行身份验证。
- 构建消息。
- 如果第一次尝试失败,它会处理重试。
你不需要看到这些步骤。你只关心电子邮件是否发送成功。
如果不使用抽象,你的代码看起来会是这样:
- connect()
- authenticate()
- buildMessage()
- sendMessage()
- disconnect()
每次都这样做会产生问题。你的代码中的每个部分都了解得太多了。如果你更换了电子邮件提供商,你必须更新每一行发送邮件的代码。你的系统会变得难以更改。
抽象解决了这个问题。它展示一个对象“做什么”,但隐藏它“如何做”。
你暴露一个简单的接口。调用者可以专注于任务。实现细节保持隐藏。这使你的代码保持解耦且易于维护。
人们经常将抽象 (Abstraction) 与封装 (Encapsulation) 混淆。
封装问的是:谁可以更改这些数据?它保护内部状态。 抽象问的是:用户需要看到哪些细节?它隐藏了复杂性。
它们协同工作以构建更好的系统。
接下来,我们将探讨继承 (Inheritance)。我们将回答一个问题:如果对象共享行为,你是否需要编写两次相同的代码?