無線客戶端框架設計(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佈局檔案。
相關推薦
無線客戶端框架設計(1):前言、目錄,以及一些念念碎
接下來要說的一個系列,是一個完整的App應用所需要的企業級框架設計,是我這2年來在無線客戶端這個領域摸爬滾打的,總結沉澱的心得體會,中途吃了很多虧,走過很多彎路,加了很多班,一次又一次的重構,不斷的學習,才知道,哦,原來iOS要這麼做,原來Android要那麼做,然後回過頭來再看看我最熟悉的WP,哦,原來WP
微軟Windows2008 AD+NPS配合無線控制器採用PEAP認證無線客戶端的配置(1)
思科無線控制器支援外接Radius介面,採用思科ACS 做為Radius來認證無線客戶端只是一種應用形式。很多客戶已經部署了微軟的Windows 2003/2008伺服器並希望通過微軟的架構實現Radius功能。這是可行的,例如Windows 2003 AD + IAS即
JavaWeb學習(八)HttpServletRequest基本應用——獲得客戶端的請求(1)
一、HttpServletRequest介紹 HttpServletRequest物件代表客戶端的請求,當客戶端通過HTTP協議訪問伺服器時,HTTP請求頭中的所有資訊都封裝在這個物件中,通過這個物件提供的方法,可以獲得客戶端請求的所有資訊。 二、Request常用方法 2.1 獲得
Android MVP框架設計(1)
1.介面設計 V:定義資料處理規範的介面 public interface IHandler<T> { void onBefore(); //載入前 void setData(T data); //View層呼叫
.NET框架設計(1)
框架設計的基本概念 框架 框架的通常作用及層面 軟體開發要滿足使用者的業務需求,然後滿足編寫程式碼時的非業務需求。非業務需求有很多種:安全、穩定、易維護、易擴充套件等等。 框架的主要作
ONVIF協議網路攝像機(IPC)客戶端程式開發(4):使用gSOAP生成Web Services框架程式碼
1. 專欄導讀 本專欄第一篇文章「專欄開篇」列出了專欄的完整目錄,按目錄順序閱讀,有助於你的理解,專欄前面文章講過的知識點(或程式碼段),後面文章不會贅述。為了節省篇幅,突出重點,在文章中展示的示例程式碼僅僅是關鍵程式碼,你可以在「專欄開篇」中獲取完整程式碼。
web前端篇(1)——瞭解什麼是前端,以及與後端的關係
簡介 1.什麼是web前端 說這個之前,我們先了解web前端工程師是幹什麼的,百度百科的解釋: Web前端開發工程師,主要職責是利用(X)HTML/CSS/JavaScript/Flash等各種Web技術進行客戶端產品的開發。完成客戶端程式(也就是瀏覽器端)的開發,開發JavaSc
基於springboot2 框架整合(1):spring boot專案初始化
前言 專案中使用了很多現成的框架,都是專案經理、架構師帶來的,從來沒有自己整合過!這次決定自己從零開始整合一次,以學習鞏固。過程中參考很多開源框架的思路,工具類等,若有侵權,請速速聯絡,一定妥善處理 一:建立maven專案 這個不多說,給出pom.xml
ONVIF協議網路攝像機(IPC)客戶端程式開發(7):裝置搜尋
1 專欄導讀 本專欄第一篇文章「專欄開篇」列出了專欄的完整目錄,按目錄順序閱讀,有助於你的理解,專欄前面文章講過的知識點(或程式碼段),後面文章不會贅述。為了節省篇幅,突出重點,在文章中展示的示例程式碼僅僅是關鍵程式碼,你可以在「專欄開篇」中獲取完整程式碼。
CMS系統模版引擎設計(1):基礎型別
/// <summary> /// 模版類 /// </summary> public class Template { /// <summary> /// 模版ID /// <
移動端混合開發(1):和H5的javascript互動
最近公司專案開發中涉及到了大量的混合開發,這裡開一個系列,把開發中的經驗和遇到的問題和大家分享下 講到移動端的混合開發,繞不開的一個話題就是原生和Js的互動,關於iOS、Android怎麼和js互動,網上的資料很多,這裡先簡單介紹幾個方法。 js
Gradle基本使用(1):安裝、IDEA使用
程序 enter epo osi window ont ins window下 cto 安裝配置Gradle Gradle 二進制版下載地址: https://gradle.org/install/ 下載後解壓,並將 GRADLE_HOME/bin 添加到系統 path
Java語法糖(1):可變長度參數以及foreach循環原理
i++ javap反編譯 信息 所有 子接口 inter new 編譯 意思 語法糖 接下來幾篇文章要開啟一個Java語法糖系列,所以首先講講什麽是語法糖。語法糖是一種幾乎每種語言或多或少都提供過的一些方便程序員開發代碼的語法,它只是編譯器實現的一些小把戲罷了,編譯期間以特
藍的成長記——追逐DBA(1):奔波於路上,挺進山東 藍的成長記——追逐DBA(3):古董上操作,資料匯入匯出成了問題 藍的成長記——追逐DBA(8):重拾SP報告,回憶oracle的STATSPACK實驗 藍的成長記— —追逐DBA(9):國慶漸去,追逐DBA,新規劃,新啟程
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
淺談ArcGIS移動開發中的基本變數(1):MapView、Map、Layers、GraphicsOverlay
一、MapView 二、Map Map,程式設計中即ArcGISMap,可譯為地圖物件,主要用來承載地圖資料,ArcGISMap包含製圖資料圖層以及其它能夠定義地圖資訊的資料(例如basemaps底圖、popups彈出視窗、renderer渲染
Python高階特性(1):Iterators、Generators和itertools
【譯註】:作為一門動態指令碼語言,Python對程式設計初學者而言很友好,豐富的第三方庫能夠給使用者帶來很大的便利。而Python同時也能夠提供一些高階的特性方便使用者使用更為複雜的資料結構。本系列文章共有三篇,本文是系列的第一篇,將會介紹迭代器、生成器以及iter
理論: 數論(1):整除、gcd以及lcm
整除 整除的性質 設a, b是兩個整數, 並且b ≠ 0. 如果存在整數c, 使得 a = b * c , 則稱a被b整除, 或者b整除a,記作b |a(這裡是a 被 b整除, a >= b) 此時又稱a是b的倍數, b是a的因子。如果b不整
線性代數的本質學習筆記(1):向量、線性組合、張成(SPAN)、線性變換
本文主要內容為《線性代數的本質》學習筆記,內容和圖片主要參考 學習視訊 ,感謝3Blue1Brown對於本視訊翻譯的辛苦付出。有的時候跟不上字幕,所有在這裡有些內容參考了此篇部落格。在這裡我主要記錄下自己覺得重要的內容以及一些相關的想法,希望能與大家
入門(1)--螢幕解析度、PPI,螢幕尺寸,dpr
1.螢幕解析度 螢幕在縱橫座標上的畫素,1280*960,表示縱座標上1280個畫素,橫座標960個畫素 2.螢幕尺寸 螢幕的對角線長度,使用英寸表示,1in=2.54cm 3.ppi 每英寸上面的畫素個數。ppi=對角線上的畫素個數/螢幕尺寸 4.dpr dpr=物理畫素
資料結構(1)——順序棧的實現,以及括號匹配的應用
為什麼從堆疊開始?因為我覺得線性部分比較簡單的是堆疊和佇列,用得也比較多,有不少人覺得連結串列才簡單啊,其實連結串列簡單嗎?連結串列可以派生的東西反而很多,不是一時半會可以理解的,還記得在一篇微軟的招聘心得回顧文上看到,微軟的面試官就問他怎樣用兩個連結串列實現一個棧。當然,