讀書筆記 - 軟件框架設(shè)計(jì)的藝術(shù)

理論概述

  • cluelessness(無緒)
軟件開發(fā)并不需要了解每一個API背后的實(shí)現(xiàn)原理戴已,只要知道它是怎么用的就可以了蹲缠。這是大型軟件協(xié)作開發(fā)的理論基礎(chǔ)焙矛。
  • API的范圍
API不僅僅是接口铝阐,類契沫,方法采蚀,API可以是程序中任意暴露給使用者的事物誉券」鹑可以是文件結(jié)構(gòu)瓶摆,也可以是通信協(xié)議凉逛,還可以是模塊組件。
  • 一個好的API應(yīng)該有的特性
1)可理解性群井;API是程序員之間的溝通方式状飞,容易看懂使用是最重要的。
2)一致性书斜;同一類API風(fēng)格一致降低學(xué)習(xí)成本诬辈,不同版本的API功能要一致。
3)可見性荐吉;統(tǒng)一醒目的入口介紹API焙糟,最好有demo。
4)簡單样屠;給API分門別類穿撮,互不相關(guān)的API不要雜糅在一起。
5)向后兼容痪欲;新版盡可能不要修改或刪除API的定義悦穿,也不要調(diào)整API的結(jié)構(gòu)。

只公開必要的

  • 工廠方法優(yōu)于構(gòu)造函數(shù)的原因
1)可以構(gòu)造子類對象返回业踢,調(diào)用方無需關(guān)注子類類型栗柒。
2)可以返回緩存單例,而并不是每次都new一個新對象知举。
3)返回值可以是定義為帶泛型的傍衡,構(gòu)造函數(shù)不支持深员。
4)可以在對象構(gòu)造前后做一些額外的事情。
  • Java實(shí)現(xiàn)友元訪問
1)Java原生只有public, protected, private, default四種訪問級別蛙埂,沒有提供友元關(guān)鍵字來實(shí)現(xiàn)友元訪問倦畅。
2)default訪問級別為包級別訪問,即同一個package之下的類能夠互相訪問绣的。
3)如果要對類 C 實(shí)現(xiàn)友元訪問叠赐,則 C 的所有方法都應(yīng)該設(shè)置為default級別;然后在同一個包內(nèi)定義一個 C 的代理類 DelegateC 屡江,由 DelegateC 對外提供public的接口芭概,內(nèi)部調(diào)用 C 的方法來執(zhí)行邏輯。

模塊化架構(gòu)

  • 采用模塊化架構(gòu)的原因
1)模塊化架構(gòu)是把復(fù)雜的單個應(yīng)用程序分拆成互相之間有清晰依賴關(guān)系的模塊惩嘉,有利于軟件的進(jìn)化罢洲。
2)即使一個最簡單的WEB應(yīng)用,也可以拆成dal, biz, web三個模塊文黎,dal負(fù)責(zé)數(shù)據(jù)訪問惹苗,biz負(fù)責(zé)業(yè)務(wù)邏輯,web負(fù)責(zé)請求控制與顯示耸峭。每個模塊都只公開必要的接口給外部模塊訪問桩蓉,這樣即使一個模塊內(nèi)部爛到骨子里,也不會腐蝕另一個干凈的模塊劳闹。
  • 服務(wù)注冊發(fā)現(xiàn)的幾個方案
1)使用一個啟動類院究,將被用到的模塊中的服務(wù)類,實(shí)例化對象注冊進(jìn)來本涕。缺點(diǎn):硬編碼方式不容易擴(kuò)展业汰。
2)依賴注入,采用配置文件或者注解的方式裝配服務(wù)對象菩颖,如spring样漆。缺點(diǎn):除了需要用戶主動裝配外,基本完美位他。
3)Java標(biāo)準(zhǔn)的ServiceLoader機(jī)制。缺點(diǎn):未提供完整的對象生命周期管理产场。
4) Netbeans 的Lookup鹅髓。本質(zhì)上是增強(qiáng)版的ServiceLoader,比如監(jiān)聽功能京景。

API 和 SPI

  • 主要區(qū)別
1)API主要是給外部客戶調(diào)用的窿冯,一般會以代理的方式實(shí)現(xiàn);SPI主要是給服務(wù)提供者擴(kuò)展的确徙,一般會以繼承的方式實(shí)現(xiàn)醒串。
2)新版本演進(jìn)時执桌,給API增加方法并不影響原有功能,而刪減會芜赌;給SPI刪減方法并不影響服務(wù)仰挣,而增加會;
  • 最佳實(shí)踐
1)不管是API還是SPI缠沈,最好區(qū)分核心還是非核心膘壶,方便90%的用戶能夠不受干擾,快速找到自己想要的洲愤。
2)設(shè)計(jì)時颓芭,識別API和SPI,放在不同的包內(nèi)柬赐,區(qū)分對待更容易新版本的演進(jìn)亡问。

測試先行

  • 為每一個API提供單元測試
1)用戶使用API的方式千奇百怪,只有對每一個API提供單元測試肛宋,才能放心地變更API的內(nèi)部實(shí)現(xiàn)州藕。
2)單元測試不同于集成測試,如果遇到需要調(diào)用外部接口的情況悼吱,能mock盡量mock慎框。
  • 測試用例的演進(jìn)
1)每一次的bug修復(fù),都先補(bǔ)相應(yīng)的測試用例來重現(xiàn)后添,再修復(fù)后驗(yàn)證笨枯。

API設(shè)計(jì)

  • 極端的建議有害無益,做好平衡
1)API必須是漂亮的遇西;首先得是正確的馅精。
2)API必須是正確的:只需要在可期的時間規(guī)模內(nèi)是正確的即可。
3)API必須是簡單的粱檀;不能以犧牲功能為代價洲敢。
4)API必須是高性能的;優(yōu)化性能萬惡之源茄蚯,跟其他所有特性相違背压彭。
5)API必須是完全兼容的;評估完全兼容的代價渗常,平衡資源壮不。
  • API的開發(fā)和維護(hù)
1)API第一版本發(fā)布是最需要謹(jǐn)慎的,一旦發(fā)布即做出了向后兼容的承諾皱碘;
2)API的維護(hù)成本高昂询一,每一次升級都盡可能小心。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市健蕊,隨后出現(xiàn)的幾起案子菱阵,更是在濱河造成了極大的恐慌,老刑警劉巖缩功,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晴及,死亡現(xiàn)場離奇詭異,居然都是意外死亡掂之,警方通過查閱死者的電腦和手機(jī)抗俄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來世舰,“玉大人动雹,你說我怎么就攤上這事「梗” “怎么了胰蝠?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長震蒋。 經(jīng)常有香客問我茸塞,道長,這世上最難降的妖魔是什么查剖? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任钾虐,我火速辦了婚禮,結(jié)果婚禮上笋庄,老公的妹妹穿的比我還像新娘效扫。我一直安慰自己,他們只是感情好直砂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布菌仁。 她就那樣靜靜地躺著,像睡著了一般静暂。 火紅的嫁衣襯著肌膚如雪济丘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天洽蛀,我揣著相機(jī)與錄音摹迷,去河邊找鬼。 笑死郊供,一個胖子當(dāng)著我的面吹牛峡碉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颂碘,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼异赫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了头岔?” 一聲冷哼從身側(cè)響起塔拳,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎峡竣,沒想到半個月后靠抑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡适掰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年颂碧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片类浪。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡载城,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出费就,到底是詐尸還是另有隱情诉瓦,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布力细,位于F島的核電站睬澡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏眠蚂。R本人自食惡果不足惜煞聪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逝慧。 院中可真熱鬧昔脯,春花似錦、人聲如沸馋艺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捐祠。三九已至碱鳞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踱蛀,已是汗流浹背窿给。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留率拒,地道東北人崩泡。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像猬膨,于是被迫代替她去往敵國和親角撞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容