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