App架構設計經驗談:展現層的設計

App架構設計經驗談:展現層的設計html

三層架構中,數據層業務層都已經作過了簡單的分享,最後,就剩下展現層了。本篇就給各位分享下我在展現層設計方面的一些經驗心得。android

展現層是三層架構中最複雜的一層了,須要考慮的包括但不限於界面佈局、屏幕適配、文字大小、顏色、圖片資源、提示信息、動畫等等。展現層也是變化最頻繁的一個層面,天天改得最多的就是界面了。所以,展現層也是最容易變得混亂不堪的一個層面。一個良好的展現層,應該有較好的可讀性、健壯性、維護性、擴展性。架構

三原則

我在Android項目重構之路:界面篇中提到過三個原則,要設計好展現層,至少須要遵循好這三條基本的原則:app

  1. 保持規範性:定義好開發規範,包括書寫規範、命名規範、註釋規範等,並按照規範嚴格執行;dom

  2. 保持單一性:佈局就只作佈局,內容就只作內容,各自分離好,每一個方法、每一個類,也只作一件事情;ide

  3. 保持簡潔性:保持代碼和結構的簡潔,每一個方法,每一個類,每一個包,每一個文件,都不要塞太多代碼或資源,感受多了就應該拆分。工具

關於這三個原則詳細的解說,界面篇已經講過的,我這裏就再也不重複。在此,我只作些補充。佈局

關於規範,Android方面,我已經分享過一套Android技術積累:開發規範,主要分爲書寫規範、命名規範、註釋規範三部分。iOS方面,蘋果已經有一套Coding Guidelines,主要屬於命名方面的規範。當咱們制定本身的開發規範時,首先就要遵照蘋果的這份規範,在此基礎上再加上本身的規範。post

最重要的不是開發規範的制定,而是開發規範的執行。若是沒有按照開發規範去執行,那開發規範就等於形同虛設,那代碼混亂的問題依然得不到解決。動畫

另外,Android系統自己已經對資源進行了很好的分離,字符串、顏色值、尺寸大小、圖片、動畫等等都用不一樣的xml文件定義。而iOS系統在這方面就遜色不少,只能本身實現,其中一種實現方案就是經過plist文件的方式實現和Android同樣的機制。

工程結構

工程結構其實就是模塊的劃分,無非分爲兩類:按業務劃分或按組件劃分。

好比一個電商App,可能會有首頁、附近、分類、個人四大模塊,工程結構也根據這四大模塊進行劃分,Android可能就分爲了四個模塊包:

  • com.domain.home 首頁

  • com.domain.nearby 附近

  • com.domain.category 分類

  • com.domain.user 個人

一樣的,iOS則分爲四個分組:home、nearby、category、user。

以後,每一個模塊下相應的頁面就放入相應的模塊。那麼,問題來了,商品詳情頁應該屬於哪一個模塊呢?首頁會跳轉到商品詳情頁,附近也會跳轉到商品詳情頁,分類也會跳轉到商品詳情頁,用戶查看訂單時也能跳轉到商品詳情頁。有些頁面,並不能很明顯的區分出屬於哪一個模塊的。我接手過的,按業務劃分的二手項目中(即不是由我搭建的項目),我要找一個頁面時,我認爲應該屬於A模塊的,但在A模塊卻找不到,問了同事才知道在B模塊。相似的狀況出現過不少次,並且不止出如今我身上,對業務不熟悉的開發人員都會出現這個問題。並且,對業務不熟悉的開發人員開發新的頁面或功能時,若是對業務理解不深,劃分出錯,那也將成爲問題,其餘人員要找該頁面時更難找到了。

所以,我更喜歡按組件劃分的工程結構,由於組件每一個人都懂,無論對業務熟不熟悉,查找起來都明顯方便不少。Android按組件劃分大體以下:

  • com.domain.activities 存放全部的Activity

  • com.domain.fragments 存放全部的Fragment

  • com.domain.adapters 存放全部的Adapter

  • com.domain.services 存放全部的Service

  • com.domain.views 存放全部的自定義View

  • com.domain.utils 存放全部的工具類

iOS的分組則大體以下:

  • controllers 存放全部ViewController

  • cells 存放全部Cell,包括TableViewCell和CollectionViewCell

  • views 存放全部自定義控件或對系統控件的擴展

  • utils 存放全部的工具類

基類的定義

Android的Activity、Fragment、Adapter,iOS的ViewController,分別定義一個基類,將大部分通用的變量和方法定義和封裝好,將減小不少工做量,並且有了統一的設置,也會減小代碼的混亂。好比我在Android項目重構之路:實現篇中提到的KBaseActivity和KBaseAdapter的實現就是例子,固然還能夠抽離出更多變量和方法。

每一個Activity的onCreate()方法,通常分爲三步:

  1. 變量的初始化;

  2. View的初始化;

  3. 加載數據。

所以,其實能夠將onCreate()方法拆分紅三個方法:

  1. initVariables()

  2. initViews()

  3. loadData()

在基類中將這三個方法定義爲抽象方法,由子類去實現,這樣,子類就不須要實現onCreate()方法了,只要實現更細化的上述三個方法便可。

iOS的ViewController也是一樣的方式,這裏就不重複了。

相關文章
相關標籤/搜索