理論概述
軟件開發(fā)并不需要了解每一個API背后的實(shí)現(xiàn)原理戴已,只要知道它是怎么用的就可以了蹲缠。這是大型軟件協(xié)作開發(fā)的理論基礎(chǔ)焙矛。
API不僅僅是接口铝阐,類契沫,方法采蚀,API可以是程序中任意暴露給使用者的事物誉券」鹑可以是文件結(jié)構(gòu)瓶摆,也可以是通信協(xié)議凉逛,還可以是模塊組件。
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)造前后做一些額外的事情。
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)
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
1)API主要是給外部客戶調(diào)用的窿冯,一般會以代理的方式實(shí)現(xiàn);SPI主要是給服務(wù)提供者擴(kuò)展的确徙,一般會以繼承的方式實(shí)現(xiàn)醒串。
2)新版本演進(jìn)時执桌,給API增加方法并不影響原有功能,而刪減會芜赌;給SPI刪減方法并不影響服務(wù)仰挣,而增加會;
1)不管是API還是SPI缠沈,最好區(qū)分核心還是非核心膘壶,方便90%的用戶能夠不受干擾,快速找到自己想要的洲愤。
2)設(shè)計(jì)時颓芭,識別API和SPI,放在不同的包內(nèi)柬赐,區(qū)分對待更容易新版本的演進(jìn)亡问。
測試先行
1)用戶使用API的方式千奇百怪,只有對每一個API提供單元測試肛宋,才能放心地變更API的內(nèi)部實(shí)現(xiàn)州藕。
2)單元測試不同于集成測試,如果遇到需要調(diào)用外部接口的情況悼吱,能mock盡量mock慎框。
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必須是完全兼容的;評估完全兼容的代價渗常,平衡資源壮不。
1)API第一版本發(fā)布是最需要謹(jǐn)慎的,一旦發(fā)布即做出了向后兼容的承諾皱碘;
2)API的維護(hù)成本高昂询一,每一次升級都盡可能小心。