天天看點

《MonoTouch開發實踐指南》一3.1 建構MonoTouch MVC應用程式

使用uikit的monotouch應用程式通常都使用uiview和uiviewcontroller來建構。這些都是用于構模組化型-視圖-控制器(model-view-controller,mvc)設計模式的ios應用程式的主要類。

将應用程式的特定領域(domain specific)資訊和應用程式的顯示分離開來,通常會給應用程式帶來好處。這種設計模式可以幫助開發人員在面對不斷變化的功能需求時保持基礎代碼的穩定,有助于促進代碼重用,并使建構單元測試的代碼品質更好。mvc模式就是這樣一種模式,是許多應用程式開發方案的常用模式。尤其是,cocoatouch和monotouch都要用到大部分api中的mvc設計模式,是以花點時間來學習(複習)mvc及如何在monotouch中使用它是值得的。

mvc模式源自20世紀70年代末trygve reenskaug在施樂帕羅奧多研究中心(xerox parc)所做的工作,它将模型捕獲的特定領域資訊與給使用者顯示的資訊分離開來。使用者通常是指使用應用程式的人,但也可以是其他東西,如與腳本互動的另一個應用程式。在後一種情況中,腳本就是視圖,它負責顯示模型。對于ios應用程式,視圖就是用于人機互動的使用者界面。如圖3-1所示,mvc設計模式的關鍵是在視圖與模型之間互相保持抽象。這種抽象通過“控制器”作為中介。控制器為模型和視圖提供了一個中間層以使它們能夠互相獨立。

在第2章的示例中,并沒有明确地建立控制器,隻是簡單地把appdelegate作為控制器,這對于簡單的示範沒有問題,但通常将視圖的控制器作為獨立的類,專門作為視圖的控制器。另外,不要讓視圖控制器做太多的工作(如支援多種不同類型的頂層視圖),這樣的超級控制器會導緻在應用程式中出現緊耦合,使應用程式難于維護。

在uikit中,螢幕上的一切都是視圖。控制器有單個頂層視圖,在視圖裡面可以添加按鈕、标簽、滑塊等的子視圖。視圖負責顯示和事件捕獲,如前面的uibutton的touchupinside事件。但是,視圖不會做任何事件處理,事件處理是由控制器負責的。

視圖也沒有其顯示資料。例如,可以直接在代碼中使用uitextfield的文本。但是,這不是正确的mvc做法。視圖隻負責顯示資料。如果将視圖與資料耦合,那會讓代碼難于維護。例如,如果增加需求,要在另一個視圖的标題(title)屬性中顯示相同的文本又會怎麼樣呢?如果視圖擁有資料,就必須耦合該标題的視圖與标簽。接着又有了另一個需求,要删除第一個視圖。這樣做,标題的顯示就會出現問題。即使這麼一點不起眼的地方,也會因為一時順手而出現問題。好的設計就是将字元串分離出來,或者作為獨立的字元串,或者作為一個大類的屬性,或者作為模型,讓控制器作為模型和視圖之間傳輸資料的中介。

将視圖通過控制器從模型中分離出來,使代碼更易于調試和重用。使用monotouch,可重用這點不容小觑。如果目标是多平台,就要保證模型和支援類與使用平台無關。第9章會更深入地探讨設計模式中代碼重用問題。

由于視圖和控制器是唯一的平台問題(在目前ios這種情況下),是以要了解它們是如何工作的,以及如何使用工具在ib中或直接在代碼中建立視圖和控制器。