10.第六章 總結(jié)與展望
第六章總結(jié)與展望
第六章總結(jié)與展望
6.1對(duì)電子現(xiàn)金的總結(jié)
電子現(xiàn)金技術(shù)作為電子支付中最具潛力的技術(shù)之一,在隨著網(wǎng)絡(luò)普及和計(jì)算機(jī)、網(wǎng)絡(luò)通信技術(shù)的迅速發(fā)展,以Internet為基礎(chǔ)的電子商務(wù)在全球范圍內(nèi)普及和迅速發(fā)展,與之相適應(yīng)的電子支付系統(tǒng)成為產(chǎn)業(yè)界和學(xué)術(shù)界共同關(guān)注的熱點(diǎn)。電子支付的安全性影響著電子商務(wù)的普及和發(fā)展,電子支付技術(shù)實(shí)用化,必須把安全和效率結(jié)合起來(lái)。它具有與現(xiàn)實(shí)物理貨幣相似的特性,具有信用卡和電子支票無(wú)法具有的性能。
本文主要研究了有關(guān)電子現(xiàn)金的一些重要理論和關(guān)鍵技術(shù)問(wèn)題,包括:1.論述了密碼學(xué)基礎(chǔ)的概念和理論,進(jìn)而選擇了一種基于RSA公鑰加密算法作為本設(shè)計(jì)的基本算法。
2.討論了電子現(xiàn)金的安全性問(wèn)題,并基于公鑰密碼體制原理,構(gòu)造了一個(gè)電子現(xiàn)金方案。
3.討論了數(shù)字簽名技術(shù)原理及其應(yīng)用,重點(diǎn)是在電子現(xiàn)金中RSA數(shù)字簽名的應(yīng)用,為電子現(xiàn)金的成功運(yùn)作提供了保障。
4.針對(duì)本設(shè)計(jì)中一些不完善的地方進(jìn)行了論述,在以后的學(xué)習(xí)和生活中盡量去完善。
但是對(duì)于電子現(xiàn)金的應(yīng)用方面,還有些不很樂(lè)觀。原因是:(1)只有少數(shù)商家接受電子現(xiàn)金,而且只有少數(shù)幾家銀行提供電子現(xiàn)金開(kāi)戶服務(wù);(2)成本較高,電子現(xiàn)金對(duì)于硬件和軟件的技術(shù)要求都較高;(3)存在貨幣兌換問(wèn)題;(4)風(fēng)險(xiǎn)較大。
6.2對(duì)電子現(xiàn)金的展望
6.2.1電子現(xiàn)金的傳遞性的可用性研究
傳遞性是物理現(xiàn)金一個(gè)基本的特征,但在電子現(xiàn)金中還沒(méi)有應(yīng)用,最主要的原因是:電子現(xiàn)金中為了能跟蹤重復(fù)花費(fèi)的用戶,在電子現(xiàn)金中加入了盲化的用戶身份信息,在電子現(xiàn)金流動(dòng)的過(guò)程中將加入使用過(guò)該電子現(xiàn)金的所有用
第六章總結(jié)與展望
戶身份信息,因此根據(jù)信息論的理論,電子現(xiàn)金的長(zhǎng)度是不斷地增長(zhǎng)的,每次交易都將造成大通信量問(wèn)題,無(wú)法用于實(shí)際應(yīng)用;另外電子現(xiàn)金無(wú)論是在構(gòu)造還是存款過(guò)程中,相對(duì)于物理現(xiàn)金都是相當(dāng)容易而有效的。
因此電子現(xiàn)金的傳遞性還有待于進(jìn)一步研究。
6.2.2多銀行電子現(xiàn)金的研究
現(xiàn)有的電子現(xiàn)金方案都是由一個(gè)銀行發(fā)行的,但在現(xiàn)實(shí)生活中由多個(gè)電子銀行系統(tǒng)發(fā)行的電子現(xiàn)金較之單個(gè)銀行發(fā)行的電子現(xiàn)金是更適合的,因?yàn)樵谝粋(gè)國(guó)家或地區(qū)具有電子現(xiàn)金發(fā)行能力的銀行可能不止一家。這多個(gè)銀行形成一個(gè)群體,它們受國(guó)家的中央銀行管理,每個(gè)銀行都可以發(fā)行電子現(xiàn)金。
所以由多個(gè)銀行發(fā)行的公平電子現(xiàn)金模型是電子現(xiàn)金系統(tǒng)研究的重要方向。
6.2.3可分電子現(xiàn)金系統(tǒng)的研究
可分電子現(xiàn)金系統(tǒng)能夠讓用戶進(jìn)行多次合法的精確支付,減少提款次數(shù),從而可以降低網(wǎng)絡(luò)通信量,提高系統(tǒng)效率,因此可分的電子現(xiàn)金系統(tǒng)是研究的重點(diǎn)。Okamoto和Ohta于1991年首次提出了一個(gè)可分電子現(xiàn)金系統(tǒng),該系統(tǒng)允許用戶將電子現(xiàn)金分成任意金額進(jìn)行多次支付,直到與該電子現(xiàn)金的總額相等為止。為使銀行能夠有效地檢測(cè)用戶的重復(fù)支付,他們采用了二叉樹(shù)技術(shù)對(duì)電子現(xiàn)金進(jìn)行表示,但這種技術(shù)導(dǎo)致電子現(xiàn)金的支付協(xié)議通信量大、計(jì)算復(fù)雜度高、效率低,盡管許多學(xué)者對(duì)該方案從不同的角度提出了改進(jìn),但都由于使用二叉樹(shù)表示使得支付協(xié)議的執(zhí)行效率仍然很低。
因此,到目前為止,可分電子現(xiàn)金系統(tǒng)依然是不實(shí)用的。關(guān)于這方面研究,還可以引入可信第三方來(lái)實(shí)現(xiàn)對(duì)超額支付者的識(shí)別,使電子現(xiàn)金的支付協(xié)議中沒(méi)必要包含進(jìn)行重復(fù)支付檢查的信息,這樣就可以放棄可分電子現(xiàn)金的二叉樹(shù)表示技術(shù),從而構(gòu)造更簡(jiǎn)單的可分電子現(xiàn)金系統(tǒng)。
今后為了設(shè)計(jì)更安全有效的包括電子現(xiàn)金在內(nèi)的電子支付協(xié)議,應(yīng)該加強(qiáng)針對(duì)實(shí)際應(yīng)用環(huán)境的公鑰密碼的設(shè)計(jì),研究包括算法優(yōu)化和軟硬件快速實(shí)現(xiàn)的公鑰密碼技術(shù)、設(shè)計(jì)新型分組密碼、研究分組密碼的軟硬件快速實(shí)現(xiàn)和專用芯
第六章總結(jié)與展望
片以及設(shè)計(jì)一些與商用的具體應(yīng)用環(huán)境密切相關(guān)的特殊數(shù)字簽名,比如盲簽名、代理簽名、群簽名、具有消息恢復(fù)功能的簽名等。這些密碼的基礎(chǔ)性工作,對(duì)于包括電子現(xiàn)金在內(nèi)的電子支付技術(shù)的發(fā)展是非常必要的。
擴(kuò)展閱讀:總結(jié)與展望
第五章系統(tǒng)測(cè)試與分析
一、軟件測(cè)試
經(jīng)過(guò)需求分析、設(shè)計(jì)和編碼等階段的開(kāi)發(fā)后,得到了源程序,開(kāi)始進(jìn)入到軟件測(cè)試階段。然而,在測(cè)試之前的各階段中都可能在軟件產(chǎn)品中遺留下許多錯(cuò)誤和缺陷,如果不及時(shí)找出這些錯(cuò)誤和缺陷,并將其改正,這個(gè)軟件產(chǎn)品就不能正常使用,甚至?xí)䦟?dǎo)致巨大的損失。目前,程序的正確性證明尚未得到根本的解決,因此軟件測(cè)試仍是發(fā)現(xiàn)軟件中錯(cuò)誤和缺陷的主要手段。
系統(tǒng)整體測(cè)試步驟:1、單元測(cè)試
單元測(cè)試是整體測(cè)試中的第一步,通常在編碼階段進(jìn)行。在源程序代碼經(jīng)過(guò)編譯、評(píng)審、確認(rèn)沒(méi)有語(yǔ)法錯(cuò)誤之后,便可開(kāi)始進(jìn)行單元測(cè)試。
2、集成測(cè)試
集成測(cè)試在單元測(cè)試完成之后,將所有的模塊概要設(shè)計(jì)要求組裝成系統(tǒng)時(shí)進(jìn)行的測(cè)試,
主要目標(biāo)是發(fā)現(xiàn)與接口有關(guān)的問(wèn)題。3、確認(rèn)測(cè)試
經(jīng)過(guò)集成測(cè)試之后,接口錯(cuò)誤已經(jīng)發(fā)現(xiàn)被發(fā)現(xiàn)并改正了,接下便要進(jìn)行確認(rèn)測(cè)試。所謂確認(rèn)測(cè)試就是驗(yàn)證所開(kāi)發(fā)軟件的功能性及其他特性是否符合軟件需求規(guī)格說(shuō)明書(shū)的要求。所以,確認(rèn)測(cè)試又被稱為有效性測(cè)試。
4、系統(tǒng)測(cè)試
系統(tǒng)測(cè)試是更大范圍內(nèi)進(jìn)行測(cè)試,它將經(jīng)過(guò)確認(rèn)測(cè)試的軟件作為整個(gè)基于計(jì)算機(jī)的系統(tǒng)的一個(gè)元素,在實(shí)際運(yùn)行環(huán)境下,對(duì)系統(tǒng)進(jìn)行的一系列集成和確認(rèn)測(cè)試。
二、微博系統(tǒng)測(cè)試(一)注冊(cè)頁(yè)面的錯(cuò)誤提醒和提交注冊(cè)信息測(cè)試
反復(fù)點(diǎn)擊注冊(cè)頁(yè)面的輸入框,檢測(cè)其失焦提醒錯(cuò)誤的JS事件是否會(huì)失效。然后再分別依“”次增多地填入用戶名、密碼等,點(diǎn)立即注冊(cè)按鈕,看其是否提醒缺失的必填選項(xiàng)。接著,再新建一個(gè)合法賬戶,然后重新注冊(cè)個(gè)與其名字相同的賬戶,看系統(tǒng)是否提醒,并且不為其添加記錄。經(jīng)過(guò)以上反復(fù)測(cè)試,該模塊測(cè)試成功。
(二)登錄功能及模塊進(jìn)入身份限制的測(cè)試
使用建好的賬戶不停登錄退出系統(tǒng),檢測(cè)系統(tǒng)存儲(chǔ)的用戶信息是否變化。然后檢測(cè),不同身份的用戶是否能進(jìn)到其身份不符合的模塊。經(jīng)過(guò)以上反復(fù)測(cè)試,該模塊測(cè)試成功。
(三)輸入模塊的測(cè)試
對(duì)于微博的發(fā)布各項(xiàng)比如表情,圖片,音頻等反復(fù)地測(cè)試,使用它們發(fā)送是否正常。經(jīng)過(guò)以上反復(fù)測(cè)試,該模塊測(cè)試成功。
(四)我的首頁(yè)模塊的測(cè)試
對(duì)于登錄成功的用戶跳轉(zhuǎn)到用戶自己的微博首頁(yè),會(huì)顯示校園即時(shí)微博信息,并且首頁(yè)鏈接到各項(xiàng)功能模塊,并且可以發(fā)布微博。測(cè)試各個(gè)功能模塊是否正常,若有問(wèn)題,馬上修改。經(jīng)過(guò)以上反復(fù)測(cè)試,該模塊測(cè)試成功。
(五)@提到我的模塊的測(cè)試
當(dāng)別人發(fā)布的微博或者轉(zhuǎn)的微博含有@用戶名的信息,那么會(huì)給被@的用戶即時(shí)消息提醒,檢查此功能是否正常,如果沒(méi)有差錯(cuò)則測(cè)試成功。經(jīng)過(guò)以上反復(fù)測(cè)試,該模塊測(cè)試成功。
(六)微博正文模塊,包括轉(zhuǎn)發(fā)、收藏、評(píng)論的測(cè)試
是否可以正常轉(zhuǎn)發(fā)、收藏、評(píng)論別人的微博,檢查功能是否正常,如果沒(méi)有差錯(cuò)則測(cè)試成功。經(jīng)過(guò)反復(fù)測(cè)試,該模塊測(cè)試成功。第六章總結(jié)與展望二、總結(jié)
(一)、學(xué)習(xí)
通過(guò)這次的畢業(yè)設(shè)計(jì),我主要是學(xué)習(xí)到了如何使用ROR進(jìn)行WEB開(kāi)發(fā),如何靈活使用CSS寫(xiě)出想要的頁(yè)面樣式,同時(shí)也學(xué)習(xí)了軟件工程以及數(shù)據(jù)庫(kù)方面的知識(shí)。
在整個(gè)系統(tǒng)的開(kāi)發(fā)中,遇到了很多的難題,比如如何正確的去統(tǒng)計(jì)轉(zhuǎn)發(fā)數(shù)量以及評(píng)論數(shù)量等。經(jīng)過(guò)幾次的修改以及借鑒Sina微博的做法,才得以初步解決。也讓我對(duì)權(quán)限和授權(quán)的知識(shí)的認(rèn)識(shí)更進(jìn)了一步。而且自己學(xué)習(xí)使用PHOTOSHOP等工具,也是為了配合CSS讓自己的系統(tǒng)頁(yè)面更好看,有一個(gè)好的視覺(jué)效果,也是花了很長(zhǎng)的時(shí)間。對(duì)UI設(shè)計(jì)也更有了解了。
(二)、反思
當(dāng)然,由于各方面知識(shí)的不專業(yè),這樣的一個(gè)系統(tǒng)還不夠成熟。而且許多當(dāng)初的設(shè)計(jì)的功能最后因?yàn)楦鞣N原因也未能加入。系統(tǒng)在一開(kāi)始編寫(xiě)時(shí)未能給那些功能預(yù)留擴(kuò)展,這是我在詳細(xì)設(shè)計(jì)時(shí)候未設(shè)計(jì)完善所導(dǎo)致的,是一個(gè)很好的經(jīng)驗(yàn)教訓(xùn)。希望以后自己有更好的設(shè)計(jì)。
一、展望
通過(guò)這一次畢業(yè)設(shè)計(jì),使我認(rèn)識(shí)到自己在計(jì)算機(jī)領(lǐng)域所擅長(zhǎng)的以及所需要彌補(bǔ)的是什么。我喜歡著眼于一個(gè)軟件產(chǎn)品的UI,自己會(huì)學(xué)習(xí)各種相關(guān)的知識(shí)來(lái)完成一個(gè)自己設(shè)計(jì)的UI。而且CSS也是我自己擅長(zhǎng)的。以后我會(huì)更努力學(xué)習(xí)關(guān)于產(chǎn)品UI的專業(yè)的知識(shí),以從事于相關(guān)職業(yè),更好的做好產(chǎn)品的圖形界面設(shè)計(jì)。參考文獻(xiàn)
[1]、DaveThomas,DavidHansson等.應(yīng)用Rails進(jìn)行敏捷Web開(kāi)發(fā).電子工業(yè)出版社.201*.
[2]、裴有福.Web技術(shù)大全.中國(guó)水利水電出版社.1998[3]、百度知道.
[4]、BaronSchwartz、PeterZaitsev、VadimTkachenko、Jeremy.高性能MySQL(第2版).電子工業(yè)出版社:201*
[5]、賈錚等.HTML+CSS網(wǎng)頁(yè)布局開(kāi)發(fā)指南.清華大學(xué)出版社.201*[6]、鄧蔚等.編程紅寶書(shū):Ruby完全自學(xué)手冊(cè).機(jī)械工業(yè)出版社.201*[7]、柳靖等.RubyonRails快速Web應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)[M].電子工業(yè)出版社.201*
[8]、〔美〕杰克戴維斯.ThePhotoshopWow!Book.201*.致謝
經(jīng)過(guò)一個(gè)學(xué)期的努力,畢業(yè)設(shè)計(jì)系統(tǒng)的開(kāi)發(fā)暫時(shí)告一段落了。這次畢業(yè)設(shè)計(jì),讓我充分的把這幾年所學(xué)到的專業(yè)知識(shí)融會(huì)貫通,從做需求分析、設(shè)計(jì)數(shù)據(jù)庫(kù)、到系統(tǒng)整體設(shè)計(jì)和具體的代碼實(shí)現(xiàn)。整個(gè)設(shè)計(jì),讓我學(xué)到了許多以前在課堂上面學(xué)不到的知識(shí),很大程度的加強(qiáng)了自己的實(shí)踐能力。在此,感謝我的指導(dǎo)老師許精明老師的指導(dǎo)和督促,在整個(gè)的開(kāi)發(fā)步驟上,老師給我們列出了詳細(xì)的任務(wù)工作計(jì)劃,使我們?cè)陂_(kāi)發(fā)進(jìn)程上,不致于茫然。在設(shè)計(jì)思路和系統(tǒng)功能結(jié)構(gòu)方面,老師給我們提出了許多寶貴的意見(jiàn),同時(shí)不斷地給我們提出更高的要求。另外,感謝在我的畢業(yè)設(shè)計(jì)過(guò)程中給過(guò)我?guī)椭乃型瑢W(xué),是大家的幫助才得以完成我的這個(gè)系統(tǒng)。
同時(shí)在設(shè)計(jì)過(guò)程中,我也發(fā)現(xiàn)了自己的不足,因?yàn)槭鞘状芜M(jìn)行這樣的課題開(kāi)發(fā),在代碼的實(shí)現(xiàn)上略現(xiàn)笨拙,整個(gè)程序在架構(gòu)上也算不上完美,以致予一些最初設(shè)計(jì)的功能最終并未實(shí)現(xiàn),但我相信通過(guò)今后的學(xué)習(xí)和實(shí)踐,自己在開(kāi)發(fā)能力一定能夠得到大大的提高。
最后衷心感謝四年來(lái)辛勤教育我們的老師,感謝朝暮相處的同學(xué)以及在畢業(yè)設(shè)計(jì)中被我引用或參考的論著的作者,并向參與此次答辯的老師致以深深的謝意!
附錄二附錄文獻(xiàn)翻譯
模型、視圖和控制器Rails應(yīng)用的架構(gòu)
Rails應(yīng)用的一個(gè)有趣特性是它在如何組織web應(yīng)用上強(qiáng)制推行一些嚴(yán)格的限制。令人驚訝的是,這些限制讓創(chuàng)建應(yīng)用變得方便,而且不止一點(diǎn)的方便。讓我們來(lái)看看是為什么。
3.1模型、視圖和控制器
讓我們回到1971年,TrygveReenskaug為開(kāi)發(fā)交互應(yīng)用創(chuàng)造了一種新架構(gòu)。在他的設(shè)計(jì)中,應(yīng)用被分解為三種組件:模型、視圖和控制器。
模型負(fù)責(zé)保存應(yīng)用的狀態(tài),有時(shí)狀態(tài)是臨時(shí)的,僅與用戶交互時(shí)存在,有的狀態(tài)是持久的,通常被保存在應(yīng)用之外的數(shù)據(jù)庫(kù)中。
但模型不僅僅只是數(shù)據(jù),它實(shí)施與數(shù)據(jù)有關(guān)的所有業(yè)務(wù)邏輯。舉例來(lái)說(shuō),如果一個(gè)賬戶不應(yīng)被用于一個(gè)小于20美元的訂單額度,模型將為賬戶施加該約束。這就是意義所在。通過(guò)在模型中制約業(yè)務(wù)邏輯規(guī)則,我們可以確保沒(méi)有任何其他東西會(huì)影響數(shù)據(jù)的穩(wěn)定性。模型同時(shí)作為數(shù)據(jù)庫(kù)和看守者而存在。
視圖負(fù)責(zé)更新用戶界面。通常它基于模型中的數(shù)據(jù)。舉例來(lái)說(shuō),某在線商店有個(gè)產(chǎn)品目錄要呈現(xiàn)給用戶,該目錄可通過(guò)模型得到。但取得目錄并以一定格式呈獻(xiàn)給最終用戶的卻是視圖,盡管視圖可能為用戶提供多種輸入數(shù)據(jù)的方法,但它本身并不管理這些輸入的數(shù)據(jù)。當(dāng)數(shù)據(jù)呈現(xiàn)給用戶以后,視圖的工作就完成了?赡軙(huì)有許多視圖共享同一數(shù)據(jù)模型。在網(wǎng)絡(luò)商店案例中,一些視圖負(fù)責(zé)呈現(xiàn)商品目錄信息,而另一些視圖用于管理員增加或修改商品信息。
控制器負(fù)責(zé)協(xié)調(diào)整個(gè)應(yīng)用。它從外部世界(通常是用戶輸入)接收事件,與模型交互,并給用戶呈現(xiàn)相應(yīng)視圖。
這三者模型、視圖與控制器都是從我們熟知的MVC框架中來(lái)的,要知道這三者是如何協(xié)同運(yùn)作的,請(qǐng)看圖3-1。
MVC最初的設(shè)想是將其用于傳統(tǒng)的GUI應(yīng)用,開(kāi)發(fā)者們希望可以分離它們各自的表示,從而使維護(hù)和編寫(xiě)代碼變得更容易。
每個(gè)概念或行為都可以在MVC框架中呈現(xiàn),使用MVC就像在已放置好大梁的基礎(chǔ)上建造摩天大樓,有了它,構(gòu)建其他部分就變得更容易了。在開(kāi)發(fā)應(yīng)用的過(guò)程中,我們將盡量使用Rails為構(gòu)建應(yīng)用的搭腳手架的能力。
ROR也是個(gè)MVC框架,Rails為你的應(yīng)用實(shí)施一個(gè)框架開(kāi)發(fā)模型、視圖及控制器。作為分離的功能區(qū),并且在程序運(yùn)行時(shí)將它們聯(lián)接在一起。使用Rails的一個(gè)樂(lè)趣是這個(gè)聯(lián)接過(guò)程基于一個(gè)智能的框架。因此你不用去寫(xiě)任何外部配置就可以讓它們運(yùn)作。這是Rails“習(xí)慣優(yōu)于配置”哲學(xué)的一個(gè)體現(xiàn)。
在Rails應(yīng)用中,送進(jìn)來(lái)的請(qǐng)求最先傳遞給Router,Router用于發(fā)送和解析請(qǐng)求,最終,會(huì)在控制器的某段代碼中標(biāo)識(shí)一個(gè)特定的方法(該方法在Rails中被稱為Action行為)。該行為會(huì)在請(qǐng)求中查看數(shù)據(jù),還可能與模型交互,也可能使其他行為被喚醒。最終,該行為為視圖準(zhǔn)備需要提交給用戶的信息。
Rails如圖3-2那樣處理請(qǐng)求,在本例中,應(yīng)用開(kāi)始時(shí)呈現(xiàn)商品目錄頁(yè)面,用戶只需點(diǎn)擊位于商品旁邊的[AddtoCart]按鈕,該按鈕傳遞信息給
:3000/line_items?
product_id=2,其中l(wèi)ine_items是我們應(yīng)用中的一個(gè)資源,2是我們已選商品的內(nèi)部ID。
路徑組件接收到送來(lái)的請(qǐng)求,并很快將其分解。該請(qǐng)求包含一個(gè)路徑(/line_items?product_id=2)以及一個(gè)方法(該按鈕執(zhí)行POST方法,其他常見(jiàn)方法還有PUT和DELETE)。在這個(gè)簡(jiǎn)單例子中,Rails取得了路徑的第一部分line_items作為控制器名稱,以及product_id作為商品編號(hào)。按照慣例,POST方法與創(chuàng)建動(dòng)作相關(guān)聯(lián)。(我們將在267頁(yè)談到命名慣例問(wèn)題)
Create方法用于處理用戶請(qǐng)求。在本例中,該方法找到目前用戶的購(gòu)物車,購(gòu)物車是由模型控制的一個(gè)對(duì)象,接著它也要同時(shí)要求模型找到商品2的相關(guān)信息。然后該方法告訴購(gòu)物車自己添加商品2的信息(看到模型是如何被用于保存所有交易信息了嗎?控制器告訴應(yīng)用去做什么,模型知道該如何去做)。
現(xiàn)在購(gòu)物車已將新商品包含在內(nèi),我們可以讓用戶看看它了?刂破鲉拘岩晥D代碼,但在此之前,它已為視圖從模型中讀取購(gòu)物車對(duì)象做好了準(zhǔn)備。在Rails中,這個(gè)約定通常是隱性的,又一次,是約定幫我們?cè)谝晥D和控制器間建立聯(lián)接。
對(duì)于一個(gè)MVCweb應(yīng)用來(lái)說(shuō),這已經(jīng)夠用了。通過(guò)跟隨約定和合理劃分功能區(qū),你將發(fā)現(xiàn)代碼變得易于擴(kuò)展和維護(hù),看起來(lái)是筆劃算的交易不是嗎?如果MVC只是簡(jiǎn)單將你的代碼劃分為適當(dāng)功能區(qū),你可能會(huì)奇怪為何還需要ROR這么一個(gè)框架,答案很簡(jiǎn)單:Rails為你包攬了所有瑣碎的家務(wù)活兒,那些將占用你大量時(shí)間的惱人細(xì)節(jié),使你將注意力集中在應(yīng)用的核心功能上。讓我們來(lái)看看Rails是如何做到這點(diǎn)的。
3.2Rails支持模型
總的來(lái)說(shuō),我們希望在關(guān)系數(shù)據(jù)庫(kù)上保存應(yīng)用的信息。訂單實(shí)體系統(tǒng)將在數(shù)據(jù)庫(kù)表中保存訂單,在線商品及用戶細(xì)節(jié)。甚至那些通常使用非結(jié)構(gòu)化文本的應(yīng)用,如weblog及一些新聞?wù)军c(diǎn),都會(huì)使用數(shù)據(jù)庫(kù)作為它們的后臺(tái)存儲(chǔ)工具。
盡管一兩句話無(wú)法說(shuō)明操作數(shù)據(jù)庫(kù)的SQL(結(jié)構(gòu)化查詢語(yǔ)言),關(guān)系數(shù)據(jù)庫(kù)實(shí)際上是基于數(shù)據(jù)集理論被設(shè)計(jì)而成。理論上講這設(shè)計(jì)沒(méi)什么問(wèn)題,但它很難與面向?qū)ο笳Z(yǔ)言結(jié)合在一起。對(duì)象是關(guān)于數(shù)據(jù)和操作的,數(shù)據(jù)庫(kù)關(guān)于值的集合。在OO系統(tǒng)中,難以用代碼表達(dá)的操作可以在數(shù)據(jù)庫(kù)中輕松實(shí)現(xiàn),反之,難以用關(guān)系數(shù)據(jù)庫(kù)實(shí)現(xiàn)的,可以用代碼表達(dá)。
隨著時(shí)間推移,人們發(fā)明了多種方法來(lái)整合這兩種途徑,來(lái)共同呈現(xiàn)數(shù)據(jù)。讓我們看看Rails采用了那種方法將關(guān)系數(shù)據(jù)庫(kù)映射到對(duì)象上面。
對(duì)象關(guān)系映射
ORM庫(kù)將數(shù)據(jù)庫(kù)表映射為各種類,如果數(shù)據(jù)庫(kù)中有名為orders的表,我們的程序就會(huì)有個(gè)Order類,表中的行與該類的對(duì)象關(guān)聯(lián),一個(gè)特定的訂單表示Order類中的某個(gè)對(duì)象。在該對(duì)象中,屬性用于獲取和設(shè)置表中的特定列,Order對(duì)象中有內(nèi)部方法用于獲取和設(shè)置賬戶信息、繳納稅金和其他操作。
此外,Rails中用于覆蓋數(shù)據(jù)庫(kù)表的類提供系列類級(jí)方法可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)表的各種操作。舉例來(lái)說(shuō),我們要根據(jù)特定ID來(lái)找尋一個(gè)訂單。該操作被實(shí)現(xiàn)為一個(gè)可返回Order對(duì)象的類方法,在Ruby代碼中,它看起來(lái)像這樣:
有時(shí)這些類級(jí)方法返回的是一個(gè)對(duì)象集:
最后,與對(duì)象們都有可操作表中對(duì)應(yīng)行的方法,可能最常用的就是保存,將其所在行保存進(jìn)入數(shù)據(jù)庫(kù)。
所以,ORM層將數(shù)據(jù)庫(kù)映射為類,表中行映射為對(duì)象,列映射為對(duì)象屬性。類方法用于實(shí)現(xiàn)表級(jí)操作,實(shí)例方法用于實(shí)現(xiàn)列操作。
一個(gè)典型的ORM庫(kù)中,你需要提供配置參數(shù)明確數(shù)據(jù)庫(kù)實(shí)體與程序?qū)嶓w間的映射,使用這些ORM工具的程序員通常發(fā)現(xiàn)他們要?jiǎng)?chuàng)建和維護(hù)一大堆的XML配置文件。
ActiveRecord
ActiveRecord是個(gè)專用于Rails的ORM層,它跟從標(biāo)準(zhǔn)ORM模型。表映射為類,行映射為對(duì)象,列映射為對(duì)象屬性。它與大多數(shù)ORM庫(kù)最大的不同在于它的配置方式。通過(guò)約定和遵循合理框架,ActiveRecord大大減少了程序員配置文件的數(shù)量。
為了說(shuō)明這一點(diǎn),以下有個(gè)使用ActiveRecord來(lái)覆蓋Orders表的代碼:
這段代碼通過(guò)ID來(lái)取得訂單,它使用了Order類,并修改pay_type變量(我們現(xiàn)在先忽略創(chuàng)建數(shù)據(jù)庫(kù)連接的代碼)。ActiveRecord把我們從處理底層數(shù)據(jù)庫(kù)的麻煩中解放出來(lái),讓我們集中精力在業(yè)務(wù)邏輯上。
但ActiveRecord能做的不止于此,正如你所見(jiàn)的那樣,在開(kāi)發(fā)購(gòu)物車應(yīng)用時(shí),你會(huì)看到這點(diǎn)。ActiveRecord與Rails框架的其他組件無(wú)縫的集成在一起,若一個(gè)表單發(fā)送的應(yīng)用數(shù)據(jù)與業(yè)務(wù)模型有關(guān),ActiveRecord可以將數(shù)據(jù)抽取到模型當(dāng)中。ActiveRecord支持各種設(shè)定好的數(shù)據(jù)模型,若表單數(shù)據(jù)沒(méi)能通過(guò)驗(yàn)證,Rails視圖就可以抽取并將錯(cuò)誤顯示出來(lái)。ActiveRecord是RailsMVC架構(gòu)穩(wěn)固的模型基礎(chǔ)。ActionPack:視圖與控制器
請(qǐng)考慮下這點(diǎn),視圖和控制器在MVC框架中是聯(lián)系緊密的兩個(gè)部分,控制器為視圖提供數(shù)據(jù),控制器從視圖產(chǎn)生的頁(yè)面中獲取事件,正因如此,Rails中對(duì)這兩者的支持被綁定到一個(gè)名為ActionPack的獨(dú)立組件中。
不要傻傻因?yàn)锳ctionPack是個(gè)獨(dú)立組件就以為你的視圖和控制器代碼會(huì)被搞得一團(tuán)糟。恰恰相反,Rails給了二者足夠的獨(dú)立性,讓開(kāi)發(fā)者為控制與顯示邏輯編寫(xiě)界限清晰的代碼。
視圖支持
在Rails中,視圖負(fù)責(zé)創(chuàng)建部分或全部需要在瀏覽器中呈現(xiàn)的響應(yīng),無(wú)論是運(yùn)行應(yīng)用或發(fā)送郵件。簡(jiǎn)單說(shuō)來(lái),視圖就是一塊HTML代碼用以顯示固定的文本塊。通常你可能想在其中嵌入動(dòng)態(tài)代碼,而這些是由控制器中的行為方法創(chuàng)建的。
在Rails中,動(dòng)態(tài)部分由模板生成,它有以下三個(gè)特性。最常用的叫模板模式,也叫做嵌入式ruby(ERb)。
將小片的Ruby代碼嵌入視圖文檔中,在很多方面都與其他web開(kāi)發(fā)框架類似,如PHP或JSP。盡管這方法很靈活,但還是有些人認(rèn)為它褻瀆了MVC的精神。通過(guò)在視圖中嵌入代碼,我們大膽嘗試了本應(yīng)在模型或控制器中的增量邏輯,正如其他事物一樣,有節(jié)制的合理使用是明智的,濫用則造成問(wèn)題。開(kāi)發(fā)人員需把握二者之間的界限(我們會(huì)在第410頁(yè),用ERB更新HTML代碼一節(jié)看到有關(guān)內(nèi)容)。
XMLBuilder也可使用Ruby代碼構(gòu)建XML文檔生成的XML結(jié)構(gòu)會(huì)自動(dòng)跟隨代碼結(jié)構(gòu),我們將從第408頁(yè)開(kāi)始討論xml.builder模板。
Rails也提供RTS視圖,該視圖允許你在服務(wù)器端創(chuàng)建JavaScript代碼,然后在瀏覽器中顯示。這點(diǎn)對(duì)創(chuàng)建動(dòng)態(tài)Ajax接口很有利,我們將從145頁(yè)討論這部分內(nèi)容。
談?wù)効刂破?/p>
Rails控制器是應(yīng)用的邏輯中心,它協(xié)調(diào)了用戶、視圖和模型三者間交互。然而Rails控制幕后大部分交互操作,讓你的代碼可集中于功能實(shí)現(xiàn)上。這使得Rails控制器代碼變得極易開(kāi)發(fā)和維護(hù)?刂破饕灿糜诎仓靡幌盗兄匾嚓P(guān)服務(wù):
它負(fù)責(zé)引導(dǎo)外部請(qǐng)求獲得內(nèi)部行為,它可以很好管理用戶友好的URLs。它管理緩存,可以讓?xiě)?yīng)用在大量請(qǐng)求訪問(wèn)時(shí)表現(xiàn)良好。
它管理幫助模塊,該模塊可以在不增加大量代碼的情況下擴(kuò)展視圖模板的性能。
它管理會(huì)話,讓?xiě)?yīng)用在交互時(shí)保持連續(xù)的感覺(jué)。附錄一翻譯原文
Model,viewandcontrollerRailsapplicationframework
AninterestingfeatureofRailsapplicationsimposestringentrestrictionsonhowtoorganizethewebapplications.Surprisingly,theserestrictionscreateapplicationsbecomesconvenient,butmorethanalittleconvenient.Letuslookatwhy.
3.1model,viewandcontroller
Let"sgobackto1971,TrygveReenskaugcreatedanewframeworkforthedevelopmentofinteractiveapplications.Inhisdesign,theapplicationisbrokendownintothreecomponents:model,viewandcontroller.
Responsibleforthestatetosavetheapplicationmodel,sometimesthestateistemporary,onlywhentheuserinteraction,andsomestateislong-lasting,usuallystoredinthedatabaseoutsideoftheapplication.
Themodelisnotjustdata,itistheimplementationofallthebusinesslogicanddata.Forexample,ifanaccountshouldnotbeusedforanorderoflessthan$20amount,themodelwillaccounttoimposetheconstraints.Thisiswherethemeaning.Constraintsinthemodelbusinesslogicrules,wecanensurethatnootherthingswillaffectthestabilityofthedata.Modelatthesametimeasthedatabaseandthecaretakerthere.
Theviewisresponsibleforupdatingtheuserinterface.Itisusuallybasedonthedatamodel.Forexample,anonlinestore,acatalogtobepresentedtotheuser,thedirectorycanbeobtainedthroughthemodel.Butmadeandthecatalogwasdedicatedtotheenduser,butisaviewinacertainformat,althoughtheviewmayprovideuserswithavarietyofinputdata,butdoesnotitselfmanagetheseinputdata.Whenthedataafteritispresentedtotheuser,theviewoftheworkcompleted.Theremaybemanyviewsharethesamedatamodel.Inthecaseofonlinestores,someoftheviewresponsibleforshowingthecataloginformation,whileothersviewfortheadministratortoaddormodifytheproductinformation.
Thecontrollerisresponsibleforcoordinatingtheentireapplication.Itfromtheoutsideworld(normallyuserinput)toreceiveevents,interactingwiththemodel,andrenderedtotheuserview.
Three-model,viewandcontrollerarefromtheWearefamiliarwiththeMVCframework,andtoknowthesethreecollaboration,seeFigure3-1.
MVCwasoriginallyconceivedfortraditionalGUIapplications,developershopecanbeseparatedfromtheirrespectiverepresentation,sothatmaintenanceandcodeeasier.
EachconceptorbehaviorcanbepresentedintheMVCframeworkusingtheMVCashavebeenplacedgirdersonthebasisoftheconstructionofskyscrapers,andwithit,buildtheotherpartseasier.Inthedevelopmentandapplicationoftheprocess,wewilltrytouseRailsscaffoldingabilitytobuildapplications.
RORisaMVCframework,Railsimplementationofaframeworkforyourapplication-thedevelopmentofthemodel,viewandcontroller.Theprogramrunsasaseparatefunctionalarea,andtheyarelinkedtogether.Railsisafunconnectionprocessbasedonanintelligentframework.Soyoudonothavetowriteanyexternalconfigurationallowstheiroperation.ThisisamanifestationoftheRails"habitsoverconfiguration"philosophy.
Railsapplication,sentintherequestwasfirstpassedtotheRoutertheRouterisusedtosendtheresolutionrequest,andultimately,inthecontrollersectionofcodethatidentifiesaparticularmethod(themethodcalledActionbehaviorinRails).Theactwouldviewthedataintherequest,mayalsointeractwiththemodel,mayalsomakeotheractstobeawakened.Ultimately,thebehaviorfortheviewtopreparerequiredtouser.
submit
information
tothe
RailsinFigure3-2asprocessingtherequest,showingtheCatalogpageinthiscase,thebeginningoftheapplication,userssimplyclickonthegoodsnext[AddtoCart]button,thebuttontotransmitinformationto:3000/line_items?
theproduct_id=2,line_itemsisaresourceinourapplication,twointernalIDhasbeenchosenforthegoods.
Pathcomponentreceivesarequestsent,andwillsoonbeitsdecomposition.Therequestcontainsapath(/line_items?Theproduct_id=2)andamethod(thebuttontoexecutethePOSTmethod,theothercommonmethodsPUTandDELETE).Inthissimpleexample,Railshasachievedthefirstpartofthepath-line_itemsasthecontrollername,andproduct_idasacommoditynumber.Byconvention,thePOSTmethod,createactionassociated.(267itcomestonamingconventionproblems)
Createmethodsforhandlinguserrequests.Inthiscase,themethodfindsthecurrentuser"sshoppingcart,thecartisanobjectofcontrolbythemodel,thenitshouldalsorequirethemodeltofindtherelevantinformationofcommodity2.Thentoldcartaddcommodity2information(seethemodelishowtobeusedtosavealltransactioninformation?Controllertellstheapplicationwhattodo,themodelknowshowtodo).Shoppingcartnewproductshavebeenincluded,wecanlettheuserseeit.Controllertowake-upviewofthecode,butbeforeithastheviewisreadfromthemodeltheshoppingcartobjectready.InRails,thisagreementisusuallyhidden,onceagain,agreedtohelpustoestablishaconnectionbetweentheviewandcontroller.
ForaMVCwebapplication,whichisalreadygoodenough.Followtheconventionsandrationaldivisionoffunctionalareas,youwillfindthecodeeasytoextendandmaintain,itseemsispenbargainisnotit?IfMVCissimplyyourcodeintotheappropriatefunctionalarea,youmightwonderwhysuchaframeworkneedstoROR,theanswerissimple:Railssweptalltrivialchoreschildrenwhowilloccupyalotoftimeannoyingdetails,sothatyoufocusontheapplicationofcorefunctions.LetuslookatRailsishowtodoit.3.2Railssupportmodel
Overall,wehopethattheinformationstoredinarelationaldatabaseapplications.Orderphysicalsystemwillsavethedetailsoftheordersofgoodsanduserinthedatabasetable.Eventhosewhotypicallyuseunstructuredtextapplications,suchasweblogandnewssitewillusethedatabaseastheback-endstoragetools.
AlthoughoneortwowordscannotexplaintheoperationofthedatabaseSQL(StructuredQueryLanguage)relationaldatabaseisactuallybasedonthetheoryofdatasetstobedesigned.Intheory,thisdesignisnoproblem,butitisdifficulttocombinewithobject-orientedlanguage.Theobjectisadatabaseonthevalueofacollectionofdataandoperations.InOOsystems,itisdifficulttocodeexpressionoperationinthedatabaseeasily,andviceversa,itisdifficulttouserelationaldatabase,canbeexpressedincode.
Overtime,peopleinventedavarietyofmethodstointegratethesetwoapproachestogethertopresentthedata.LetuslookatRailsusesakindofrelationaldatabaseismappedtotheobjectabove.Object-relationalmapping
ORMlibrariesmapdatabasetablestoavarietyofclasses,ifthedatabasetablecalledorders,ourprogramwillhaveaOrderclass,rowinatableassociatedwiththeobjectofthatclass,aspecificorderthattheOrderclassobjects.Theobjectattributeisusedtoaccessandsetaspecificcolumninthetable,theOrderobjectinternalmethodsusedtogetandsettheaccountinformation,paytaxesandotheroperating
Railsprovidesaseriesofclass-levelmethodcanachieveavarietyofoperationofthedatabasetableusedtocovertheclassofthedatabasetable.Forexample,wefindanorderbasedonthespecificID.ThisoperationisimplementedasaclassmethodtoreturntheOrderobjectinRubycode,itlookslikethis:
Sometimesobjects:
these
class-level
method
returns
aset
ofFinally,withtheobjecttohaveacorrespondingrowintheoperationaltable,maybethemostcommonlyusedistosave,saveitsrowintothedatabase.
ORMlayerdatabasemappingfortheclass,rowsinatablemappingobject,thecolumnismappedtoobjectproperties.Classmethodsfortable-leveloperations,andaninstancemethodforcolumnoperation.AtypicalORMlibrary,youneedtoprovidethemappingbetweentheconfigurationparametersexplicitlydatabaseentitiesandproceduresforentities,usingtheseORMtoolsprogrammersoftenfindtheywanttocreateandmaintainabunchofXMLconfigurationfiles.ActiveRecord
ActiveRecordistheRailsORMlayer,whichfollowthestandardORMmodel.Thetablemappingfortheclassmappingrowstoobjects,thecolumnismappedtoobjectproperties.ThebiggestdifferenceisthatwithmostoftheORMlibraryconfiguration.Conventionsandfollowthelogicalframework,ActiveRecord,greatlyreducingthenumberofprogrammersconfigurationfile.
Toillustratethis,thefollowingcodetocovertheOrderstableusingtheActiveRecord:
ThecodetogettheorderbyID,usetheOrderclass,andmodifypay_typevariables(whichwefirstignorethecodetocreateadatabaseconnection).ActiveRecordusfreefromthetroubleofdealingwiththeunderlyingdatabase,letusconcentrateonthebusinesslogic.ActiveRecordcandomorethanthat,asyoucansee,inthedevelopmentofashoppingcartapplication,youwillseethis.ActiveRecordandothercomponentsoftheRailsframeworkforseamlessintegrationwithaformtosendapplicationdataandbusinessmodelsrelatedtoActiveRecorddatacanbeextractedtothemodel.ActiveRecordsupportsavarietyofpredetermineddatamodel,theformdatadoesnotpassverification,theRailsviewcanextractanddisplaytheerrorout.
ActiveRecordisthebasisofthesolidmodelRailsMVCarchitecture.ActionPack,:viewandcontroller
PleaseconsiderthatunderthispointofviewandthecontrollerintheMVCframeworkiscloselylinkedtotwopartsofthecontrollerfortheviewtoprovidedataaccesstoeventsgeneratedbythecontrollerfromtheviewpageandthatiswhythesebothRailsthesupportisboundtoaActionPackindependentcomponent.
DonotbefooledbecauseActionPackisanindependentcomponentandthinkthatyourviewandcontrollercodewillbeamess.Onthecontrary,theRailstobothsufficientindependence,thepreparationofclearboundariesofthecodeallowsdeveloperstocontrolanddisplaylogic.ViewsupportInRails,theviewisresponsibleforcreatingpartoralloftheneedtoberenderedinthebrowserresponse,whetheritisrunningtheapplicationorsende-mail.Simplyput,theviewisanHTMLcodeforafixedblockoftext.Normallyyoumightwanttoembeddeddynamiccode,andthesearecreatedbythecontrollerbehavior.
InRails,thedynamicpartsaregeneratedbythetemplate,ithasthefollowingthreecharacteristics.Themostcommonlyusediscalledthetemplatepattern,alsoknownasembeddedruby(ERbtem).
EmbedasmallpieceofRubycodetoviewdocumentinmanywayssimilartootherwebdevelopmentframeworkssuchasPHPorJSP.Althoughthismethodisveryflexible,butstillsomepeoplethinkthatitdesecratedthespiritoftheMVC.Embedcodeintheview,wehaveaboldattempttoincrementallogicofthemodelorcontroller,likeotherthings,therationaluseofrestraintiswise,abuseiscausingtheproblem.Developersneedtograsptheboundariesbetweenthetwo(410,ERBupdatetheHTMLcodefortheonetoseethecontent).
CanalsobeXMLBuilderRubycodetobuildanXMLdocument-thestructureofthegeneratedXMLwillautomaticallyfollowthecodestructure,wewill408discussxml.buildertemplate.
RailsalsoprovidestheRTSview,whichallowsyoutocreateserver-sideJavaScriptcode,andthendisplayedinthebrowser.ThisisverybeneficialtocreateadynamicAjaxinterface,from145todiscussthispart.
Talkaboutthecontroller
Railscontrollerapplicationlogiccenter,whichcoordinatestheinteractionbetweenusers,viewandmodelthethree.However,mostoftheRailscontrolbehindthescenestointeroperate,sothatyourcodecanbefocusedonthefunctionrealization.ThismakestheRailscontrollercodetobecomeeasilydevelopandmaintain.Thecontrollerisalsousedforplacementofaseriesofimportantservices:Itisresponsiblefordirectingexternalrequestsforaccesstointernalbehavior,itcanbeagoodmanagementofuser-friendlyURLs.
Itmanagesthecache,youcanlettheapplicationrequestsaccesstoalargenumberofgoodperformance.
Itmanagestohelpthemodule,themodulecanincreasetheperformanceofanexpandedviewofalargenumberofcodetemplates.
Itmanagessessions,applicationsinteracttomaintainacontinuoussense.附錄三附圖或程序清單
一、功能一附圖或程序清單二、功能二附圖或程序清單
友情提示:本文中關(guān)于《10.第六章 總結(jié)與展望》給出的范例僅供您參考拓展思維使用,10.第六章 總結(jié)與展望:該篇文章建議您自主創(chuàng)作。
來(lái)源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問(wèn)題,請(qǐng)聯(lián)系我們及時(shí)刪除。