無線客戶端框架設計(1):前言、目錄,以及一些念念碎
接下來要說的一個系列,是一個完整的App應用所需要的企業級框架設計,是我這2年來在無線客戶端這個領域摸爬滾打的,總結沉淀的心得體會,中途吃 了很多虧,走過很多彎路,加了很多班,一次又一次的重構,不斷的學習,才知道,哦,原來iOS要這么做,原來Android要那么做,然后回過頭來再看看 我最熟悉的WP,哦,原來WP還可以做的更好。
2年間,我還接手了MobileAPI的維護,從而讓客戶端和服務器端的配合更順暢,中途還發明了幾個好用的工具,從服務器端到客戶端這條路我打通了。再然后,我還碰了碰tcp+protobuf,WP8的項目就是基于此開發的。
此外,我還打通了另一條路,那就是前端設計人員和客戶端開發人員的協作,為此,專門設計了iOS UI框架和WP UI框架,前端設計人員在拿到美工的設計稿后,不再提供標注圖,而是基于UI 框架,直接提供xib或者xaml,客戶端開發人員可以直接拿去使用。對于Android,暫時我還沒有太好的解決方案。
也許有從事iOS開發的朋友會問,為什么要設計企業級框架呢?沒有它,我也可以很好的寫程序啊。也可以快速開發一個App啊。至少,我手下的iOS team都是這么認為的。而Android team和WP team能比較容易接受這樣的框架。
說說我的想法,一家之言。我想是因為Android是基于Java的,經過這么多年的沉淀,Java對設計模式、代碼規范這些概念已經有了積累。而 且Android在設計的時候,就考慮到這些東西,所以它會有Activity、Intent、Adapter這些“積木”,搭建起一個完整的App。而 微軟出品的WP,是基于.NET framework體系的,而.NET本身就充斥著設計模式的思想。
對了,也許你得到那個點了——iOS在這方面顯得有些貧血。除了MVC和delegate和Notification,其它什么都沒有。所以,你可 以在一個ViewController里面寫3000行代碼,而沒有任何規定說你這樣做是錯的;不使用xib而在viewDidLoad中手動創建頁面所 有控件,當然,我問過很多到我這里面試的人,他們以及他們的公司都認為這樣做沒什么不好,甚至更靈活。大部分的iOS程序員,都已經習慣于面向過程的編程 方式,而抵觸OOP。
我也見過一些到我這里來面試的Leader,他們來自大公司,這些公司都有一些框架設計,或者說,業界規范,比如說,數據緩存,圖片緩存、網絡請求的封裝。
其實,越是什么都沒有,才越好做框架。我們可以借鑒Android和WP的設計,甚至是網站開發、javascript開發、windows開發的經驗和模式,補充到iOS的框架中去。
2年來,我就在堅持不懈地做這件事,基本上可以認為是做成了,由iOS、Android、WP三套框架組成,它們的設計思想是一樣的,包括以下18點,其中最重要的是前六點,稱之為框架設計的六大要素。
框架設計六大要素:
1.基類的設計
沒有基類,就不要說有框架。而且不僅僅是一個基類,對于一個企業級的App而言,框架層要有一個基類,里面只存放一些與框架有關的共用邏輯。App層也要有一個二級基類,繼承自框架級的那個基類,里面存放的是App相關的共用邏輯。
2.自定義App的生命周期。
對于一個頁面從初始化到消亡,每個客戶端系統各自有自己的生命周期。我們發現,在初始化的時候,要做過多的事情,代碼會很多很亂,因此有必要細分,重新規劃,定義新的生命周期。
3.發起網絡請求(以下簡稱MobileAPI)獲得數據。
很多書都在大講特講手機控件的使用、IO語法、酷炫動畫。卻對MobileAPI的介紹 語焉不詳。其實這才是最重要的一個環節,包括請求失敗后的自動重試、如何處理JSON、如何統一API的調用形式并使之最簡,對于多個API調用,是串行 調用還是并發調用及各自的處理方式。
此外,我們經常面對的是HTTP+JSON形式的網絡請求,對于轉換為TCP+protobuf形式,則需要做的事情還有很多。
無論是HTTP+JSON,還是TCP+protobuf,都要考慮數據緩存,并且要讓上層使用者感受不到數據是來自網絡請求還是緩存。
4.圖片緩存
服務器端,有2種解決方案。
客戶端的解決方案,iOS、Android、WP實現思想相同,只是實現手法不太一樣。
5.導航器(僅適用于iOS和WP)
跳轉到一個頁面很簡單,但是要整個App都采用一種調整風格,要求iOS、Android、WP都采用一種風格,就不大容易了,尤其是傳遞參數,以及處理登錄后的回調。
6.適配器
Android在這一方面做的是最好的。對于iOS和WP,我們不妨學習一下Android,設計出各自的自動適配器。
接下來就是一些細節了:
7.登錄
別看一個小小的登錄框,里面的學問可大了。比如說,記住密碼要怎么實現,才能保證用戶下次打開App不需要登陸。比如Cookie的讀寫。比如登錄后要去往哪里?比如重復輸入3次錯誤后要求輸入驗證碼的實現?比如最安全的登陸解決方案設計。
8.與JS的互操作
你可能會第一時間想到PhoneGap。但其實,對于一個原生的App框架,只要支持簡單的JS交互就夠了。
9.時間校準
如何讓客戶端時間與服務器時間保持一致,這對于電子商務至關重要。
10.廣告處理器
廣告是目前App最賺錢的一個功能。如何設計一個通用的廣告機制,而且要脫離App整體的業務邏輯,實現松耦合,至關重要。
11.彈出框鏈
這是職責鏈模式在App中的典型應用。
12.進度條
進度條經常和網絡請求聯系在一起,分兩種,一種是調用MobileAPI時,鎖住當前頁面不能動,知道請求返回結果;另一種是鎖住局部頁面,頁面其他地方可以操作。
13.日志工具
對于那些很難復現的bug,日志工具所記下的內容,能告訴我們一切。日志分兩種,調試時直接打在控制臺上;直接寫入到在手機中。
14.單元測試
本文告訴你App上的單元測試要怎么寫?以及什么時候需要單元測試。
15.MVC還是MVVM
iOS和Android使用MVC,WP使用MVVM,本文告訴你,使用哪一種,不是絕對的,一切根據業務邏輯的復雜程度而定。以此來消除一個頁面3000行代碼的問題。
16.分頁
上拉分頁,下拉刷新。3個平臺的分頁各有不同,需要注意的細節都不能少,比如說,沒有數據時怎么辦?
17.低流量模式
在2G網絡下,網速賊慢,因此,我們要設計一種能認用戶快速看到內容的機制。這就是低流量模式。其實,這是App的一種需求,只是很多App并沒有考慮過。
18.UI框架設計
在分工越來越細的今天,我們可以把一部分工作分出去給其它Team。比如UI設計,完全可以讓前端人員(熟悉js和html)來做,這就需要我們為 前端Team提供一個好用的App UI的設計工具。這樣,我們能拿到的就不再是設計稿或者標注圖,而是畫好的xib、xaml以及Android的xml布局文件。