簡潔易用的SDK開發之道
簡潔易用SDK的特點
易用
-
簡單的api設計
那么所謂的易用到底是什么呢?我們想創造一種最簡單的方式,讓人們在他們的應用中開始使用SDK. 如果它是易用的,它應該是不需要侵入太多你的代碼或者你需要做很多繁瑣的集成工作。只要在你的代碼中新增一行我們的代碼,就可以使用它了,類似這樣:
HyAwPay.init(this,"appid",""appkey");
2.輕松定制
開發者對SDK的拓展性要求,builder模式的使用,比如:
Paste_Image.png
3.防止誤用
從Retrofit的構造函數我們可以得知,builder的參數在對象初始化的時候也進行了初始化,但是單純的builder有時候會造成誤用,比如這樣:
Paste_Image.png
更好的方式呢?
可消耗商品
Paste_Image.png
不可消耗商品
Paste_Image.png
金額消費商品
Paste_Image.png
由此我們對項目中的reporter庫進行了改造,因為單純的builder已經滿足不了我們的需求:
初始化打點
Paste_Image.png
SDK上報打點
Paste_Image.png
API的設計
Paste_Image.png
一個 API 就像一個嬰兒。他們很有趣,但他們需要18年的支持。任何 API 我們都必須要長期地支持,所以我們要讓大家感覺到,我們正走在正確的路上,才能才久堅持支持下去。
1.回調的設計
我們平時開發當中都會見到什么樣子的設計呢?首先我們看下微信的設計:
Paste_Image.png
上圖中為微信支付的調用代碼,你要拿到結果從哪拿呢?首先你得在你<包名>/wxapi/下面創建微信指定的Activity對不對?在指定的activity中接受結果,可是這里收的結果,怎么跟你當前的業務關聯起來呢?廣播?監聽器?好亂,反人類啊。
Paste_Image.png
那么支付寶的設計呢?
Paste_Image.png
Paste_Image.png
支付寶整個支付過程的調用還算是蠻簡單的,但是涉及到一個問題,整個過程的調用在子線程中,要在主線程中拿結果,必須自己在handler中收發處理結果消息。為什么整個過程不能幫開發者完成,然讓開發者自己單獨完成呢?
說道這里,那么我們開發者更能接受的回調長什么樣子呢?
Paste_Image.png
上圖是AsyncHttpClient的回調,整個過程清晰,回調結果更加清晰。有人說工具庫和功能庫是有本質區別的,區別在什么呢?對,區別在微信和支付寶有界面啊,activity中回調結果的接受本來就不容易。答案是什么樣的呢?
答案是有界面的支付api,也是可以用這么簡單的回調的,對嗎?
Paste_Image.png
其實實現這樣回調并不難,我們知道回調的定義一般都是interface,而interface是不能在activity之間通過intent傳遞的,那么用什么方法能讓它傳遞呢?沒錯,可能有人已經想到了,容器啊,interface直接放全局的容器,在從第一個activity到第二個activity時傳遞容器過去,然后在第二個activity中接收,然后整個回調看起來就是這么簡單的api。
API穩定性
Paste_Image.png
1.如何確保穩定
作為開發人員我們可以做什么,以確保盡可能高的穩定性?有一些事情是我們開發過程中的關鍵。首先,代碼審查是非常重要的,必須得認真對待它們。然后,通過不斷地問自己“這個代碼有什么問題嗎?”我們可以這樣試著去問自己,以達到盡可能的防守。
如果能夠自動獲得一些基本的正確性保證,也可以在早期幫助捕捉錯誤,所以單元測試是非常有用的。
優美的降解
開發者經常是容易不耐煩的,所以有一些錯誤越盡早拋出就越好。
比如開發者傳的參數缺少,很明顯的是不能繼續進行業務上的處理的,是否可以直接拋出異常出來
保證你的 SDK 在生產環境中絕不會出錯,讓你的代碼持續運行在他們的應用中
輕量
1.用戶不太可能下載大的應用程序,這意味著安裝包的大小是一個關鍵內容
2.偉大的第三方庫,可以真正給予貢獻于你的應用程序,但當涉及到 size 規模和影響時,他們會顯得不自由
3.作為一個 SDK 你應該努力平衡你的尺寸與功能。因此,要注意引入第三方庫,以確保它們只滿足所需的內容。
4.積極地監控每個 build,使我們能夠衡量的真實影響開發者的 APK 大小情況。沒有硬性和快速的規則來解決大小增加,但一直關注它顯然是有幫助的。
模塊化
1.適配器模式
Paste_Image.png
上面圖中幾行代碼涉及到三個可更換模塊
HTTP請求模塊,相應內容格式化模塊,相應內容處理模塊
更簡單的異步
- 在應用中進行有限的同步工作
- 請幫開發者進行線程的切換
- API代碼運行線程的統一
可擴展的類和接口
- 除了運行時檢測,我們不能滿足每個開發者的需求。我們易于使用和流行的一些特性讓用戶去發現。
- 開發人員有很多工具,有很多的選擇,他們需要在他們的代碼中保持靈活性。
構建工具的支持
Paste_Image.png
Paste_Image.png
Paste_Image.png
- 可以讓開發者選擇不同的依賴管理器或者構件工具來引入或集成你的庫
- 可選擇的依賴方式(jar,aar,library)
來自:http://www.jianshu.com/p/ae4bf7ac91e4