抽象的定义:
在软件工程和计算机科学中,抽象是一种隐藏计算机系统复杂性的技术。他的工作原理是在用户和计算机系统的交互之间建立一个简单的层次,隐藏更多的底部复杂细节【wikipedia】
可以看出这里的抽象就是指复杂功能的抽象出来的接口层;PS:希望谁能提出更好的理解或者定义。
抽象的时机:
Abstraction: The Rule Of Three 文章中讲到了三种抽象的时机
Don't Repeat Yourself
这个大概是指“if you need it once, build it. If you need it twice, abstract it ”。我认为即使指需要一次也需要进行某种程度的抽象,这可以让你的程序更加清晰,结构性更好。当然通过抽象的手段如何你设计的够好的话,肯定会符合Don't Repeat Yourself这个原则的。
You Aint Gonna Need It
Always implement things when you actually need them, never when you just foresee that you need them
这个原则来自极限编程思想是说当你真正需要一件事物时,再去构造它。放在这里是讲,在很早的时候真的需要进行抽象吗?主要的担心是来自过早优化。那么什么时候进行优化呢?就引入了The Rule of Three.
The Rule Of Three
当你第三次需要他的时候,再去抽象他。解决了You Aint Gonna Need It的疑问,但是和DRY想冲突(一次都不允许重复的话)
总结来就是:第一次需要时构造它,第二次需要时拷贝它,第三次需要时抽象它。这样是因为第一次和第二次需要时你没有足够的条件知道个组件要达到的要求。【其实这里谈的抽象更偏向于如果某个东西多次用到,然后把它拿出来独立抽象成一个组件,那么怎么进行这种抽象呢?下面引出 Abstraction Principle】
抽象的原则:
The interface of a component should be independent of its implementation 。
一个组件的接口应该和它的实现分离。组件的接口是用户的视角,组件的实现是开发者的视角,如果组件的设计采用了Abstraction Principle,那么用户在使用组件的过程中,并不需要知道组件是如何工作的。并且如果开发者要修改组件的实现时也不需要通知使用者。
最典型的例子:
汽车,我们可以把接口看做仪表盘,油门,刹车,和方向盘等。而实现是引擎和传统装置,而过司机想要驾驶汽车不必要懂得引擎的知识。
另外的例子是面向接口编程,如果定义了每个模块的接口,每个模块就可以通过接口进行通信,而不必关心模块是怎么实现的,并且一个模块实现的修改也不会影响到其他的模块。
那总结怎么实践抽象原则呢?
如果你要开发一个组件,那么这个组件就要使用相应的对外接口,和对内实现的方式进行抽象。