面向对象编程 (OOP) 中的抽象:隐藏复杂性
你通过踩踏板和转动方向盘来驾驶汽车。你不需要了解燃油喷射或活塞运动。汽车向你隐藏了这些细节。你只需要使用一个简单的接口。
软件的工作原理也是如此。
想想发送电子邮件。你的代码可能看起来像这样:
emailService.send(email);
它看起来很简单。但在幕后,系统执行了许多任务:
- 验证地址。
- 连接到 SMTP 服务器。
- 验证用户身份。
- 构建消息。
- 处理重试。
- 记录错误。
你不需要看到这些步骤。你只关心电子邮件是否发送成功。
如果你暴露每一个步骤,就会产生问题。想象一下,如果每个开发者都必须手动调用:
connect()authenticate()buildMessage()sendMessage()disconnect()
这会让你的代码变得脆弱。如果你更换了电子邮件服务商,你必须更新应用中的每一个地方。你的代码会与具体实现紧密耦合。
抽象解决了这个问题。
抽象展示了对象“做什么”,而隐藏了它是“怎么做”的。你只向用户展示他们需要的内容。
用户通过一个稳定的接口进行交互。他们不在乎你的身份验证逻辑或你的重试策略。这些细节都被隐藏了起来。
许多人会将“抽象”与“封装”混淆。它们的区别在于:
封装问的是:谁可以改变这个对象的状态?它保护的是数据。
抽象问的是:用户应该看到哪些细节?它隐藏的是复杂性。
它们协同工作,以构建更好的系统。
接下来,我们将讨论继承。我们将研究如何在不重复编写相同代码的情况下处理共享行为。