关于API的设计和需求抽象
一,先來談抽象吧,因為抽象跟后面的API的設(shè)計是息息相關(guān)的
?
有句話說的好(不知道誰說的了):計算機(jī)科學(xué)中的任何問題都可以抽象出一個中間層就解決了。
?
抽象是指在思維中對同類事物去除其現(xiàn)象的、次要的方面,抽取其相同的、主要的方面,從而做到從個別中把握一般,從現(xiàn)象中把握本質(zhì)的認(rèn)識工程和思維方法。
?
在計算機(jī)學(xué)科中,抽象也稱為模型化,源于實驗科學(xué),主要要素為數(shù)據(jù)采集方法和假設(shè)的形式說明、模型的構(gòu)造與預(yù)測、實驗分析。結(jié)果分析。在為可能的算法、
數(shù)據(jù)結(jié)構(gòu)和系統(tǒng)結(jié)構(gòu)等構(gòu)造模型時使用此過程。抽象的結(jié)果為概念、符號和模型。在圖論中體現(xiàn)的是抽象與理論形態(tài),歐拉從哥尼斯堡七巧板問題入手,將其抽象為邊和點的問題進(jìn)行研究,成為圖論研究的先驅(qū)。哈密頓回路、中國郵路等問題都是對現(xiàn)實問題進(jìn)行的抽象,這些問題的研究和解決形成了一套比較完整的關(guān)于圖的理論,包括一系列的定義、公理和定理等。
?
首先,人腦往往不適于長幅記憶或直接面對復(fù)雜的二進(jìn)制底層,人們在面對根本無法控制的事情時,往往把它們轉(zhuǎn)化為另外一件可控的事抽象正是這樣一種方法,它可以隱藏低級層面的復(fù)雜性,而在另一個層面上提供新的更為強(qiáng)大的能力。再在這里抽象上構(gòu)建更為高層的抽象,即抽象只是把問題變了個形式,抽象完成了之后,只要不是過度抽象,那么所有后來的事情都是另外一回事了,抽象是解決移殖問題最好的方法,抽象源于一個簡單的事實,把事物從邏輯上分開,這樣就會解偶他們之間的聯(lián)系。只有把接口拉高,向高層抽象,那么就可以忽視平臺邏輯,其次,從問題到解決不是一步而就的,所有需要建立中間層,先完成這諸多中間層,當(dāng)中間的邏輯被解決的時候,事情自然就變得簡單了(從這個意義上來說,世間一切軟件都是抽象品,軟件即抽象),抽象的本質(zhì)在于遠(yuǎn)離問題,從靠近人的一個高層角度去解決更高級的問題。?但是抽象的優(yōu)點正是它的限制性,它可能帶來再大的復(fù)雜性1,一般抽象到了某個程度,為了獲得計算機(jī)作為底層的馮氏能力,,就不應(yīng)該再抽象下去了。開發(fā)模型不需要再變了,數(shù)據(jù)抽象到數(shù)據(jù)結(jié)構(gòu)級就是頂級了,再抽象就不是開發(fā)問題了,現(xiàn)在的虛擬機(jī)的提出,都是基于已有的模式,直接參照硬件上的機(jī)器設(shè)計中斷,模擬數(shù)據(jù)類型等,從來沒有那個虛擬機(jī),其內(nèi)部結(jié)構(gòu)不是圖靈模型,因為如果那樣的話,它上面的開發(fā)模型將不再是數(shù)據(jù)加代碼的方式。從來沒有人突破過這個創(chuàng)新。僅僅因為大部分人沒有想過,或根本無法嘗試。其次,抽象就是編程界對事物方方面面的范式的一個界定。但一般的,抽象是抽取對象的可用部分,我們從來都是抽取事情對于我們的可用部分,所以設(shè)計時千萬不能做大而全的抽象。
抽象都是有唯度的,數(shù)據(jù)結(jié)構(gòu)就是基于數(shù)據(jù)化類型的唯度抽象了開發(fā)中組織內(nèi)存的套路,而高級語言機(jī)制或范式基于多樣化寫代碼的唯度抽象了開發(fā),設(shè)計模式是基于設(shè)計抽象了應(yīng)用,而設(shè)計,就是人的事情了,處在前面數(shù)據(jù)結(jié)構(gòu),范式,應(yīng)用的所有實際上軟件的設(shè)計哲學(xué)是可以用來解釋一切的,因為它是真正的哲學(xué),而真正的哲學(xué)并不僅適用軟件開發(fā)(軟工和計算機(jī)是二個完全不同的抽象,雖然沒有人提出過計算機(jī)抽象到底是什么,軟工抽象到底里面有哪些抽象存在,我們僅能站在某個或某些唯度上給出一個描述性的概念而不是有限集,這也就夠了,如果能站在一個大全的唯度上說明到軟工的全部抽象,雖然這是不可能的,但我們還是給得出的這個結(jié)果取個名字,叫范式,范式在意義上是大全而的抽象,然而人類的范式總表現(xiàn)為某些唯度上的產(chǎn)物上面層次。下面詳細(xì)介紹這個唯度的概念。
?
我們來問個問題,程序如何分類呢,從算法和數(shù)據(jù)結(jié)構(gòu)的角度看我們可以發(fā)現(xiàn),數(shù)據(jù)結(jié)構(gòu)加算法等于程序。因為數(shù)據(jù)結(jié)構(gòu)源于從一套相似的算法中找出操作對象的共性這個現(xiàn)實,而從復(fù)用來看呢,,又可以產(chǎn)生設(shè)計和接口就等于程序這種說法,因此這完全是不同事物的不同唯度而已。根本沒有可比性。(至少二者都可以產(chǎn)生程序這個概念,于是,程序=機(jī)器加電也是正確的)抽象把事物的復(fù)雜度換化到另一層面,實際上也是另一唯度。這就是抽象與唯度。其實就語言本身來說,并沒有匯編,C,C++和Java,Python,Ruby這幾個語言之間哪個語言更強(qiáng)大一點的說法,大凡用其中一方能實現(xiàn)的功能,用一方都完全能夠抽象得到,Java所關(guān)注的Web編程領(lǐng)域,C++完全可以提供同樣的功能實現(xiàn), 只有抽象完成,整個Windows系統(tǒng)都可以用Java來寫,這就是說,在軟件的抽象里,任何事情都可以以抽象疊成的方式來完成.但是,“決定用什么語言干什么事”這個前提是“它善于干什么事情”,而不是“能不能”(而這,是由應(yīng)用本身和人的要求所規(guī)定的),所以顯然地,在Wintel上裝個Jvm,再用Java實現(xiàn)個Windows,這是個傻瓜行為(舍近求遠(yuǎn)而且有應(yīng)用的瓶頸問題存在).比如用C進(jìn)行C++能很好工作的事,這也是個傻行為(僅僅因為C沒有顯式的OO設(shè)計手段雖然它可以抽象得到)。
?
過程抽象的概念是程序設(shè)計語言的設(shè)計中最老的概念之一,所有的子程序都是過程抽象。因為它們提供了一種方式,讓一個程序說明要完成的某些過程,而不是要提供如何來完成的細(xì)節(jié),以使程序設(shè)計的過程逐步趨于簡單化。例如:當(dāng)一個程序需要將某種類型的數(shù)值數(shù)據(jù)對象數(shù)組排序時,它通常使用一個子程序來進(jìn)行這種排序過程,在程序中需要進(jìn)行排序的位置。過程抽象對于程序設(shè)計過程十分關(guān)鍵,這種將子程序中的算法的許多的細(xì)節(jié)抽象出來的能力,使得人們有可能來構(gòu)造、閱讀和理解大程序,現(xiàn)在被認(rèn)為的大程序必須至少其有好幾十萬代碼。
所有的子程序,包括并發(fā)子程序和異常處理程序都是過程抽象。 數(shù)據(jù)抽象必然跟隨著過程抽象的發(fā)展而發(fā)展,因為每一種數(shù)據(jù)抽象中的一個不可分割的中心部分都是操作,而操作被定義成過程抽象。
數(shù)據(jù)抽象的動機(jī)之一與過程抽象的類似,它是對抗復(fù)雜性的一種武器,是使得大型以及復(fù)雜的程序比較容易管理的一種方法。
在程序設(shè)計當(dāng)中,所有內(nèi)置數(shù)據(jù)類型都是抽象數(shù)據(jù)類型,例如:考慮一個浮點的數(shù)據(jù)類型。
在高級語言中,封裝是抽象數(shù)據(jù)類型的先驅(qū)及支持機(jī)制。一個封裝可以分割編譯或者是獨立編譯,對一組相關(guān)的計算機(jī)提供了一個抽象系統(tǒng)和一個邏輯組織。
?
抽象思維方法本身隨著人類文明的進(jìn)化也在不斷演化。從大類看,抽象思維方法分為抽象思維的形而上學(xué)方法和抽象思維的辯證方法。抽象思維的這兩種具體形式不象有些人認(rèn)為的那樣,是對立的和沒有共同基礎(chǔ)販。實際上,抽象思維的辯證方法是建立在抽象思維的形而上學(xué)方法之上的,在運用分析、綜合、歸納、演繹方法來形成概念并確定概念與概念之間演繹的關(guān)系、概念外延的數(shù)量屬性關(guān)系這些內(nèi)容上,抽象思維的辯證方法和抽象思維的形而上學(xué)方法完全一樣;只是面對發(fā)展和變化著的世界,為了提高思維的形而上學(xué)方法完全一樣;只是面對發(fā)展和變化著的世界,為了提高思維的精確度從而減少思維對現(xiàn)實的偏差,抽象思維的辯證方法才增加了對概念內(nèi)涵的數(shù)量屬性關(guān)系的考察??梢哉f,抽象思維的辯證方法是對抽象思維的形而上學(xué)方法的補(bǔ)充的提高。
?
二,API的設(shè)計
1.為了設(shè)計API對你如此重要呢?
----如果你是程序員,那么也可以說你是一個API設(shè)計者:一個好的代碼,實際就是模塊和模塊之間有一個API
----有用的模塊需要考慮能復(fù)用:一旦一個模塊有用戶了,那么就不能隨意改變API了。(因為對于用戶可見的是API,如果改變它,用戶相當(dāng)于使用一個全新的產(chǎn)品,需要花費更多的精力去學(xué),即使有詳細(xì)的文檔保證);好的可復(fù)用模塊之間都是能很好的互相協(xié)作的
----在你寫代碼的時候,思考API如何設(shè)計,能提高代碼質(zhì)量
2.一個好的API的特點
? ?2.1易學(xué)
? ?2.2即使無文檔保證,也能輕易使用。(也就是我看到API的時候一目了然,這涉及到函數(shù)命名,參數(shù)安排的問題)
? ?2.3難以被錯誤的使用(同上)
? ?2.4容易讀懂,保持原有代碼
? ?2.5很好的滿足需求
? ?2.6容易擴(kuò)展
? ?2.7對于用戶來說適當(dāng)
總結(jié):感覺以上很符合Unix設(shè)計哲學(xué),KISS原則無處不在啊
3.API設(shè)計過程
? 了解明確需求,思考需求(持有懷疑論的態(tài)度反思)
? -----更好的解決方案是存在的。(沒有最好,只有更好)
? -----能使用更簡單更有效的方法來構(gòu)建一件“事物”,讓此“事物”變得更普適。(這也說明了軟件接口越往上層越普適,不會依賴于平臺相關(guān))
? ?3.1先寫以小段API的規(guī)范說明書開始(保證說明書短小容易修改,API的輸入盡量滿足多數(shù)人所需要的)
? ?3.2提前設(shè)計API,不管其實現(xiàn)細(xì)節(jié)。然后再API的實現(xiàn)過程中,慢慢再完善API的設(shè)計,對其做單元測試
? ?3.3插件式的API要保證能夠以多種方式來實現(xiàn)。
? ?3.4保持API最現(xiàn)實的異常處理情況,大多數(shù)API都要設(shè)計成強(qiáng)約束的,因為你不能夠迎合每一個用戶,在異常處理方面,對于每個用戶都必須嚴(yán)格校驗??紤]API出錯(不理想),經(jīng)過現(xiàn)實時間的工業(yè)檢驗,這些錯誤都會慢慢暴露出來的,然后你再去修復(fù)。
4.設(shè)計API的基本原則
? 4.1 API的功能必須很簡單就能解釋清楚,不能復(fù)雜。如果對一個API很難命名,那么就說明這是個糟糕的設(shè)計,功能抽象做得不好。
? 4.2 API要盡可能的小,但是不能太小。API需要滿足它的需求。當(dāng)遇到錯誤,需要及時處理跳出。API的概念比API實現(xiàn)體積重要。你能添加API,但是不能刪除它。(保持兼容)。API的參數(shù)不能過多,否則依賴過度,說明抽象不好
? ?4.3 API的實現(xiàn)完全不影響API本身
? ?4.4減小API之間的依賴性
? ? 4.5從API的名字就可以看出功能,閱讀代碼像讀散文一樣。(就是容易理解)
? ?4.6一個好的文檔也是重要的。
? ?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/foohack/p/3613908.html
總結(jié)
以上是生活随笔為你收集整理的关于API的设计和需求抽象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xshell远程访问工具及epel-re
- 下一篇: Oracle数据库导入导出命令imp/e