Abstraction意味着公开对象做什么,同时隐藏如何做。你与一个简单、稳定的interface交互,而忽略其背后的复杂实现。
要做什么 vs. 怎么做
python
abc ABC, abstractmethod
():
(): ...
():
():
():
():
():
gateway.charge(amount)
checkout永远不需要知道它是Stripe还是PayPal——它依赖于charging的概念,而不是具体细节。
它们相关但不同:encapsulation隐藏状态以保护它;abstraction隐藏复杂性以简化接口。Encapsulation是关于保护;abstraction是关于显示什么。
泄漏的abstraction(实现细节暴露出来)和过早的abstraction(在理解问题之前就构建)都是有害的。对真正变化的内容进行abstraction。
Abstraction是驾驭复杂性的方式:调用者只需要理解一个小接口,而不是整个子系统。
它使得交换实现成为可能——添加新的payment provider只需修改一个class,不影响其他调用者——这是灵活、可测试设计的基础。