朱立(北京信息職業(yè)技術(shù)學(xué)院,北京 100018)
?
淺談MVVM數(shù)據(jù)綁定的耦合性
朱立
(北京信息職業(yè)技術(shù)學(xué)院,北京 100018)
【摘 要】復(fù)雜軟件需要清晰合理的架構(gòu)設(shè)計(jì),否則會給前期開發(fā)和后期維護(hù)帶來極大的困難。各類框架的應(yīng)運(yùn)而生,重要目的之一就是降低軟件的耦合度以獲得良好的性能。本文圍繞近年來流行度較高的MVVM架構(gòu),簡單介紹了其原理和特點(diǎn),針對MVVM數(shù)據(jù)綁定的耦合性,分別例舉逐一屬性綁定、對象綁定和集合綁定,并針對不同的綁定配置方式分析了耦合性。
【關(guān)鍵詞】MVVM 數(shù)據(jù)綁定 耦合
對軟件來說,最基本、最核心的內(nèi)容是數(shù)據(jù),所有代碼層次的劃分都是圍繞數(shù)據(jù)設(shè)計(jì)的。業(yè)務(wù)邏輯層是為了實(shí)現(xiàn)對數(shù)據(jù)的增刪改查,各類界面技術(shù)是為了更好地呈現(xiàn)數(shù)據(jù)。隨著軟件復(fù)雜度的提高,要想降低數(shù)據(jù)層、業(yè)務(wù)邏輯層及界面層的耦合度,就需要良好的架構(gòu)設(shè)計(jì)。ORM等框架實(shí)現(xiàn)了業(yè)務(wù)邏輯層和數(shù)據(jù)層之間的解耦合,另有一批框架用來解決業(yè)務(wù)邏輯層和視圖之間的耦合問題,MVVM就是其中之一。
Model-View-ViewModel(MVVM,模型-視圖-視圖模型)是一種架構(gòu)模式,如圖1所示。MVVM的目標(biāo)是將幾乎所有程序代碼從視圖中移除(更加徹底的代碼后置)。交互設(shè)計(jì)師只需專注于使用XAML(視圖)表達(dá)用戶體驗(yàn)需求,并創(chuàng)建視圖和視圖模型的綁定;而模型和視圖模型則由程序員進(jìn)行開發(fā)和維護(hù)。
MVVM的視圖具有獨(dú)立性,其中的控件能夠管理部分用戶輸入并且自行反應(yīng)。用戶輸入經(jīng)過視圖底層系統(tǒng)的處理和分發(fā),多以事件的形式被后臺用戶程序所感知。視圖模型包含概念模型而不是數(shù)據(jù)模型,所有業(yè)務(wù)邏輯和其它操作都是在模型和視圖模型里完成的。
長久以來,在非MVVM架構(gòu)中直接編寫代碼存在兩個問題。一,View中有些控件的數(shù)據(jù)類型和Model中的屬性類型不同。例如性別,Model中通常設(shè)置為bool類型;而View中呈現(xiàn)的是“男”、“女”這樣的字符串,這就需要額外的代碼進(jìn)行轉(zhuǎn)換。而轉(zhuǎn)換代碼如果放在View中會增大軟件的耦合度(View上不應(yīng)出現(xiàn)邏輯代碼);放在Model中,會導(dǎo)致Model臃腫龐大。二、事件驅(qū)動開發(fā)中的復(fù)用問題。Winform開發(fā)中的事件驅(qū)動因其易于理解和實(shí)現(xiàn)而被廣泛接受,問題就是多種同類事件并存,后期維護(hù)繁重,且代碼復(fù)用性相對較差。
圖1 MVVM結(jié)構(gòu)關(guān)系圖
Model和View中間的輔助角色——ViewModel較好地解決了上述兩個問題。它幫助View和Model之間進(jìn)行數(shù)據(jù)轉(zhuǎn)換,并保證數(shù)據(jù)類型適當(dāng)。同時它也將View的多種命令綁定到Model中相同的處理方法上,使得這些命令中綁定的方法可以被其他View復(fù)用。與同類架構(gòu)模式(MVP、MVC)相比,MVVM架構(gòu)唯一不同的特點(diǎn)是它采用雙向綁定,即View中的變動會自動反映在ViewModel中,反之亦然。
MVVM的一個主要特征是,通過Binding機(jī)制由ViewModel指示View如何作變更;用戶與ViewModel的交互通過Command來實(shí)現(xiàn),這時只需View指導(dǎo)ViewModel即可,而ViewModel不必關(guān)心View如何展示和展示什么,它只需提供屬性(要綁定的數(shù)據(jù)和Command)并實(shí)現(xiàn)INotifyPropertyChanged。少了一個方向的依賴,代碼自然更簡潔清晰。
View中的控件存在一個屬性“DataContext”,負(fù)責(zé)為控件指定數(shù)據(jù)源頭。DataContext屬性給控件指定一個后臺模型,就是該控件的數(shù)據(jù)來源。ViewModel就是這個后臺模型,給View中的控件提供用于顯示的數(shù)據(jù)。而ViewModel提供的數(shù)據(jù)應(yīng)該來自于背后的Model。所以,三者的關(guān)系是根據(jù)View中顯示的數(shù)據(jù)是何種Model,來定義ViewModel。
Model中的某個類要成為真正的數(shù)據(jù)源,需要實(shí)現(xiàn)以下兩個步驟。
(1)在后臺.cs文件(以下簡稱后臺)中為該類定義屬性。如:
(2)讓該類實(shí)現(xiàn)INotifyPropertyChanged接口。實(shí)現(xiàn)該接口的目的是當(dāng)數(shù)據(jù)源的屬性值改變后通知Binding(使其知道源數(shù)據(jù)變了并進(jìn)行聯(lián)動協(xié)同),以便Binding把數(shù)據(jù)傳輸給目標(biāo)。實(shí)際上,這個動作本質(zhì)上還是運(yùn)用了事件機(jī)制,只是掩蓋在底層,不用程序員去寫代碼。
具體的綁定需要在前臺頁面文件(以下簡稱前臺)和后臺(如MainPage類的構(gòu)造函數(shù)中)分別進(jìn)行配置:
后臺配置:
前臺配置:
〈TextBox x:Name="tb1" Text="{Binding Names}"〉〈/ TextBox〉語句的含義是,名稱為tb1的文本框的Text屬性值與Names屬性值相關(guān)聯(lián),Names變化的時候,Text也隨之變化。
這里面蘊(yùn)含了“數(shù)據(jù)驅(qū)動界面”的模型。在這里,Names屬性值是數(shù)據(jù)源,文本框tb1用來顯示數(shù)據(jù),Names屬性值驅(qū)動文本框tb1的Text進(jìn)行改變;人為改變文本框tb1的Text屬性值,也會被送回到person對象的Names屬性上去。這里的Text屬性也叫“依賴式屬性”,就是它本身沒有值,它的值“依賴”在其它對象的屬性值上,通過Binding進(jìn)行傳遞和轉(zhuǎn)換。這樣做的好處是,隨便給Binding指定一個數(shù)據(jù)源,只要這個數(shù)據(jù)源有名為“Names”的屬性,Binding就會自動提取它的值并傳輸給Text。
不同配置的數(shù)據(jù)綁定會呈現(xiàn)不同的耦合性。在上述例子中,需要將前臺頁面中的控件逐一綁定到person對象的每個屬性,屬性越多,綁定越多,前后臺的耦合度也就越高。在數(shù)據(jù)結(jié)構(gòu)復(fù)雜度很高的情況下,這種方式顯然不可取。可以采取下列方式進(jìn)行改進(jìn)。
后臺文件:
前臺文件:
這個綁定是將前臺頁面(Page就是App.MainPage,所以可以在類代碼中使用this)綁定到person對象(包含所有的屬性)上,該頁面的所有控件就可以直接獲取該對象的所有屬性值而不必單獨(dú)進(jìn)行綁定,耦合度大大降低。
〈TextBox Text="{Binding Names}"〉〈/TextBox〉語句中,Text屬性綁定的Names屬性是從所在頁面(已經(jīng)綁定了person對象)獲取的,而不是后臺類對象,所以這里不構(gòu)成耦合。
如果后臺數(shù)據(jù)結(jié)構(gòu)不是單一對象而是集合,并且是存在上下級關(guān)系的復(fù)雜集合,用這種改進(jìn)的方法也存在前后臺耦合度過高的問題(集合中的每個對象都要逐一與前臺頁面進(jìn)行綁定)。這時可以采取集合綁定的方法。
后臺文件:
前臺文件:
在上例的前臺文件中,只有Source="{Binding Company.Departments}" x:Key= "cvsDeps"〉這一個綁定與后臺構(gòu)成了耦合,它綁定了后臺集合對象Company.Departments。后續(xù)的綁定都是調(diào)用這個復(fù)雜集合的下級對象。雖然調(diào)用關(guān)系復(fù)雜,但耦合度并沒有提高。
通過分析可以看出,綁定的設(shè)置方式不同,前后臺的耦合度也會不同。而綁定設(shè)置方式應(yīng)該結(jié)合數(shù)據(jù)結(jié)構(gòu)的復(fù)雜程度和數(shù)據(jù)展示的需求進(jìn)行考慮。軟件的靈魂是數(shù)據(jù),最終要在滿足需求的情況下保證軟件性能。
參考文獻(xiàn):
[1]劉黎志,陳傳波.Windows Phone數(shù)據(jù)訪問技術(shù)研究.計(jì)算機(jī)工程與科學(xué)[J],2014,36(9).
[2]陳濤.MVVM設(shè)計(jì)模式及其應(yīng)用研究.計(jì)算機(jī)與數(shù)字工程[J].2014, (10).
作者簡介:朱立,女,北京信息職業(yè)技術(shù)學(xué)院,副教授,碩士,軟件技術(shù)、高職教育研究方向。