?? 191.txt
字號:
日月光華 -- SE精華區文章閱讀
--------------------------------------------------------------------------------
發信人: Jove (死生契闊,與子相悅,執子之手,與子偕老), 信區: SE
標 題: [zz]MVC減少編程復雜性
發信站: 日月光華 (2003年04月20日21:16:03 星期天), 站內信件
MVC減少編程復雜性
隨著面向對象的語言(如Java)的迅速發展和普及,越來越多的編程人員開始在應
用開發中使用這些語言。然而原有的開發語
言(即面向操作的開發語言如C++等)在短時間內還不可能退出歷史舞臺,因此現在就
出現了面向對象的語言和傳統的面向操作的
語言共存的局面。在設計應用中同時使用兩類不同的語言(混合語言設計)比過去只使
用一類語言會帶來許多新的問題,其中復雜
性就是混合語言設計中最經常遇到的問題。下面我們探討混合語言設計中可能導致復雜
性增加的地方,以及如何減少以至消除這些
復雜性。
復雜性
復雜性是應用開發過程中最令人頭疼的一個問題。每當在一個應用中增加一個功能
時,它的復雜性通常呈幾何級的增長。這種
復雜性往往導致程序的開發無法再繼續下去。這也是現在為什么許多應用只有Beta版本
而沒有正式版的原因。
專家將應用開發過程產生的復雜性分為兩類,即非本質的(accidental)和本質的
(essential)。本質的復雜性是對于解決目
標問題所必然產生的復雜性,非本質的復雜性是由于選擇了不適當的開發工具和設計工
具而產生的復雜性。對于一個功能確定的程
序來講,本質的復雜性是確定的,而非本質的復雜性則是沒有限制的。因此,一個應用
的開發要想較順利地取得成功,就需要盡可
能地減少非本質的復雜性。
OOD的特點
面向對象的設計(OOD)將一個程序分解成根據具體的對象而設計的一系列元素。這
些具體對象的行為和數據以一種叫做“類
(class)”的編程單元進行打包。應用程序創建一個或多個這些類的例示,也稱為“對
象(object)”。類的行為是通過創建對象
之間的關系組合在一起的。
OOD允許開發者用兩種主要的方法來控制復雜性的增加。第一,OOD定義嚴格的出口
語義,這允許開發者隱藏實現的細節,并且
明確說明什么方法是其它的對象可以訪問的。這個信息隱藏使得可以對大部分的代碼進
行修改而不影響其它的對象。
第二,OOD將對象之間的關系分為四類:繼承、包容、使用和協調。適當地使用這些
關系可以大大減少應用開發過程中本質的和
非本質的復雜性。如,繼承是產生面向對象設計中可再使用的主要因素。這個再使用性
是通過代碼共享和多態性獲得的。這種再使
用可以大大減少應用的本質的復雜性。包容允許一個類的用戶在使用包容器時忽略被包
容的類(class)。這個簡化使設計者能夠大
大減少應用的非本質的復雜性。
可視化接口在OOD方面的不足
許多程序都需要可視化接口,這些接口由對話框、選單、工具條等組成。這些可視
化接口的增加會引進OOD設計的不足,使得一
個好的面向對象的設計走向反面。可視化接口有三個屬性可能會給應用開發帶來麻煩。
第一,可視化接口提高了傳統的面向操作的拓撲結構。用戶產生接口事件,如開關
按鍵和列表框選擇等,受到程序的一個模塊
的驅動并且用來對靜態的數據進行操作。在設計中將這面向操作的拓撲結構同一個面向
對象的設計混合在一起將導致對象之間的大
量的雜合。
第二,用戶接口通常對于同樣的信息經常會需要許多不同的顯示。如,一個客戶選
擇列表框可以包含一個客戶的名字和電話號
碼以及許多其它客戶的名字。
當用戶選擇某個特定的客戶后,他/她的名字和電話號碼及其它全部相關的信息都
會詳細地顯示出來。
除此之外,一個簡單的程序可能具有不同的用戶接口。如一個銀行賬戶系統有一個
接口用于出納員來訪問賬戶平衡、存款和取
款,而監督者的接口則包含另外的信息并加上賬號管理的功能。這些不同的接口很容易
導致類的擴展。
最后,可視化接口在整個設計階段還會進行較大的改變。這些改變包括完全重新安
排用戶與系統的交互操作等。可視化接口的
這些改變即使在最好的設計中也會增加應用開發的復雜性。
MVC彌補可視化接口/OOD的不足
模型/界面/控制器(Model/View/Controller,MVC)編程技術允許一個開發者
將一個可視化接口連接到一個面向對象的設
計中,而同時還可以避免我們上面討論的幾個問題。MVC最初是為Smalltalk語言而設計
的。MVC通過創建下面三個層將面向對象的設
計與可視化接口分開:
模型(Model):模型包含完成任務所需要的所有的行為和數據。模型一般由許多類
組成并且使用面向對象的技術來創建滿足五
個設計目標的程序。
界面(View):一個界面就是一個程序的可視化元素,如對話框、選單、工具條等
。界面顯示從模型中提供的數據,它并不控
制數據或提供除顯示外的其它行為。一個單一的程序或模型一般有兩種界面行為。
控制器(Controller):控制器將模型映射到界面中。控制器處理用戶的輸入,每
個界面有一個控制器。它是一個接收用戶輸
入、創建或修改適當的模型對象并且將修改在界面中體現出來的狀態機。控制器在需要
時還負責創建其它的界面和控制器。
控制器一直決定哪些界面和模型組件應該在某個給定的時刻是活動的,它一直負責
接收和處理用戶的輸入,來自用戶輸入的任
何變化都被從控制器送到模型。
界面從模型內的對象中顯示數據。這些對象的改變可以通過也可以不通過用戶的交
互操作來完成。如:在一個Web瀏覽器中負責
接收頁面的對象收集和裝配棧中的信息,必須有某種方式來讓這些對象通知界面數據已
經被改變了。在模型變化時有兩種方法來對
界面進行更新。
在第一種方法中,界面可以告訴模型它正在監視哪些對象。當這些對象中有任何一
個發生變化時,一個信息就被發送給界面。
界面接收這些信息并且相應地進行更新。為了避免我們上面討論的不足,模型必須能夠
不用修改就支持許多種不同的界面顯示。
第二個方法并不直接將界面連接到模型中,它的控制器負責在模型變化時更新界面
。控制器通過對模型對象或觀察器方法進行
監測來檢測模型中的變化。這個方法不用了解界面的模型知識,因此界面就變成是可以
跨應用使用的。
使用MVC的優點
MVC通過以下三種方式消除與用戶接口和面向對象的設計有關的絕大部分困難:
第一,控制器通過一個狀態機跟蹤和處理面向操作的用戶事件。這允許控制器在必
要時創建和破壞來自模型的對象,并且將面
向操作的拓撲結構與面向對象的設計隔離開來。這個隔離有助于防止面向對象的設計走
向反面。
第二,MVC將用戶接口與面向對象的模型分開。這允許同樣的模型不用修改就可使用
許多不同的界面顯示方式。除此之外,如果
模型更新由控制器完成,那么界面就可以跨應用再使用。
最后,MVC允許應用的用戶接口進行大的變化而不影響模型。每個用戶接口的變化將
只需要對控制器進行修改,但是既然控制器
包含很少的實際行為,它是很容易修改的。
面向對象的設計人員在將一個可視化接口添加到一個面向對象的設計中時必須非常
小心,因為可視化接口的面向操作的拓撲結
構可以大大增加設計的復雜性。
MVC設計允許一個開發者將一個好的面向對象的設計與用戶接口隔離開來,允許在同
樣的模型中容易地使用多個接口,并且允許
在實現階段對接口作大的修改而不需要對相應的模型進行修改。
--
"I'm not a great programmer; I'm just a good programmer with great habits".
---Kent Beck
※ 來源:·日月光華 bbs.fudan.edu.cn·[FROM: 10.85.38.144]
--------------------------------------------------------------------------------
[返回上一頁] [本討論區]
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -