挑戰淘寶:且看如何用1500行搞定淘寶20000行Java SDK(2)
挑戰淘寶:且看如何用1500行搞定淘寶20000行SDK(2)
既然想要比淘寶SDK更優秀,就必須解決淘寶SDK存在的問題,那麼來看我是如何設計的:
1)"API請求"(如ItemGetRequest)、"API響應"(如ItemGetResponse)、"API結果"(如Item)本質上都是"數據結構",不需要完成什麼具體的操作,因此可以通過XML來進行定義,而不需要在代碼中進行定義,這一指導思想是整個設計的核心思想;
2)不同的API請求隻是參數不同,因此封裝參數為對象;
3)不同的API響應隻是屬性不同,因此封裝屬性為對象;由於參數和屬性都是"名值對"的操作,因此參數對象和屬性對象可以設計為同一個對象:"名值對"對象;
4)設計一種通用的get/set操作,避免大量相似的代碼。
來看我的設計的主要的類:
1) TOPApiClient:總的處理類,負責調用API,處理API返回結果;
2) TOPApiResultHandler:負責解析XML文檔,生成具體的結果對象TOPApiResult;
3) TOPFactory:根據XML文件生成TOPApiRequest原型和TOPApiResult原型;
4) TOPApiRequest:API請求對象,由TOPFactory創建原型,調用的時候隻能進行參數值的設置,不能進行參數設置;
5) TOPApiResult:API返回結果對象,由TOPFactory創建原型,TOPApiResultHandler根據原型進行賦值;由於存在嵌套對象,因此采用裝飾者模式進行設計;
6) TOPNameValuePair:名值對對象,用於TOPApiRequest參數設置和TOPApiResult屬性設置;
7) TOPBoolPair~TOPFilePair:具體的參數對象,根據不同的類型定義不同的對象,例如TOPBoolPair、TOPIntegerPair、TOPFloatPair、TOPStringPair等;
TOPFactory設計說明:本來也可以不用從XML文件讀取定義,而直接在編碼的時候邊添加參數邊賦值參數,但這樣做存在如下問題:
1) 依賴編碼人員來保證TOPApiRequest和TOPApiResult的正確性,而人與機器相比是最不可靠的,而且不同的人水平不一樣,沒法做到統一;而由XML文件定義可以通過機器來保證定義正確性,即使錯誤了,隻要查XML文件即可,不需要到代碼中一個一個去找;
2) 每次使用TOPApiRequest和TOPApiResult都需要人工添加參數,調用100次就要添加100次,重複代碼太多;而由XML文件定義後,隻在TOPFactory添加參數,其它地方隻要設置參數值即可,不會出現大量重複代碼。
TOPNameValuePair設計說明:本來可以全部用"字符串"的形式來保存名值對,但這樣做存在兩個問題:
1) 所有調用者都必須自己完成特定類型和字符串類型之間的轉換,例如int->string或者string->int,因此有100次調用就要轉換100次,而直接根據類型分開定義,隻需要一次轉換即可;
2) 字符串形式無法做靜態檢查,例如:本來是要設置一個int值,結果錯誤的賦值為2010xyz,這種情況字符串形式沒法檢測,而按照類型分開定義則可以完成檢測。
我們來看新的設計方案後的樣例:public static void main(String[] args) { /*創建TOPApiClient*/ TOPApiClient client = new TOPApiClient(); client.setSession(session); /*創建TOPFactory*/ TOPFactory factory = new TOPFactory(); /*由TOPFactory根據API名稱創建API請求request*/ TOPApiRequest request = factory.getTOPApiRequest(“taobao.trades.bought.get”); /*根據參數名稱設置API參數*/ request.setApiParameter("status", "TRADE_FINISHED"); /*由TOPFactory根據結果名稱創建API結果原型*/ TOPApiResult resultProto = factory.getTOPApiResult(“taobao.trades.bought.get.result”); /*根據結果來生成請求的fields,避免像淘寶SDK那樣手工填寫*/ request.setApiParameter("fields", resultProto.getChildProto("trade").getApiFields("")); /*運行API*/ int errorCode = client.executeApi(CONST.getCurrentEnv(), request) ; if( errorCode == CONST.TOP_API_ERRCODE_OK){ /*調用成功後,解析XML結果文件,獲得最終的結果finalResult*/ TOPApiResult finalResult = client.getResultObject(request.getApiResultFileName(), resultProto); finalResult.printAllFields(""); } else{ System.out.print("Failed to call TOP api, error code is : " + errorCode + "/n"); } }
既然前麵已經誇下了海口要比淘寶的SDK更加優秀,那麼經過這樣的設計後,我們來看看具體優秀在什麼地方:
(1)代碼量大大減少90%以上
最終代碼減少了多少?你可能很難想象:實現XML返回格式隻用了不到1200行,即使再加上JSON返回格式,最終不會超過1500行,而淘寶的SDK是22000行!
也許有的朋友可能會說:你的代碼量是少了,但XML文件配置工作量就大了!
其實不然,首先一個參數或者一個屬性在XML中隻需要1行即可,而在淘寶SDK中至少需要7行:1行聲明、3行get函數、3行set函數。
再者,修改XML文檔比修改Java代碼容易得多,而且影響小得多,至少不需要重新編譯。
(2)調用更加簡單
不管是使用API、還是處理API返回結果、還是獲取返回對象,都不再需要關注具體哪個對象、函數名叫什麼名字,隻需要對照網站上的API相關定義信息即可。
==================淘寶SDK樣例==========================
/*淘寶設置不同的參數需要調用不同的函數,不同的參數類型*/
request.setNick(nick);
request.setIid("e9dd57aaa104aa6cf042e3d71421fea9");
=================我的樣例================================
/*設置不同的參數調用相同的函數,相同的參數類型*/
request.setApiParameter("nick", "wolf");
request.setApiParameter("iid", "1234567890zxcvbnm");
(3)擴展方便,耦合聯動關係小
對於SDK開發者來說,TOP API擴展後,隻需要針對新增的API增加XML定義文件即可,不需要開發代碼、重新編譯、重新發布、重新測試、重新......
對於基於SDK進行二次開發的開發者來說,TOP API擴展後,不需要重新刪除jar包,重新編譯,然後到SDK中找哪個對象是怎麼設計的、對應哪個函數,隻需要將新的XML文件放到配置目錄中,然後按照老方式開發即可,不需要使用新的函數、熟悉新的參數。
可能有的朋友會擔心這樣設計性能是否會很差呢?我自己做了簡單的測試,樣例代碼運行100次,需要40秒左右的時間,也就是說平均調用一次隻需要0.4秒,而且這0.4秒還有大部分是網絡傳輸耗費的。雖然性能可能比淘寶Java SDK要差,但完全可以滿足應用要求。
============================如果需要全套可運行代碼,請留言或者發郵件給我========================
最後更新:2017-04-02 04:01:46