抽象的定義:
在軟件工程和計(jì)算機(jī)科學(xué)中,抽象是一種隱藏計(jì)算機(jī)系統(tǒng)復(fù)雜性的技術(shù)。他的工作原理是在用戶和計(jì)算機(jī)系統(tǒng)的交互之間建立一個(gè)簡(jiǎn)單的層次,隱藏更多的底部復(fù)雜細(xì)節(jié)【wikipedia】
可以看出這里的抽象就是指復(fù)雜功能的抽象出來的接口層;PS:希望誰能提出更好的理解或者定義。
抽象的時(shí)機(jī):
Abstraction: The Rule Of Three 文章中講到了三種抽象的時(shí)機(jī)
Don't Repeat Yourself
這個(gè)大概是指“if you need it once, build it. If you need it twice, abstract it ”。我認(rèn)為即使指需要一次也需要進(jìn)行某種程度的抽象,這可以讓你的程序更加清晰,結(jié)構(gòu)性更好。當(dāng)然通過抽象的手段如何你設(shè)計(jì)的夠好的話,肯定會(huì)符合Don't Repeat Yourself這個(gè)原則的。
You Aint Gonna Need It
Always implement things when you actually need them, never when you just foresee that you need them
這個(gè)原則來自極限編程思想是說當(dāng)你真正需要一件事物時(shí),再去構(gòu)造它。放在這里是講,在很早的時(shí)候真的需要進(jìn)行抽象嗎?主要的擔(dān)心是來自過早優(yōu)化。那么什么時(shí)候進(jìn)行優(yōu)化呢?就引入了The Rule of Three.
The Rule Of Three
當(dāng)你第三次需要他的時(shí)候,再去抽象他。解決了You Aint Gonna Need It的疑問,但是和DRY想沖突(一次都不允許重復(fù)的話)
總結(jié)來就是:第一次需要時(shí)構(gòu)造它,第二次需要時(shí)拷貝它,第三次需要時(shí)抽象它。這樣是因?yàn)榈谝淮魏偷诙涡枰獣r(shí)你沒有足夠的條件知道個(gè)組件要達(dá)到的要求?!酒鋵?shí)這里談的抽象更偏向于如果某個(gè)東西多次用到,然后把它拿出來獨(dú)立抽象成一個(gè)組件,那么怎么進(jìn)行這種抽象呢?下面引出 Abstraction Principle】
抽象的原則:
The interface of a component should be independent of its implementation 。
一個(gè)組件的接口應(yīng)該和它的實(shí)現(xiàn)分離。組件的接口是用戶的視角,組件的實(shí)現(xiàn)是開發(fā)者的視角,如果組件的設(shè)計(jì)采用了Abstraction Principle,那么用戶在使用組件的過程中,并不需要知道組件是如何工作的。并且如果開發(fā)者要修改組件的實(shí)現(xiàn)時(shí)也不需要通知使用者。
最典型的例子:
汽車,我們可以把接口看做儀表盤,油門,剎車,和方向盤等。而實(shí)現(xiàn)是引擎和傳統(tǒng)裝置,而過司機(jī)想要駕駛汽車不必要懂得引擎的知識(shí)。
另外的例子是面向接口編程,如果定義了每個(gè)模塊的接口,每個(gè)模塊就可以通過接口進(jìn)行通信,而不必關(guān)心模塊是怎么實(shí)現(xiàn)的,并且一個(gè)模塊實(shí)現(xiàn)的修改也不會(huì)影響到其他的模塊。
那總結(jié)怎么實(shí)踐抽象原則呢?
如果你要開發(fā)一個(gè)組件,那么這個(gè)組件就要使用相應(yīng)的對(duì)外接口,和對(duì)內(nèi)實(shí)現(xiàn)的方式進(jìn)行抽象。