博客園客戶端(Universal App)開發隨筆 - UAP中的項目和目錄組織


前言

本篇隨筆主要是分享一下做一個Universal App的目錄組織結構,說明什么樣的結構才能適合一個團隊開發,使開發成員之間的相互影響最小。這些組織好的項目和目錄會成為一個公共的規約,大家都能知道什么東西應該放在哪里,或者在什么地方能找到什么功能。這對於避免重復寫code或者最大限度地復用code來說是至關重要的。

這種工程結構和目錄划分雖然沒有什么理論基礎,但是是經過我們很多項目的經驗總結出來的,如果是個人開發者,也嚴重建議參考此組織結構,能夠幫助你理清思路,做好功能設計和類設計。

項目組織

開發一個Universal App, 如果前篇所說,基本框架在VS里有了(對不起我這里不小心裝了個英文版),先選Universal Apps,再選Blank App,再把App1改成CNBlogs,就可以猛擊OK了。

image

它缺省會幫你建立三個projects:CNBlogs.Windows(Windows 8.1)和CNBlogs.WindowsPhone(Windows Phone 8.1)。還有一個特殊的CNBLogs.Shared,擴展名為.shproj,是被上面兩個project共用的。

如果做一個簡單的UAP,這三個project就足夠了。但是如果涉及到團隊開發的較大的項目,還要有其它一些輔助的Project和其下面的一系列Folders才能夠應付。如下圖所示:

image

我們建立了以下輔助project:

1)BackgroundTask

2)DataHelper

3)NotificatoinsExtensions

說明如下:

1)BackgroundTask主要完成的任務是后台更新動態磁貼。這個以后我們說到Windows/Phone的后台任務時,會專門解釋。

2)DataHelper,里面有兩個folder,一個CloudAPI,里面針對每一個DataSource(API接口)都有個一個單獨的類來處理,還可以根據各個DataSource的相似度,來抽象更底層的類。另一個是DataModel,就是數據模型類。這個DataHelper我們后續的CloudAPI篇里會仔細說。

image

3) NotificatoinsExtensions 這個其實不是我們自己寫的,是直接從MSDN里的sample里下載的(按照微軟的建議,但不明白為什么不做成一個庫,而是以源代碼形式給出)。這個項目里主要給出了一些幫助方法,來簡單地更新磁貼,否則就要直接操作XML數據來更新磁貼,非常容易出錯,而且不容易理解。這個以后講動態磁貼時才細說。

在這個有個問題:為什么DataHelper project不放在Shared里面呢?原因特簡單:因為BackgroundTask也需要訪問DataHelper, 如果放在Shared里面訪問不到,因為Shared只為Windows/WindowsPhone兩個Project服務。(如果這里我的理解有什么錯誤請大蝦們指正)

目錄組織

我們着重說一下Windows, WindowsPhone, Shared三個Project中的文件夾。

CNBlogs.Windows(Windows 8.1)

image

1)Assets

里面裝着那些圖像文件,一般有三類:A) Tile類,只為磁貼而做;B) Image類,只為背景圖,裝飾圖之類的而做;C)Icon類,放在AppBar中的圖標。如果項目較大,圖像文件較多時,可以在這個文件夾下建立三個子文件夾,分別為Tile, Image, Icon。

2)Common

這個是系統自帶的。如果系統沒有生成這個文件夾,你在添加一個新的Page時,指定BasicPage,就可以生成它。這個文件夾里有個4個文件,包括了很多幫助函數,供處理Navigation時是使用。輕易不動它。

3)Controls

這里放着你的小寶貝們,就是那些Template Control,或者User Control。如果是Template Control, 這里面只放一個XXXControl.cs; 如果是User Control, 這里面放一個XXXControl.xaml, 下面附帶了XXXControl.xaml.cs。關於這兩種Control的區別,我們后續有專門的一篇博客講解。

5)Pages

這里面放着你的大寶貝們,就是那些頁面啦。每個頁面都有個單獨的XAML和其下面附帶的.cs文件來描述其樣式和行為,以及和其他頁面的交互關系。

6)SettingFlyouts

Windows中的設置頁面比較特殊,在右面,是一種規約,鼠標右鍵或者輕掃右側邊框彈出5個系統按鈕,按下面的“設置”即可進入某個App自己的設置頁面。這些設置頁面其實也是用XAML來表現的。

7)Themes

這里放的是Template Control的樣式,只有一個Generic.xml,里面放了所有自定義Template Control的樣式(User Control不在這里)。不需要把它挪出來放在別的什么地方,別有潔癖,誰知道移到別的地方會出什么錯誤。

Folder就這些了,各有各的用處,有的是系統建的,有的是你自己建的,目的只有一個,讓自己和別人可以很快地找到東西。

有一個地方要注意,就是namespace。如果你在Project上右鍵添加一個Page, namespace是CNBlogs; 如果在Pages上添加,namespace是CNBLogs.Pages。都可以,但是要統一,否則要出麻煩。

CNBlogs.WindowsPhone(Windows Phone 8.1)

image

Windows Phone的Folder們和Windows的基本一樣,只是最下面的Pages和Views的區別,這個只是習慣問題,您隨便。

CNBLogs.Shared

image

Shared Project有些不一樣了,我們細細說來。

1)Assets

如果Windows/Phone有相同的圖像資源(樣子/顏色/尺寸都相同),可以只放一份在這里。但是目前Windows/Phone的Tile有尺寸上區別,所以Tile部分要分開放。背景圖之類的肯定也不一樣,一大一小。ICON部分可能會一致,因為Windows和Phone下面的AppBar中AppBarButton大小一樣。

2)ControlHelper

這里面一般放置兩類cs文件,一類是TemplateSelector,另一類是Converter,就是數據轉換類。這個我們在后面的博客中專門講(記得提醒我,我已經承諾不少東西了)。這兩類東西,對於Windows/Phone來說是共用的。

3)FunctionHelper

顧名思義,放的是你自己的通用的幫助函數類。

4)HTML

可有可無,看項目。如果項目中有用到WebView的,也許需要一些初始的HTML或者css。

5)SampleData

對於大多數應用來說,都需要data支持,有的是用本地data,有的用遠程data。當data沒有到位時(CloudAPI部分還沒有完工),你可以先手工制作一些模擬data放這里,不影響開發進度。

6)Strings

這里面放的是Resources, 按國家/市場划分。比如我們只有一個zh-CN子目錄,也許還有個ja-JP子目錄,里面放着Resources.resw。這個樣子的:

image

所有界面上用到的字符串都扔里面,比如在zh-CN中有個”Title \t 首頁”,在en-US中必須有個”Title \t Home“來對應,以便在不同國家顯示不同語言。

7)App.xaml和StyleDictionary.xaml

共用的,放這里沒事兒。尤其是StyleDictionary.xaml,里面放着所有的顏色,字體,樣式等信息,你在Windows上的應用使用藍底白字,在Windows Phone上要統一用藍底白字,就靠使用這個文件里的信息了。

小結

在本篇隨筆中,我們強調了CloudAPI的重要性,是因為我們從很多成功的App中總結出雲端數據和服務支持的重要性; 而削弱了MVVM的重要性,是因為我們從實踐中體會到,Model和View都是不可或缺的,但是ViewModel就不是那么重要了,代碼重復,可讀性差,能替代它的方法很多。至於什么可自動測試性,根本談不上。開發測試一體,有助於節約成本,提高工作效率,增強開發人員的責任心。

 

你可以從這里下載我們分享的源代碼:

https://code.msdn.microsoft.com/CNBlogs-Client-Universal-477943ab

當然更可以直接下載兩個App來看效果,但是由於designer介入較晚,所以UI上面還需要完善,我們會持續更新App。

Windows Phone Store App link:

http://www.windowsphone.com/zh-cn/store/app/博客園-uap/500f08f0-5be8-4723-aff9-a397beee52fc

Windows Store App link:

http://apps.microsoft.com/windows/zh-cn/app/c76b99a0-9abd-4a4e-86f0-b29bfcc51059

純粹干凈的App, 里面絕無廣告,請放心使用。

分享代碼,改變世界!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM