界面對(duì)象化

          概述
          界面對(duì)象化是指以對(duì)象的思想去描述頁(yè)面元素以完成UI的集成和開(kāi)發(fā),以使UI原型能夠映射或轉(zhuǎn)化為可運(yùn)行的系統(tǒng)原型,提升系統(tǒng)開(kāi)發(fā)的效率,避免大量的花費(fèi)時(shí)間在UI的集成、維護(hù)上。
          產(chǎn)生的原因
          在傳統(tǒng)的開(kāi)發(fā)過(guò)程中,特別是Web開(kāi)發(fā)過(guò)程中,從UI原型轉(zhuǎn)化為系統(tǒng)原型的過(guò)程總是要耗費(fèi)特別長(zhǎng)的時(shí)間,在系統(tǒng)的整個(gè)開(kāi)發(fā)過(guò)程中通常在UI集成和維護(hù)上往往是耗費(fèi)最長(zhǎng)的時(shí)間,而很多時(shí)候更是由于UI集成了動(dòng)態(tài)性質(zhì)而導(dǎo)致了UI修改、代碼調(diào)試的困難。
          為什么會(huì)出現(xiàn)這樣的現(xiàn)象呢?這樣的現(xiàn)象產(chǎn)生的原因無(wú)非是UI原型和系統(tǒng)原型之間存在的差異造成的,UI原型是一種靜態(tài)原型,系統(tǒng)原型是一種動(dòng)態(tài)原型,在UI原型這種靜態(tài)的原型中只描述了系統(tǒng)的靜態(tài)結(jié)構(gòu)、顯示和行為(html、css、js),而對(duì)于系統(tǒng)原型來(lái)說(shuō)它需要的是一種動(dòng)態(tài)結(jié)構(gòu),這個(gè)時(shí)候要做的無(wú)疑就是怎么樣讓UI原型中的靜態(tài)結(jié)構(gòu)、顯示和行為變?yōu)閯?dòng)態(tài)的,造成這個(gè)的原因主要是因?yàn)閔tml的結(jié)構(gòu)元素是無(wú)法表達(dá)出其動(dòng)態(tài)性質(zhì)的,當(dāng)然,這不能去怪Html,它本來(lái)就只負(fù)責(zé)靜態(tài)的。
          但對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),這個(gè)時(shí)候其實(shí)要做的是就是讓頁(yè)面的元素能夠動(dòng)態(tài)化,界面對(duì)象化就是解決它的一種不錯(cuò)的辦法,對(duì)象化使得界面中的所有元素都可以作為對(duì)象來(lái)看,從OO角度去看,可以得出界面中的任何元素在動(dòng)態(tài)方面擁有兩個(gè)特性,就是動(dòng)態(tài)的結(jié)構(gòu)和動(dòng)態(tài)的行為,動(dòng)態(tài)的結(jié)構(gòu)是指這個(gè)元素將會(huì)改變或增加原有Html界面的結(jié)構(gòu),如一個(gè)用戶(hù)列表的表格,這就是一個(gè)典型的動(dòng)態(tài)結(jié)構(gòu),表格中的結(jié)構(gòu)會(huì)隨著用戶(hù)列表信息的不同而不斷的增加tr/td這樣的結(jié)構(gòu)元素;動(dòng)態(tài)的行為是指界面元素的一種動(dòng)態(tài)交互行為,簡(jiǎn)單的比如在下拉選擇用戶(hù)所在部門(mén)的時(shí)候就是一種下拉的動(dòng)態(tài)交互行為(這個(gè)也可以視為靜態(tài)的),另外一個(gè)更典型的例子是表單提交后與后臺(tái)交互的此種交互行為。
          實(shí)現(xiàn)的方法
          如今Web開(kāi)發(fā)框架都在重視這方面,都在想辦法讓html靜態(tài)過(guò)程轉(zhuǎn)化為動(dòng)態(tài)過(guò)程變得更為簡(jiǎn)單的方法,應(yīng)該說(shuō)象jsf、tapestry這些的東西都在這方面做出了努力,jsf來(lái)說(shuō)視圖更為強(qiáng)調(diào)開(kāi)發(fā)視角,但在UI集成方面仍然是非常麻煩;tapestry來(lái)說(shuō)則表現(xiàn)的更為好一些,它更為注重避免對(duì)于html靜態(tài)結(jié)構(gòu)的侵入。
          為了讓html靜態(tài)結(jié)構(gòu)能表現(xiàn)出動(dòng)態(tài)結(jié)構(gòu)的展現(xiàn)和交互的特性,這個(gè)時(shí)候設(shè)計(jì)模式中的decorator模式就顯得很適合了,要做的無(wú)非就是把一種靜態(tài)的結(jié)構(gòu)重新裝修一把,想想decorator模式,它不會(huì)對(duì)原有的對(duì)象產(chǎn)生什么影響,而同時(shí)又可表達(dá)出更為豐富的行為。
          既然是decorator,那么實(shí)現(xiàn)界面對(duì)象化的方法也就浮現(xiàn)出來(lái)了,在采用界面對(duì)象化的思想上,界面所有元素都可以視為對(duì)象,只是這些對(duì)象又有可能是由其他的對(duì)象組合而成,如table是一個(gè)對(duì)象,其中的tr、td也是對(duì)象,這個(gè)在js中深有體現(xiàn)。
          界面的結(jié)構(gòu)、顯示以及行為分離的方式無(wú)疑是非常值得學(xué)習(xí)的,在描述一個(gè)界面對(duì)象的動(dòng)態(tài)特性的時(shí)候這點(diǎn)也是同樣需要保持的,界面對(duì)象的動(dòng)態(tài)特性主要就是動(dòng)態(tài)結(jié)構(gòu)和動(dòng)態(tài)行為,對(duì)于動(dòng)態(tài)結(jié)構(gòu)可以采用類(lèi)加模板的方式來(lái)實(shí)現(xiàn),而對(duì)于動(dòng)態(tài)行為在現(xiàn)在我們則可以采用js來(lái)完全達(dá)成(前臺(tái)交互js本來(lái)就可做到,后臺(tái)交互則可通過(guò)ajax的方式來(lái)實(shí)現(xiàn))。
          說(shuō)的可能不是很清楚,舉例如下:
          如一個(gè)用戶(hù)的列表的html可能是這樣:
          <table id="userstable">
          </table>
          在真實(shí)的系統(tǒng)中這個(gè)部分必然是動(dòng)態(tài)的展現(xiàn),需要改變?cè)械慕Y(jié)構(gòu),這個(gè)時(shí)候采用界面對(duì)象化的方法我們可以這么去做:
          在一個(gè)獨(dú)立的xml文件中進(jìn)行這樣的描述:
          <element id="userstable"
                         bindhql="from User u where u.id desc"
                         showstyle="userstablestyle"/>
          <component id="userstablestyle"
                              ref-component="table"
                              showcolumns="user.id=序號(hào);user.name=用戶(hù)名"/>
          這是動(dòng)態(tài)結(jié)構(gòu)的實(shí)現(xiàn)方法的一個(gè)示例,可以看到在這樣的情況下對(duì)原有的html是沒(méi)有任何的侵入的。
          再舉一個(gè)動(dòng)態(tài)行為的例子:
          如一個(gè)新增用戶(hù)表單中有一個(gè)保存的按鈕,需要提交到后臺(tái)執(zhí)行動(dòng)作,并根據(jù)動(dòng)作執(zhí)行的結(jié)果來(lái)控制頁(yè)面的流轉(zhuǎn),html中可能是這樣:
          <button id="saveBtn" name="saveBtn" value="保存">
          同樣的,在一個(gè)獨(dú)立的xml中進(jìn)行這樣的描述:
          <element id="saveBtn"
                         actionType="pageflow"
                         action="saveUser"/>
          <action id="saveUser"
                      ref-action="DataSave">
                <result name="success">userstable</result>
                <result name="error">saveusererror</result>
          </action>
          這樣就完成了將html中靜態(tài)元素decorator成一種具備動(dòng)態(tài)特性的元素的過(guò)程。
          界面對(duì)象化后界面組件化自然也就可以形成了,也就是如今流行的UI Component,在這樣的一種實(shí)現(xiàn)方法下我們甚至可以想象在UI進(jìn)行大變動(dòng)的情況下根據(jù)無(wú)需開(kāi)發(fā)人員做任何改動(dòng)系統(tǒng)就仍然可以運(yùn)轉(zhuǎn),這必然會(huì)大大的減少UI集成和維護(hù)的工作量;但UI Component在目前也是會(huì)帶來(lái)一些問(wèn)題的,就是在如今很容易將UI設(shè)計(jì)圖轉(zhuǎn)為html的情況下,反而因?yàn)槭褂昧薝I Component造成了很難達(dá)到UI設(shè)計(jì)的效果,就像是CS結(jié)構(gòu)一樣,CS結(jié)構(gòu)中的元素為了做到和UI設(shè)計(jì)一樣的效果無(wú)疑是要付出很大的努力的,不過(guò)在web上的UI Component還是比CS占有更多的優(yōu)勢(shì),因?yàn)樗梢酝ㄟ^(guò)css來(lái)控制顯示,仍然看好Web的開(kāi)發(fā)方式,雖然Web的交互方式現(xiàn)在離cs的交互方式還有一定的差距,但就顯示效果來(lái)講Web是更容易做的比cs結(jié)構(gòu)好的。

          posted on 2006-01-26 11:59 BlueDavy 閱讀(2098) 評(píng)論(9)  編輯  收藏 所屬分類(lèi): 系統(tǒng)設(shè)計(jì)

          評(píng)論

          # re: 界面對(duì)象化 2006-02-06 14:31 Vincent Thinking

          在家還不忘工作。呵呵。

          你說(shuō)這些正是我們產(chǎn)品中正在做的部分,UI部分都是用xml描述,widget綁定action  回復(fù)  更多評(píng)論   

          # re: 界面對(duì)象化 2006-02-06 20:10 BlueDavy

          暈,這篇是26號(hào)寫(xiě)的..
          哦?已經(jīng)實(shí)現(xiàn)了嗎?  回復(fù)  更多評(píng)論   

          # re: 界面對(duì)象化 2006-02-07 09:30 Vincent Thinking

          基本上實(shí)現(xiàn)了,不過(guò)還不完善。^_^UI 基本上都是配置的。
          一個(gè)table的描述類(lèi)似這樣:
          <display>
          <headings>
          <heading seq="1" content="id" width="20" display="false"/>
          <heading seq="2" content="訂單編號(hào)" width="20" link="form://pchsOrder/edit?identity=:1"/>
          <heading seq="3" content="訂單日期" width="20"/>
          <heading seq="4" content="供應(yīng)商" width="40" link="form://pchsOrder?identity=:1"/>
          <heading seq="5" content="單據(jù)狀態(tài)" width="10"/>
          </headings>
          <columns>
          <column seq="1" format="String" dataindex="1"/>
          <column seq="2" format="String" dataindex="2"/>
          <column seq="3" format="Date" dataindex="3"/>
          <column seq="4" format="String" dataindex="4"/>
          <column seq="5" format="String" dataindex="5"/>
          </columns>
          <actions>
          <action name="edit" form="pchsOrder" text="Edit">
          <parameter name="identity" index="1"/>
          </action>
          <action name="delete" form="pchsOrder" service="removePchsOrder" text="Delete">
          <parameter name="identity" index="1"/>
          </action>
          </actions>
          </display>  回復(fù)  更多評(píng)論   

          # re: 界面對(duì)象化 2006-02-07 09:39 BlueDavy

          恩,不錯(cuò),不過(guò)我覺(jué)得還是沒(méi)有做到我期望中的..
          我覺(jué)得其實(shí)界面本來(lái)就是對(duì)象化,我們之所以要改變它只是因?yàn)樗鼰o(wú)法滿(mǎn)足動(dòng)態(tài)的實(shí)現(xiàn),典型的decorator,也就是說(shuō)我們只需要對(duì)界面元素進(jìn)行一個(gè)再次描述就完成,可以在描述中很容易看出對(duì)界面元素的一個(gè)修飾,也就是在描述中可以清晰的看到module---object這樣的模式..
          ^_^,以上純屬OO理論描述而已,其實(shí)只要能實(shí)現(xiàn)就行,不一定要這么做

          其實(shí)界面對(duì)象化只是部分完成快速開(kāi)發(fā)的目的,最重要的仍然是是界面與后臺(tái)進(jìn)行交互時(shí)的自動(dòng)處理(如數(shù)據(jù)的自動(dòng)綁定、數(shù)據(jù)的自動(dòng)維護(hù)等),在這塊無(wú)需編碼是很重要的,提供一種類(lèi)似腳本來(lái)控制業(yè)務(wù)邏輯和持久邏輯的方式。  回復(fù)  更多評(píng)論   

          # re: 界面對(duì)象化 2006-02-14 13:04 fxb248

          請(qǐng)問(wèn)你這里的html代碼和xml描述是怎么結(jié)合起來(lái)的,能不能提供一個(gè)小例子?否則看的不是很明白.  回復(fù)  更多評(píng)論   

          # re: 界面對(duì)象化 2006-02-14 22:15 BlueDavy

          比如用戶(hù)管理的界面的htm界面url為usermanage.htm,其中有用戶(hù)管理表格(table id="usertable")和新增用戶(hù)的按鈕(button id="addnewuser"),那么描述的xml就類(lèi)似這樣:
          <page id="usermanage" url="usermanage.htm">
          <element id="usertable">
          <bind type="datasetcomponent">
          <value>UserTableComponent</value>
          </bind>
          </element>
          <element id="addnewuser">
          <bind type="linkaction">
          <value>AddDataset</value>
          </bind>
          </element>
          </page>
          其中的UserTableComponent是由用戶(hù)自定義的一個(gè)用戶(hù)表格的組件,是通過(guò)框架的管理端來(lái)配置,其實(shí)主要就是配置這個(gè)組件綁定的數(shù)據(jù)集、組件的顯示方式以及組件的操作方式(如支持新增、分頁(yè))等;linkaction則是指該按鈕對(duì)應(yīng)的動(dòng)作...
          之后就可以通過(guò)page?id=usermanage來(lái)訪(fǎng)問(wèn),這樣就完成了將一個(gè)靜態(tài)的htm渲染成為動(dòng)態(tài)頁(yè)面的過(guò)程,對(duì)htm沒(méi)有任何的侵入。  回復(fù)  更多評(píng)論   

          # re: 界面對(duì)象化 2006-02-15 14:21 Vincent Thinking

          ui component bind dataset, button bind action,這些不管是配置還是實(shí)現(xiàn)都不是特別復(fù)雜,困難的是一些特殊的布局,比如多層嵌套,組件之間的action關(guān)聯(lián),這些是比較難處理的  回復(fù)  更多評(píng)論   

          # re: 界面對(duì)象化 2006-02-15 20:11 BlueDavy

          ^_^,多層嵌套的動(dòng)態(tài)形式的布局是比較難實(shí)現(xiàn)的,不過(guò)由于界面中所有的部分都可以視為元素,而元素本身也是可以綁定元素的,所以這點(diǎn)在實(shí)現(xiàn)上還是可以的,也就是說(shuō)通過(guò)對(duì)動(dòng)態(tài)的元素的一個(gè)同樣的描述..
          組件之間的action關(guān)聯(lián)這個(gè)處理倒不是非常麻煩,一方面可以用link target=元素的方式,另一方面則是pageflow的方式等  回復(fù)  更多評(píng)論   

          # re: 界面對(duì)象化 2006-03-14 09:59 li

          關(guān)注中,給個(gè)例例吧!!!!!!!!  回復(fù)  更多評(píng)論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

          <2006年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627281234
          567891011

          統(tǒng)計(jì)

          隨筆分類(lèi)

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 林西县| 通州市| 什邡市| 三江| 定兴县| 滨州市| 九寨沟县| 酉阳| 乡宁县| 阿拉善盟| 东海县| 大安市| 宜阳县| 扬州市| 淄博市| 莱西市| 延寿县| 五家渠市| 宿迁市| 阳泉市| 奎屯市| 广元市| 金门县| 邯郸县| 鹤壁市| 乐清市| 镇原县| 拜泉县| 贺州市| 卫辉市| 墨竹工卡县| 金湖县| 黔江区| 两当县| 保德县| 扎赉特旗| 东台市| 惠安县| 虹口区| 淮安市| 泰州市|