?談一談App的架構設計
如何在軟體開發的道路上更進一步?
我們可能已經在研發的這條道路上持續了5年,甚至更久的時間,如何才能拉開和大眾的距離,讓自己的工作能力提升一步?架構設計應該是其中一個方向,大到app整個的設計,小到每一個頁面、功能,都需要設計。這篇文章根據我的研發經驗談一談App的架構設計。
一、程式碼需要可讀性
可讀性是十分必要的,我們甚至可以在一個UIViewController中完成一個APP的所有功能,它可能有幾萬行,幾十萬行程式碼,該怎麼維護,怎麼讀,寫的時候只有你和天明白是怎麼回事,過了幾天就只有天知道程式碼為什麼這麼寫了。因為程式碼太複雜,幾十萬行得邏輯在你腦子裡,估計腦袋會炸掉,現在在MVC框架中Controller有一千行程式碼,都覺得都痛苦了,更何況是幾十萬。
所以要本著一個原則,可讀性。 程式碼可以不漂亮。
針對可讀性,我們老一輩得人,做了很多嘗試,最後有一些被證明是合適的,用起來蠻舒服的,這樣的嘗試,被總結出來,形成了原則,我們大家共同去遵守,達成共識。比如:六大設計原則。
感謝他們,我們是站在他們得肩膀上。
二、程式碼需要擴充套件性
擴充套件性、仁者見仁智者見智,這是十分考驗得內功得事情,有些人開始時就可以做出很好的架構,也有工作幾年的人依舊不能做出前瞻性得技術思考。程式碼的擴充套件性按照我的理解需要有注意如下幾個方面:
- 產品思維
- 設計規範
- 技術選型
程式碼需要產品思維
程式碼的擴充套件性與產品思維是離不開的,你要知道產品現在做的什麼功能,以後可能會做什麼功能,以及要和產品經理聊天,直到他們大致的規劃;可能有些產品在實踐的過程中慢慢就會發生變化,工程師也要跟隨著一起做出改變,而且一旦反向改變,一定要在程式碼上果斷的做出改變,否則,後續的問題會越來越嚴重。
比如產品定位於直播,那麼相應的技術棧就出來了:FFmpeg
、GPUImage
、AVFoundation
、OpenGL ES
、Metal
、即時通訊。可能會有直播帶貨,網頁,支付等。
當產品經理的操作過於複雜時,記得要battle,(如:產品自己講著講著就懵逼了,這是一定battle),不然出來的程式碼也是一片狼藉,使用者估計也不會喜歡。
檢視競品軟體更直觀、更有效。我們通過以下手段獲取有用資訊:
- 競品的現有功能
- 競品的技術選型(簡單的逆向、分析出用的
Swift
還是OC
、FFmpeg還是GPUImage
、以及用的第三方框架都有哪些) - 競品的規劃方向
設計規範驅動程式碼
為什麼程式碼的擴充套件性還要考慮設計呢?
我們再研發的過程中很多時候都是和設計打交道,可以說一個好的設計師,可以讓我們的程式碼質量提升,可以減少我們的研發時間,那麼對於工程師什麼是好的設計師呢?
- 有規劃(知道自己現在以及未來,將會做出是什麼樣的設計,能找出共性,會抽象)
- 有邏輯(好的設計圖管理、互動的邏輯性,各種極端情況的考慮:如無網路,無資料,大螢幕、小螢幕、全面屏,錯誤提示,完成提示)
如果設計不夠成熟,讓他多去看看大廠得軟體,學習去吧。同時我們也要幫助設計童鞋進行抽象。
技術選型是骨架
根據產品的方向型別,進行技術選型,技術選型包含以下幾個方面:
- 語言: OC、Swift、RN
- 程式設計方式:面向物件、函式式、面向協議
- 第三方庫:這是個自己造輪子還是用別人的輪子得問題
- 佈局方式:autolayout、frame、xib、storyboard
做技術選型時,要調研好社群情況,是否活躍,是否繼續維護,支援的iOS系統。比如目前的SwiftUI
目前就不適合作為一個商業專案的選型,Flutter
,目前也不適合,要考慮之後專案新人的接手難度,招聘情況,雖然各大廠不斷鼓吹Flutter
,真正用到的很少很少,甚至我發現,各大廠不斷開Flutter
交流會,但是本身並不使用。無論是SwiftUI
還是Flutter
距離使用都還有一段考驗期,小廠不要去考慮,大廠可以盡情折騰。
2016年,在一家創業公司,用Swift2.0寫專案,現在想想,那是一個錯誤的決定,不成熟的Swift並不友好,尤其是每個版本不相容,一年一度的升級,讓我們不堪重負,拖累我們的研發進度。
競品得技術選型是一個重要的參考方向。
三、App需要加速框架(知識庫)
公司要積累自己的知識庫,也成為加速框架,比如網路,肯定要自己再封裝一層吧,各個專案的網路庫統一用同一個,這樣節省開發者的時間;通常這些加速框架與App的耦合成都不大,可以獨立封裝。常見的加速模組:
- 網路模組(上傳、下載、加密、重試、快取、請求以及任務管理)
- 音視訊模組(濾鏡、播放、裁剪、合生、AV資料採集)
- 基礎框架(String、Array、Dictionary、TableView、Date等原生框架的補充)
- 資料(同步、讀寫、升級、清除快取)
- 彈窗(toast、hint、alert)
音視訊框架可以細分:圖片處理、視訊處理、渲染處理。
這些都是公司的寶貴財富,需要一點一點積累,還好我們也是站在巨人的肩膀上,github中有很多可以參考借鑑的例子。完善公司的知識庫後,必將如虎添翼,加速開發節奏。
如何提升自己架構設計的感覺?
- 程式碼的可讀性、擴充套件性、完善自己的加速框架(知識庫)。
- 勤于思考,在下筆之前,一定要做結構、圖表分析。
- 多溝通,無論是自己的組員還是自己的上司,或者是設計還是產品,往往靈感一觸即發。
- 多讀第三方的原始碼,思考為什麼作者這樣設計,這樣做有什麼好處和壞處。
- 做垂直領域,完善自己的技術壁壘
- 做寬度領域,多看一些Python、Go、Swift、Java、JS、PHP等語言,見得多才能更全面的分析。
我收藏的第三方庫
1.Hue 顏色擴充套件相關
2.Snapkit autolayout佈局
3.Realm 資料庫
4.RxSwift 響應式
5.Hero 轉場動畫
6.Lottie 設計師動畫
7.Alamofire 網路
8.messageKit 聊天UI框架
9.Charts 表格
10.Kingfisher 輕量級下載、影象快取
11.ImageScout 最小網路代價獲得圖片大小及型別類
12.Gifu 高效能gif載入
13.Proposer 請求本地裝置許可權
14.MonkeyKing 無SDK的分享支付(文字、影象、音視訊、URL)
15.Wormhole 裝置之間的分享iPhone watch
16.Promisekit 非同步程式設計
17.Chamele 顏色框架
18.Reachability 網路監察
19.FloatingPanel 浮動介面
20.LSAnimator 鏈式動畫基於CoreAnimation
21.Blueprints 多種瀑布流
22、SwiftyStoreKit 應用內購
23、SideMenu 左右選單欄
24、ActiveLabel 替代UILabel
25、Nuke 代替Kingfisher
26、NotificationBanner app內通知欄
27、XLPagerTabStrip 頂部Tap切換
28、SwiftyCam 相機封裝的很好
MonkeyKing 分享平臺
Debug:FLEX、VZInspector、MT、GT、Matrix
複製程式碼
設計原則
加V備註:掘金;入群一起學習?