文藝復興時期,現代科學產生了兩個重量級理論: 理性主義和經驗主義。java
理性主義認爲理智是信息的首要來源。給出一個假設,只要經過思考就能理解和描述這個世界,如著名的伽利略自由落體實驗。mysql
經驗主義則認爲人類對世界認識的主要來源是經驗。程序員
咱們開一輛車,沒必要知道其內部實現細節。web
若是孤立地基於兩種極端的方式來觀察世界都是片面的。對大多數人來講,懵懂無知是一種生活方式,也是理性主義和經驗主義結合在一塊兒的結果。今天的程序開發和軟件工程方法也是如此。sql
咱們能夠發如今軟件演變的過程當中, 理性主義幾乎已無存身之處。數據庫
由於軟件的趨勢是: 程序員在能夠不深刻了解不少內容的狀況下就能夠寫出很是好的代碼。編程
現狀: 開發團隊每每直接複用現有的一些軟件框架,徹底不重視這些重量級的框架是否超過咱們的須要的。現代軟件都是基於大型組件的方式進行組裝的。 我要一個web服務器就裝一個tomocat, 要一個數據庫就裝個mysql。 這徹底是一種推土機式的開發方式,無論你的組件有多大, 總會找到合適的推土機把他推上去。 運行效率太差 就 加內存,搞服務器集羣,windows
這種方法是好仍是壞呢?實際上絕大多數公司已經用這種方式了。api
由於推土機式的工做方式可使你在不關注內部細節的狀況下,也能夠獲得不錯的結果。 咱們能夠在不瞭解汽車原理的狀況下,能夠把汽車開得很好。 在寫win32程序時候,也沒必要了解系統是怎麼實現。 咱們只須要關注windows 系統API, 以及這些API的功能。緩存
理解一個系統有兩個層面:
而在軟件開發中, 通常只要作到淺層理解就能夠了。
咱們說明軟件開發實際上是一個經驗的積累過程,而且能夠是複用前人的經驗積累的。
好的API可使功能的使用者聚焦在使用層面而不是其內部細節
爲何須要好的API:
一個軟件開發的生命週期:
變化是萬惡之源。
第一步先確認什麼才叫好。
不少人認爲所謂的API,不過是類和方法。可是這是比較片面的。
強調一點, 咱們爲何須要開發好的API:咱們但願可以將大塊的構建模塊,」無緒「地集合成應用程序。
那麼如何評價一個API的質量: 漂亮? 可是評價漂亮的標準是很主觀的。咱們應該設計易於使用、廣爲接受且富有成效的API。咱們能夠有一下幾個方面來衡量一個API的好壞。
第二步弄清楚寫API的步驟
寫一個API有三個步驟:用例, 場景, 文檔。
一個用例就是一種用法的描述,他指出用戶可能要面臨的問題,而這個問題不是一個具體的問題,而是不少問題的抽象。
舉個例子
用例: 設計一個數據庫管理器,他的功能是註冊JDBC驅動。
場景:對用例的回答。咱們把API要描述的每個功能下列出來:
第三步 學習一些設計原則和通用方法
咱們所設計的API都會被可能誤用。幾乎全部的API設計者都會有這樣的共識:一我的API設計的時間越長,他設計的API公開的內容會越少。
設計API的幾種方法:
這個不用說了。 geter setter。 這樣作會有不少改變的餘地。 如計算、轉換、校驗、覆蓋
工廠方法會帶來很大的靈活性,三個好處:
一般狀況下, 在設計一個類的時候,若是不考慮讓擁有子類,那就不該該讓這個類被繼承。 用final 來修飾。 還有些其餘方案來: 不公開構造函數轉而提供工廠方法。把大部分方法變爲final或者private
一個寶貴的教訓: 如無必要,絕對不要再正式的API中聲明setter方法。
在java中,所謂的友元就是用默認的package方式訪問,即容許同一個包內的代碼進行訪問。
有個實際的例子
避免深層次的繼承,定義程序的接口,並讓用戶來實現這些接口。 若是一個類繼承了某個類或者接口,那麼就能夠做爲響應的類或接口被使用。
如在swing中, frame間接繼承了compoment,這樣就表示全部使用compoment的地方,均可以使用frame. 實際上frame繼承 compoment是爲了複用compoment的代碼。這是一種典型的面向對象的複用的誤用。 因此若是發現繼承提醒超過2層,必定要想清楚「我是在設計API仍是在複用代碼」,若是是後者,則作好子類化準備。
本質上講,這個原則倡導的是,當咱們寫一個函數或一個方法時,咱們應該引用相應的接口,而不是具體的實現類。接口提供了很是優秀的抽象概括,讓咱們的開發工做變得容易不少。 讓API的使用者和API的實現者解耦出來。
隨着軟件規模的增大以及功能的複雜性增長。只要代碼開始訪問其餘無關模塊的內容,那麼架構的退化不可避免。模塊化能有效變緩這種退化。
模塊化的目的很是簡單,就是要實現程序中各個組成部分的鬆耦合。若是兩個模塊是獨立的,那兩個模塊就不須要知道對方的存在。若是兩個模塊要交互,那麼他們應該經過具備良好定義的接口來進行交互。
聲明式編程的基本思路, 不是讓API用戶一步一步告訴程序如何作,而只是須要告訴程序他們要的結果,而後交給API去完成。聲明式編程的好處是能在較高的抽象層次來定義操做。
好比寫一個資源管理API: API的使用者很容易找到一個方法去註冊一個功能,運行一下成功了,而後再也不往下繼續找註銷的方法了。 聲明式編程就是解決這個問題的一劑良藥: 開發人員只須要聲明註冊什麼,響應的註銷和清理由系統完成。
最後提醒一點,任何極端的想法都是有害的,在軟件框架設計中也同樣, 有如下單不只限幾個點:
現代的大型工程不多是有一我的單獨開發完成的,因此團隊協做很是重要。一下幾個點能很好幫助在大型軟件工做中完成好的API設:
以上很是簡單,可是在外面日常工做中缺乏的就是執行。