10.第六章 總結(jié)與展望
第六章總結(jié)與展望
第六章總結(jié)與展望
6.1對電子現(xiàn)金的總結(jié)
電子現(xiàn)金技術(shù)作為電子支付中最具潛力的技術(shù)之一,在隨著網(wǎng)絡(luò)普及和計算機(jī)、網(wǎng)絡(luò)通信技術(shù)的迅速發(fā)展,以Internet為基礎(chǔ)的電子商務(wù)在全球范圍內(nèi)普及和迅速發(fā)展,與之相適應(yīng)的電子支付系統(tǒng)成為產(chǎn)業(yè)界和學(xué)術(shù)界共同關(guān)注的熱點。電子支付的安全性影響著電子商務(wù)的普及和發(fā)展,電子支付技術(shù)實用化,必須把安全和效率結(jié)合起來。它具有與現(xiàn)實物理貨幣相似的特性,具有信用卡和電子支票無法具有的性能。
本文主要研究了有關(guān)電子現(xiàn)金的一些重要理論和關(guān)鍵技術(shù)問題,包括:1.論述了密碼學(xué)基礎(chǔ)的概念和理論,進(jìn)而選擇了一種基于RSA公鑰加密算法作為本設(shè)計的基本算法。
2.討論了電子現(xiàn)金的安全性問題,并基于公鑰密碼體制原理,構(gòu)造了一個電子現(xiàn)金方案。
3.討論了數(shù)字簽名技術(shù)原理及其應(yīng)用,重點是在電子現(xiàn)金中RSA數(shù)字簽名的應(yīng)用,為電子現(xiàn)金的成功運作提供了保障。
4.針對本設(shè)計中一些不完善的地方進(jìn)行了論述,在以后的學(xué)習(xí)和生活中盡量去完善。
但是對于電子現(xiàn)金的應(yīng)用方面,還有些不很樂觀。原因是:(1)只有少數(shù)商家接受電子現(xiàn)金,而且只有少數(shù)幾家銀行提供電子現(xiàn)金開戶服務(wù);(2)成本較高,電子現(xiàn)金對于硬件和軟件的技術(shù)要求都較高;(3)存在貨幣兌換問題;(4)風(fēng)險較大。
6.2對電子現(xiàn)金的展望
6.2.1電子現(xiàn)金的傳遞性的可用性研究
傳遞性是物理現(xiàn)金一個基本的特征,但在電子現(xiàn)金中還沒有應(yīng)用,最主要的原因是:電子現(xiàn)金中為了能跟蹤重復(fù)花費的用戶,在電子現(xiàn)金中加入了盲化的用戶身份信息,在電子現(xiàn)金流動的過程中將加入使用過該電子現(xiàn)金的所有用
第六章總結(jié)與展望
戶身份信息,因此根據(jù)信息論的理論,電子現(xiàn)金的長度是不斷地增長的,每次交易都將造成大通信量問題,無法用于實際應(yīng)用;另外電子現(xiàn)金無論是在構(gòu)造還是存款過程中,相對于物理現(xiàn)金都是相當(dāng)容易而有效的。
因此電子現(xiàn)金的傳遞性還有待于進(jìn)一步研究。
6.2.2多銀行電子現(xiàn)金的研究
現(xiàn)有的電子現(xiàn)金方案都是由一個銀行發(fā)行的,但在現(xiàn)實生活中由多個電子銀行系統(tǒng)發(fā)行的電子現(xiàn)金較之單個銀行發(fā)行的電子現(xiàn)金是更適合的,因為在一個國家或地區(qū)具有電子現(xiàn)金發(fā)行能力的銀行可能不止一家。這多個銀行形成一個群體,它們受國家的中央銀行管理,每個銀行都可以發(fā)行電子現(xiàn)金。
所以由多個銀行發(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)是研究的重點。Okamoto和Ohta于1991年首次提出了一個可分電子現(xiàn)金系統(tǒng),該系統(tǒng)允許用戶將電子現(xiàn)金分成任意金額進(jìn)行多次支付,直到與該電子現(xiàn)金的總額相等為止。為使銀行能夠有效地檢測用戶的重復(fù)支付,他們采用了二叉樹技術(shù)對電子現(xiàn)金進(jìn)行表示,但這種技術(shù)導(dǎo)致電子現(xiàn)金的支付協(xié)議通信量大、計算復(fù)雜度高、效率低,盡管許多學(xué)者對該方案從不同的角度提出了改進(jìn),但都由于使用二叉樹表示使得支付協(xié)議的執(zhí)行效率仍然很低。
因此,到目前為止,可分電子現(xiàn)金系統(tǒng)依然是不實用的。關(guān)于這方面研究,還可以引入可信第三方來實現(xiàn)對超額支付者的識別,使電子現(xiàn)金的支付協(xié)議中沒必要包含進(jìn)行重復(fù)支付檢查的信息,這樣就可以放棄可分電子現(xiàn)金的二叉樹表示技術(shù),從而構(gòu)造更簡單的可分電子現(xiàn)金系統(tǒng)。
今后為了設(shè)計更安全有效的包括電子現(xiàn)金在內(nèi)的電子支付協(xié)議,應(yīng)該加強(qiáng)針對實際應(yīng)用環(huán)境的公鑰密碼的設(shè)計,研究包括算法優(yōu)化和軟硬件快速實現(xiàn)的公鑰密碼技術(shù)、設(shè)計新型分組密碼、研究分組密碼的軟硬件快速實現(xiàn)和專用芯
第六章總結(jié)與展望
片以及設(shè)計一些與商用的具體應(yīng)用環(huán)境密切相關(guān)的特殊數(shù)字簽名,比如盲簽名、代理簽名、群簽名、具有消息恢復(fù)功能的簽名等。這些密碼的基礎(chǔ)性工作,對于包括電子現(xiàn)金在內(nèi)的電子支付技術(shù)的發(fā)展是非常必要的。
擴(kuò)展閱讀:總結(jié)與展望
第五章系統(tǒng)測試與分析
一、軟件測試
經(jīng)過需求分析、設(shè)計和編碼等階段的開發(fā)后,得到了源程序,開始進(jìn)入到軟件測試階段。然而,在測試之前的各階段中都可能在軟件產(chǎn)品中遺留下許多錯誤和缺陷,如果不及時找出這些錯誤和缺陷,并將其改正,這個軟件產(chǎn)品就不能正常使用,甚至?xí)䦟?dǎo)致巨大的損失。目前,程序的正確性證明尚未得到根本的解決,因此軟件測試仍是發(fā)現(xiàn)軟件中錯誤和缺陷的主要手段。
系統(tǒng)整體測試步驟:1、單元測試
單元測試是整體測試中的第一步,通常在編碼階段進(jìn)行。在源程序代碼經(jīng)過編譯、評審、確認(rèn)沒有語法錯誤之后,便可開始進(jìn)行單元測試。
2、集成測試
集成測試在單元測試完成之后,將所有的模塊概要設(shè)計要求組裝成系統(tǒng)時進(jìn)行的測試,
主要目標(biāo)是發(fā)現(xiàn)與接口有關(guān)的問題。3、確認(rèn)測試
經(jīng)過集成測試之后,接口錯誤已經(jīng)發(fā)現(xiàn)被發(fā)現(xiàn)并改正了,接下便要進(jìn)行確認(rèn)測試。所謂確認(rèn)測試就是驗證所開發(fā)軟件的功能性及其他特性是否符合軟件需求規(guī)格說明書的要求。所以,確認(rèn)測試又被稱為有效性測試。
4、系統(tǒng)測試
系統(tǒng)測試是更大范圍內(nèi)進(jìn)行測試,它將經(jīng)過確認(rèn)測試的軟件作為整個基于計算機(jī)的系統(tǒng)的一個元素,在實際運行環(huán)境下,對系統(tǒng)進(jìn)行的一系列集成和確認(rèn)測試。
二、微博系統(tǒng)測試(一)注冊頁面的錯誤提醒和提交注冊信息測試
反復(fù)點擊注冊頁面的輸入框,檢測其失焦提醒錯誤的JS事件是否會失效。然后再分別依“”次增多地填入用戶名、密碼等,點立即注冊按鈕,看其是否提醒缺失的必填選項。接著,再新建一個合法賬戶,然后重新注冊個與其名字相同的賬戶,看系統(tǒng)是否提醒,并且不為其添加記錄。經(jīng)過以上反復(fù)測試,該模塊測試成功。
(二)登錄功能及模塊進(jìn)入身份限制的測試
使用建好的賬戶不停登錄退出系統(tǒng),檢測系統(tǒng)存儲的用戶信息是否變化。然后檢測,不同身份的用戶是否能進(jìn)到其身份不符合的模塊。經(jīng)過以上反復(fù)測試,該模塊測試成功。
(三)輸入模塊的測試
對于微博的發(fā)布各項比如表情,圖片,音頻等反復(fù)地測試,使用它們發(fā)送是否正常。經(jīng)過以上反復(fù)測試,該模塊測試成功。
(四)我的首頁模塊的測試
對于登錄成功的用戶跳轉(zhuǎn)到用戶自己的微博首頁,會顯示校園即時微博信息,并且首頁鏈接到各項功能模塊,并且可以發(fā)布微博。測試各個功能模塊是否正常,若有問題,馬上修改。經(jīng)過以上反復(fù)測試,該模塊測試成功。
(五)@提到我的模塊的測試
當(dāng)別人發(fā)布的微博或者轉(zhuǎn)的微博含有@用戶名的信息,那么會給被@的用戶即時消息提醒,檢查此功能是否正常,如果沒有差錯則測試成功。經(jīng)過以上反復(fù)測試,該模塊測試成功。
(六)微博正文模塊,包括轉(zhuǎn)發(fā)、收藏、評論的測試
是否可以正常轉(zhuǎn)發(fā)、收藏、評論別人的微博,檢查功能是否正常,如果沒有差錯則測試成功。經(jīng)過反復(fù)測試,該模塊測試成功。第六章總結(jié)與展望二、總結(jié)
(一)、學(xué)習(xí)
通過這次的畢業(yè)設(shè)計,我主要是學(xué)習(xí)到了如何使用ROR進(jìn)行WEB開發(fā),如何靈活使用CSS寫出想要的頁面樣式,同時也學(xué)習(xí)了軟件工程以及數(shù)據(jù)庫方面的知識。
在整個系統(tǒng)的開發(fā)中,遇到了很多的難題,比如如何正確的去統(tǒng)計轉(zhuǎn)發(fā)數(shù)量以及評論數(shù)量等。經(jīng)過幾次的修改以及借鑒Sina微博的做法,才得以初步解決。也讓我對權(quán)限和授權(quán)的知識的認(rèn)識更進(jìn)了一步。而且自己學(xué)習(xí)使用PHOTOSHOP等工具,也是為了配合CSS讓自己的系統(tǒng)頁面更好看,有一個好的視覺效果,也是花了很長的時間。對UI設(shè)計也更有了解了。
(二)、反思
當(dāng)然,由于各方面知識的不專業(yè),這樣的一個系統(tǒng)還不夠成熟。而且許多當(dāng)初的設(shè)計的功能最后因為各種原因也未能加入。系統(tǒng)在一開始編寫時未能給那些功能預(yù)留擴(kuò)展,這是我在詳細(xì)設(shè)計時候未設(shè)計完善所導(dǎo)致的,是一個很好的經(jīng)驗教訓(xùn)。希望以后自己有更好的設(shè)計。
一、展望
通過這一次畢業(yè)設(shè)計,使我認(rèn)識到自己在計算機(jī)領(lǐng)域所擅長的以及所需要彌補(bǔ)的是什么。我喜歡著眼于一個軟件產(chǎn)品的UI,自己會學(xué)習(xí)各種相關(guān)的知識來完成一個自己設(shè)計的UI。而且CSS也是我自己擅長的。以后我會更努力學(xué)習(xí)關(guān)于產(chǎn)品UI的專業(yè)的知識,以從事于相關(guān)職業(yè),更好的做好產(chǎn)品的圖形界面設(shè)計。參考文獻(xiàn)
[1]、DaveThomas,DavidHansson等.應(yīng)用Rails進(jìn)行敏捷Web開發(fā).電子工業(yè)出版社.201*.
[2]、裴有福.Web技術(shù)大全.中國水利水電出版社.1998[3]、百度知道.
[4]、BaronSchwartz、PeterZaitsev、VadimTkachenko、Jeremy.高性能MySQL(第2版).電子工業(yè)出版社:201*
[5]、賈錚等.HTML+CSS網(wǎng)頁布局開發(fā)指南.清華大學(xué)出版社.201*[6]、鄧蔚等.編程紅寶書:Ruby完全自學(xué)手冊.機(jī)械工業(yè)出版社.201*[7]、柳靖等.RubyonRails快速Web應(yīng)用開發(fā)實戰(zhàn)[M].電子工業(yè)出版社.201*
[8]、〔美〕杰克戴維斯.ThePhotoshopWow!Book.201*.致謝
經(jīng)過一個學(xué)期的努力,畢業(yè)設(shè)計系統(tǒng)的開發(fā)暫時告一段落了。這次畢業(yè)設(shè)計,讓我充分的把這幾年所學(xué)到的專業(yè)知識融會貫通,從做需求分析、設(shè)計數(shù)據(jù)庫、到系統(tǒng)整體設(shè)計和具體的代碼實現(xiàn)。整個設(shè)計,讓我學(xué)到了許多以前在課堂上面學(xué)不到的知識,很大程度的加強(qiáng)了自己的實踐能力。在此,感謝我的指導(dǎo)老師許精明老師的指導(dǎo)和督促,在整個的開發(fā)步驟上,老師給我們列出了詳細(xì)的任務(wù)工作計劃,使我們在開發(fā)進(jìn)程上,不致于茫然。在設(shè)計思路和系統(tǒng)功能結(jié)構(gòu)方面,老師給我們提出了許多寶貴的意見,同時不斷地給我們提出更高的要求。另外,感謝在我的畢業(yè)設(shè)計過程中給過我?guī)椭乃型瑢W(xué),是大家的幫助才得以完成我的這個系統(tǒng)。
同時在設(shè)計過程中,我也發(fā)現(xiàn)了自己的不足,因為是首次進(jìn)行這樣的課題開發(fā),在代碼的實現(xiàn)上略現(xiàn)笨拙,整個程序在架構(gòu)上也算不上完美,以致予一些最初設(shè)計的功能最終并未實現(xiàn),但我相信通過今后的學(xué)習(xí)和實踐,自己在開發(fā)能力一定能夠得到大大的提高。
最后衷心感謝四年來辛勤教育我們的老師,感謝朝暮相處的同學(xué)以及在畢業(yè)設(shè)計中被我引用或參考的論著的作者,并向參與此次答辯的老師致以深深的謝意!
附錄二附錄文獻(xiàn)翻譯
模型、視圖和控制器Rails應(yīng)用的架構(gòu)
Rails應(yīng)用的一個有趣特性是它在如何組織web應(yīng)用上強(qiáng)制推行一些嚴(yán)格的限制。令人驚訝的是,這些限制讓創(chuàng)建應(yīng)用變得方便,而且不止一點的方便。讓我們來看看是為什么。
3.1模型、視圖和控制器
讓我們回到1971年,TrygveReenskaug為開發(fā)交互應(yīng)用創(chuàng)造了一種新架構(gòu)。在他的設(shè)計中,應(yīng)用被分解為三種組件:模型、視圖和控制器。
模型負(fù)責(zé)保存應(yīng)用的狀態(tài),有時狀態(tài)是臨時的,僅與用戶交互時存在,有的狀態(tài)是持久的,通常被保存在應(yīng)用之外的數(shù)據(jù)庫中。
但模型不僅僅只是數(shù)據(jù),它實施與數(shù)據(jù)有關(guān)的所有業(yè)務(wù)邏輯。舉例來說,如果一個賬戶不應(yīng)被用于一個小于20美元的訂單額度,模型將為賬戶施加該約束。這就是意義所在。通過在模型中制約業(yè)務(wù)邏輯規(guī)則,我們可以確保沒有任何其他東西會影響數(shù)據(jù)的穩(wěn)定性。模型同時作為數(shù)據(jù)庫和看守者而存在。
視圖負(fù)責(zé)更新用戶界面。通常它基于模型中的數(shù)據(jù)。舉例來說,某在線商店有個產(chǎn)品目錄要呈現(xiàn)給用戶,該目錄可通過模型得到。但取得目錄并以一定格式呈獻(xiàn)給最終用戶的卻是視圖,盡管視圖可能為用戶提供多種輸入數(shù)據(jù)的方法,但它本身并不管理這些輸入的數(shù)據(jù)。當(dāng)數(shù)據(jù)呈現(xiàn)給用戶以后,視圖的工作就完成了?赡軙性S多視圖共享同一數(shù)據(jù)模型。在網(wǎng)絡(luò)商店案例中,一些視圖負(fù)責(zé)呈現(xiàn)商品目錄信息,而另一些視圖用于管理員增加或修改商品信息。
控制器負(fù)責(zé)協(xié)調(diào)整個應(yīng)用。它從外部世界(通常是用戶輸入)接收事件,與模型交互,并給用戶呈現(xiàn)相應(yīng)視圖。
這三者模型、視圖與控制器都是從我們熟知的MVC框架中來的,要知道這三者是如何協(xié)同運作的,請看圖3-1。
MVC最初的設(shè)想是將其用于傳統(tǒng)的GUI應(yīng)用,開發(fā)者們希望可以分離它們各自的表示,從而使維護(hù)和編寫代碼變得更容易。
每個概念或行為都可以在MVC框架中呈現(xiàn),使用MVC就像在已放置好大梁的基礎(chǔ)上建造摩天大樓,有了它,構(gòu)建其他部分就變得更容易了。在開發(fā)應(yīng)用的過程中,我們將盡量使用Rails為構(gòu)建應(yīng)用的搭腳手架的能力。
ROR也是個MVC框架,Rails為你的應(yīng)用實施一個框架開發(fā)模型、視圖及控制器。作為分離的功能區(qū),并且在程序運行時將它們聯(lián)接在一起。使用Rails的一個樂趣是這個聯(lián)接過程基于一個智能的框架。因此你不用去寫任何外部配置就可以讓它們運作。這是Rails“習(xí)慣優(yōu)于配置”哲學(xué)的一個體現(xiàn)。
在Rails應(yīng)用中,送進(jìn)來的請求最先傳遞給Router,Router用于發(fā)送和解析請求,最終,會在控制器的某段代碼中標(biāo)識一個特定的方法(該方法在Rails中被稱為Action行為)。該行為會在請求中查看數(shù)據(jù),還可能與模型交互,也可能使其他行為被喚醒。最終,該行為為視圖準(zhǔn)備需要提交給用戶的信息。
Rails如圖3-2那樣處理請求,在本例中,應(yīng)用開始時呈現(xiàn)商品目錄頁面,用戶只需點擊位于商品旁邊的[AddtoCart]按鈕,該按鈕傳遞信息給
:3000/line_items?
product_id=2,其中l(wèi)ine_items是我們應(yīng)用中的一個資源,2是我們已選商品的內(nèi)部ID。
路徑組件接收到送來的請求,并很快將其分解。該請求包含一個路徑(/line_items?product_id=2)以及一個方法(該按鈕執(zhí)行POST方法,其他常見方法還有PUT和DELETE)。在這個簡單例子中,Rails取得了路徑的第一部分line_items作為控制器名稱,以及product_id作為商品編號。按照慣例,POST方法與創(chuàng)建動作相關(guān)聯(lián)。(我們將在267頁談到命名慣例問題)
Create方法用于處理用戶請求。在本例中,該方法找到目前用戶的購物車,購物車是由模型控制的一個對象,接著它也要同時要求模型找到商品2的相關(guān)信息。然后該方法告訴購物車自己添加商品2的信息(看到模型是如何被用于保存所有交易信息了嗎?控制器告訴應(yīng)用去做什么,模型知道該如何去做)。
現(xiàn)在購物車已將新商品包含在內(nèi),我們可以讓用戶看看它了?刂破鲉拘岩晥D代碼,但在此之前,它已為視圖從模型中讀取購物車對象做好了準(zhǔn)備。在Rails中,這個約定通常是隱性的,又一次,是約定幫我們在視圖和控制器間建立聯(lián)接。
對于一個MVCweb應(yīng)用來說,這已經(jīng)夠用了。通過跟隨約定和合理劃分功能區(qū),你將發(fā)現(xiàn)代碼變得易于擴(kuò)展和維護(hù),看起來是筆劃算的交易不是嗎?如果MVC只是簡單將你的代碼劃分為適當(dāng)功能區(qū),你可能會奇怪為何還需要ROR這么一個框架,答案很簡單:Rails為你包攬了所有瑣碎的家務(wù)活兒,那些將占用你大量時間的惱人細(xì)節(jié),使你將注意力集中在應(yīng)用的核心功能上。讓我們來看看Rails是如何做到這點的。
3.2Rails支持模型
總的來說,我們希望在關(guān)系數(shù)據(jù)庫上保存應(yīng)用的信息。訂單實體系統(tǒng)將在數(shù)據(jù)庫表中保存訂單,在線商品及用戶細(xì)節(jié)。甚至那些通常使用非結(jié)構(gòu)化文本的應(yīng)用,如weblog及一些新聞?wù)军c,都會使用數(shù)據(jù)庫作為它們的后臺存儲工具。
盡管一兩句話無法說明操作數(shù)據(jù)庫的SQL(結(jié)構(gòu)化查詢語言),關(guān)系數(shù)據(jù)庫實際上是基于數(shù)據(jù)集理論被設(shè)計而成。理論上講這設(shè)計沒什么問題,但它很難與面向?qū)ο笳Z言結(jié)合在一起。對象是關(guān)于數(shù)據(jù)和操作的,數(shù)據(jù)庫關(guān)于值的集合。在OO系統(tǒng)中,難以用代碼表達(dá)的操作可以在數(shù)據(jù)庫中輕松實現(xiàn),反之,難以用關(guān)系數(shù)據(jù)庫實現(xiàn)的,可以用代碼表達(dá)。
隨著時間推移,人們發(fā)明了多種方法來整合這兩種途徑,來共同呈現(xiàn)數(shù)據(jù)。讓我們看看Rails采用了那種方法將關(guān)系數(shù)據(jù)庫映射到對象上面。
對象關(guān)系映射
ORM庫將數(shù)據(jù)庫表映射為各種類,如果數(shù)據(jù)庫中有名為orders的表,我們的程序就會有個Order類,表中的行與該類的對象關(guān)聯(lián),一個特定的訂單表示Order類中的某個對象。在該對象中,屬性用于獲取和設(shè)置表中的特定列,Order對象中有內(nèi)部方法用于獲取和設(shè)置賬戶信息、繳納稅金和其他操作。
此外,Rails中用于覆蓋數(shù)據(jù)庫表的類提供系列類級方法可以實現(xiàn)數(shù)據(jù)庫表的各種操作。舉例來說,我們要根據(jù)特定ID來找尋一個訂單。該操作被實現(xiàn)為一個可返回Order對象的類方法,在Ruby代碼中,它看起來像這樣:
有時這些類級方法返回的是一個對象集:
最后,與對象們都有可操作表中對應(yīng)行的方法,可能最常用的就是保存,將其所在行保存進(jìn)入數(shù)據(jù)庫。
所以,ORM層將數(shù)據(jù)庫映射為類,表中行映射為對象,列映射為對象屬性。類方法用于實現(xiàn)表級操作,實例方法用于實現(xiàn)列操作。
一個典型的ORM庫中,你需要提供配置參數(shù)明確數(shù)據(jù)庫實體與程序?qū)嶓w間的映射,使用這些ORM工具的程序員通常發(fā)現(xiàn)他們要創(chuàng)建和維護(hù)一大堆的XML配置文件。
ActiveRecord
ActiveRecord是個專用于Rails的ORM層,它跟從標(biāo)準(zhǔn)ORM模型。表映射為類,行映射為對象,列映射為對象屬性。它與大多數(shù)ORM庫最大的不同在于它的配置方式。通過約定和遵循合理框架,ActiveRecord大大減少了程序員配置文件的數(shù)量。
為了說明這一點,以下有個使用ActiveRecord來覆蓋Orders表的代碼:
這段代碼通過ID來取得訂單,它使用了Order類,并修改pay_type變量(我們現(xiàn)在先忽略創(chuàng)建數(shù)據(jù)庫連接的代碼)。ActiveRecord把我們從處理底層數(shù)據(jù)庫的麻煩中解放出來,讓我們集中精力在業(yè)務(wù)邏輯上。
但ActiveRecord能做的不止于此,正如你所見的那樣,在開發(fā)購物車應(yīng)用時,你會看到這點。ActiveRecord與Rails框架的其他組件無縫的集成在一起,若一個表單發(fā)送的應(yīng)用數(shù)據(jù)與業(yè)務(wù)模型有關(guān),ActiveRecord可以將數(shù)據(jù)抽取到模型當(dāng)中。ActiveRecord支持各種設(shè)定好的數(shù)據(jù)模型,若表單數(shù)據(jù)沒能通過驗證,Rails視圖就可以抽取并將錯誤顯示出來。ActiveRecord是RailsMVC架構(gòu)穩(wěn)固的模型基礎(chǔ)。ActionPack:視圖與控制器
請考慮下這點,視圖和控制器在MVC框架中是聯(lián)系緊密的兩個部分,控制器為視圖提供數(shù)據(jù),控制器從視圖產(chǎn)生的頁面中獲取事件,正因如此,Rails中對這兩者的支持被綁定到一個名為ActionPack的獨立組件中。
不要傻傻因為ActionPack是個獨立組件就以為你的視圖和控制器代碼會被搞得一團(tuán)糟。恰恰相反,Rails給了二者足夠的獨立性,讓開發(fā)者為控制與顯示邏輯編寫界限清晰的代碼。
視圖支持
在Rails中,視圖負(fù)責(zé)創(chuàng)建部分或全部需要在瀏覽器中呈現(xiàn)的響應(yīng),無論是運行應(yīng)用或發(fā)送郵件。簡單說來,視圖就是一塊HTML代碼用以顯示固定的文本塊。通常你可能想在其中嵌入動態(tài)代碼,而這些是由控制器中的行為方法創(chuàng)建的。
在Rails中,動態(tài)部分由模板生成,它有以下三個特性。最常用的叫模板模式,也叫做嵌入式ruby(ERb)。
將小片的Ruby代碼嵌入視圖文檔中,在很多方面都與其他web開發(fā)框架類似,如PHP或JSP。盡管這方法很靈活,但還是有些人認(rèn)為它褻瀆了MVC的精神。通過在視圖中嵌入代碼,我們大膽嘗試了本應(yīng)在模型或控制器中的增量邏輯,正如其他事物一樣,有節(jié)制的合理使用是明智的,濫用則造成問題。開發(fā)人員需把握二者之間的界限(我們會在第410頁,用ERB更新HTML代碼一節(jié)看到有關(guān)內(nèi)容)。
XMLBuilder也可使用Ruby代碼構(gòu)建XML文檔生成的XML結(jié)構(gòu)會自動跟隨代碼結(jié)構(gòu),我們將從第408頁開始討論xml.builder模板。
Rails也提供RTS視圖,該視圖允許你在服務(wù)器端創(chuàng)建JavaScript代碼,然后在瀏覽器中顯示。這點對創(chuàng)建動態(tài)Ajax接口很有利,我們將從145頁討論這部分內(nèi)容。
談?wù)効刂破?/p>
Rails控制器是應(yīng)用的邏輯中心,它協(xié)調(diào)了用戶、視圖和模型三者間交互。然而Rails控制幕后大部分交互操作,讓你的代碼可集中于功能實現(xiàn)上。這使得Rails控制器代碼變得極易開發(fā)和維護(hù)。控制器也用于安置一系列重要相關(guān)服務(wù):
它負(fù)責(zé)引導(dǎo)外部請求獲得內(nèi)部行為,它可以很好管理用戶友好的URLs。它管理緩存,可以讓應(yīng)用在大量請求訪問時表現(xiàn)良好。
它管理幫助模塊,該模塊可以在不增加大量代碼的情況下擴(kuò)展視圖模板的性能。
它管理會話,讓應(yīng)用在交互時保持連續(xù)的感覺。附錄一翻譯原文
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)作。
來源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問題,請聯(lián)系我們及時刪除。