posts - 10, comments - 9, trackbacks - 0, articles - 17
           

                            項(xiàng)目實(shí)訓(xùn)心得

                       在這一個(gè)多月的項(xiàng)目實(shí)訓(xùn)過程,我感到是我專業(yè)學(xué)習(xí)中收獲非常大的一個(gè)月。在這個(gè)月里,我體驗(yàn)到了團(tuán)隊(duì)合作的經(jīng)驗(yàn),編程過程中的樂趣,以及將學(xué)習(xí)應(yīng)用到實(shí)際、從實(shí)踐中學(xué)習(xí)的豐收感。

                        這一個(gè)月里,得到了二個(gè)最寶貴體驗(yàn):一是參與了一個(gè)團(tuán)隊(duì)合作的、有很強(qiáng)多同模塊相互性、和一套完整生命周期流程的工程項(xiàng)目。這一套項(xiàng)目按照軟件工程的流程一步步走下來,經(jīng)歷了需求分析,詳細(xì)設(shè)計(jì),實(shí)際編碼和測(cè)試這一系列階段。一步一步慢慢的走下來。雖然對(duì)于真實(shí)的項(xiàng)目來說,這個(gè)項(xiàng)目的復(fù)雜度和規(guī)模并不是很大,邏輯要求也不是太嚴(yán)格。但是對(duì)于只參加一些3-4人的項(xiàng)目編程的我來說,已經(jīng)第一次讓我體真正的體驗(yàn)到將編程作為一項(xiàng)工程來執(zhí)行的難得經(jīng)驗(yàn)。

                        第二個(gè)體驗(yàn)是詳細(xì)設(shè)計(jì)中,將軟件架構(gòu)和分層的思想以及簡(jiǎn)單的工程模式等應(yīng)用到了項(xiàng)目中。使用框架等方式,非常有效的提高了代碼的復(fù)用和工程的可維護(hù)性,雖然多層結(jié)構(gòu)看似麻煩,但實(shí)際上它很大的降低了設(shè)計(jì)的復(fù)雜度,在實(shí)際的體驗(yàn)中感到,使用了框架后的模塊,維護(hù)起來清晰了很多,容易了很多,降低了耦合,同時(shí)增強(qiáng)了模塊間的交互和重用。

                        隨著整個(gè)工程的流程一步步進(jìn)行,我們看到了一個(gè)工程的一次次成長(zhǎng)。項(xiàng)目伊始,我們得到了項(xiàng)目需求文檔(我想這一步在實(shí)際中也應(yīng)該是由項(xiàng)目人員精心設(shè)計(jì)才完成的),對(duì)于工程的不同用例,將工程分為了六個(gè)模塊,并對(duì)應(yīng)的將組員分為了六組。我們的第一步是完成對(duì)需求文檔的理解,而成果就是對(duì)應(yīng)了各個(gè)模塊的實(shí)際功能的靜態(tài)頁面,因?yàn)檐浖蛻糇詈篌w驗(yàn)所有需求的功能實(shí)現(xiàn)就是通過操作頁面來實(shí)現(xiàn),所以頁面要在客戶需求的角度去考慮,同時(shí)要將需求的功能都賦予體現(xiàn)。在這個(gè)過程中,大家除了按功能分化出頁面分類外,大部分時(shí)間還用來精心設(shè)計(jì)頁面的風(fēng)格。頁面布局和菜單中大量用到了JavaScriptCSS。和以我往設(shè)計(jì)頁面時(shí)不同的是,為了讓大家可以公用這些設(shè)計(jì),在頁面的布局中不能太復(fù)雜,甚至幾乎是不能在需要統(tǒng)一的地面對(duì)整體的布置有任何復(fù)雜的干預(yù)。所有希望統(tǒng)一的部分都要在公共的CSSJavaScript中做出方便統(tǒng)一使用的類或方法,在頁面本身的代碼中幾乎看不到布局設(shè)計(jì),只有功能組件。

                        在頁面設(shè)計(jì)通過審核之后就是詳細(xì)設(shè)計(jì)階段了,在這階段的前幾天我們犯了一個(gè)順序錯(cuò)誤,直接從數(shù)據(jù)庫著手。結(jié)果由于項(xiàng)目的功能的復(fù)雜性和模塊之間太多需要交互的地方,使得數(shù)據(jù)庫的設(shè)計(jì)進(jìn)行的很緩慢。經(jīng)過老師的提點(diǎn)我們改為從程序編碼的框架開始著手。聯(lián)系各功能的具體實(shí)現(xiàn)來設(shè)計(jì)編碼的層次結(jié)構(gòu)(框架詳細(xì)設(shè)計(jì)在下一節(jié)),劃分出公共平臺(tái)。這樣再從各模塊的功能及其交互劃分來聯(lián)系設(shè)計(jì)數(shù)據(jù)庫就變的清晰了很多。在設(shè)計(jì)過程中我們還使用了E-R圖來設(shè)計(jì)出關(guān)系數(shù)據(jù)庫,即從參與的對(duì)象和對(duì)象之間的關(guān)系最終設(shè)計(jì)出數(shù)據(jù)庫的方法。在這次設(shè)計(jì)中發(fā)現(xiàn)自己在利用一些系統(tǒng)的理論進(jìn)行整體的數(shù)據(jù)庫模型設(shè)計(jì)方面還存在很多不足。數(shù)據(jù)庫完成后,對(duì)框架的設(shè)計(jì)也基本完成,公共的分頁設(shè)計(jì),數(shù)據(jù)庫連接與關(guān)閉,工程的文件結(jié)構(gòu)和工程的環(huán)境也在幾次討論后完成統(tǒng)一設(shè)計(jì)。

                        由于之前對(duì)struts有了一定的了解,所以我在需求分析階段就開始嘗試著著手對(duì)幾個(gè)簡(jiǎn)單模塊的實(shí)現(xiàn)編碼,之后在詳細(xì)設(shè)計(jì)階段中,每次討論后新加的內(nèi)容都需要對(duì)已經(jīng)完成的代碼進(jìn)行一次大的修改。隨著代碼的增長(zhǎng),嘗試了很多種文件結(jié)構(gòu)。之后引入項(xiàng)目的框架也經(jīng)歷了很大的修改和許多次的嘗試。此外的修改還包括BaseAction的引入,DispatchAction的引入,使用struts異常處理等,并做好工程備份及將修改記錄在日?qǐng)?bào)中。在這一次次的修改中讓我受益匪淺,對(duì)這些設(shè)計(jì)和修改有了更深刻的體會(huì)。這樣在詳細(xì)設(shè)計(jì)階段的過程中,框架設(shè)計(jì)都已經(jīng)在編碼中事先進(jìn)行了實(shí)現(xiàn)和測(cè)試,一些功能在寫好后被分離出來作為公共平臺(tái)。終于在小組開始編碼時(shí)確定出了統(tǒng)一并詳細(xì)完整的的工程的全部環(huán)境,項(xiàng)目的框架結(jié)構(gòu)和整體編碼方式。我的編碼實(shí)現(xiàn)和單元測(cè)試也基本完成。

                        在兩周的編碼過程中,我主要是和吉利一起協(xié)助各模塊編碼,增加各模塊間交流,在這期間也解決問題的過程中學(xué)到知識(shí)。經(jīng)過全體組員兩周的努力工作,終于進(jìn)入了測(cè)試階段。我和吉利負(fù)責(zé)整體測(cè)試,測(cè)試聯(lián)結(jié)了所有模塊之后,可以順利的完成全套的流程。讓整個(gè)設(shè)計(jì)可以在6個(gè)流程中一步步的走下去,同時(shí)保證數(shù)據(jù)庫中所有數(shù)據(jù)和狀態(tài)的正確性。隨著測(cè)試一次次的進(jìn)行,問題漸漸被全部排除,經(jīng)過3次測(cè)試之后,基本可以完全順利的走完全套流程。

                         

                        我們這次工程中使用的是四層結(jié)構(gòu)的框架,即將MVC三層結(jié)構(gòu)的同時(shí),將model模型層分成了model模型層和DAO持久層。其中又根據(jù)工廠模式分出DAO接口,beanfactoryservicemanager)提供DAO實(shí)現(xiàn)。

                        結(jié)構(gòu)實(shí)現(xiàn):首先我們根據(jù)框架,設(shè)計(jì)出相應(yīng)的文件結(jié)構(gòu)。視圖層即所有JSP文件,和配置文件一起由eclipse的自動(dòng)生成單獨(dú)分在WebRoot下,六模塊的頁面分別分于六個(gè)子目錄下。所有的公共頁面和jscss目錄也放入WebRoot下。由于這次項(xiàng)目中模塊間的功能頁面基本是完全相互獨(dú)立的,這為在實(shí)現(xiàn)視圖層和控制層之間的頁面跳轉(zhuǎn)控制帶來很大的方便。代碼目錄(src)下為六個(gè)模塊的六個(gè)目錄,公共代碼目錄(platform),以及后加入的驗(yàn)證模塊的目錄(validate)。除公共目錄外,各模塊下代碼分為5個(gè)目錄:ActionmodelFormmanagerdao。(這里有兩個(gè)命名的失誤,根據(jù)實(shí)際的使用,model的名字應(yīng)該叫bean更合適,而這里manager一般在框架中稱為service。但我們已經(jīng)有了稱為service的模塊名稱。)這里的ActionForm對(duì)應(yīng)了struts中的組件,DAO層和model-bean一起完成了操作的具體實(shí)現(xiàn),

                        視圖層view:總體框架上,我們使用的是frameset來實(shí)現(xiàn),不過聽老師說現(xiàn)在流行的使用japinclude結(jié)合div等來實(shí)現(xiàn)頁面框架。在之后編碼中,因?yàn)?/span>frameset出現(xiàn)了一個(gè)問題,就是用來驗(yàn)證攔截的過濾器無法刷新整個(gè)框架,使得攔截后的頁面只能顯示在被操作的frame中。但是frameset的好處是框架分離的很好,在實(shí)現(xiàn)jsp編碼中幾乎完全不用去考慮框架。我不知道用include是否能做到。以前雖然都使用的include,但是是在每個(gè)頁面中都要加入include。有時(shí)還會(huì)影響布局。在編碼過程中,我們用JavaScript實(shí)現(xiàn)了很多很好用的效果,比如選擇時(shí)間的窗口,表單的正則表達(dá)式驗(yàn)證,表格的變色效果等,封裝到公共的js文件中,調(diào)用起來很方便。在這次jap編程中,我終于由最初的在頁面中堆滿java代碼,轉(zhuǎn)變?yōu)橹皇褂靡恍?/span>JSTLEL語句和struts標(biāo)簽處理邏輯,美觀了頁面編碼,同時(shí)讓頁面更專注于顯示層。但這里我對(duì)EL語句和純標(biāo)簽語句又有些難以取舍。EL語句在頁面代碼中雖然不如單用標(biāo)簽顯得純粹美觀,但是EL表達(dá)式簡(jiǎn)約的表現(xiàn)風(fēng)格讓實(shí)現(xiàn)和維護(hù)變得容易了很多。

                        控制層Action的設(shè)計(jì)一是使用了DispatchAction,將多個(gè)Action類合并,方便了管理。二在公共部分中定義了BaseAction,由這個(gè)類去繼承strutsDispatchAction。之后我們的所有Action都去繼承這個(gè)BaseAction。這樣在需要對(duì)Action進(jìn)行統(tǒng)一處理,以及定義一些供Action公共使用的方法時(shí)就可以在這個(gè)BaseAction中修改。雖然在這次項(xiàng)目中,BaseAction只定義了個(gè)用于處理字符亂碼的方法公共使用,但由此即可瞥見對(duì)于更復(fù)雜的Action統(tǒng)一處理這種設(shè)計(jì)也能從容應(yīng)對(duì)。由于是分模塊進(jìn)行,于是我們將strutsxml配置文件也分為對(duì)應(yīng)各個(gè)模塊,使用多xml的配置方式,而這也需要對(duì)命名規(guī)則等很多方面有更好的協(xié)調(diào)和統(tǒng)一。在這次控制層的實(shí)現(xiàn)中,我起初還是像以前一樣對(duì)很多不同的驗(yàn)證,模型層返回的異常都在Action中處理并跳轉(zhuǎn)。在之后的修改中,逐漸將這些處理都改至模型層Manager中,由Manager取用持久層的操作方法,實(shí)現(xiàn)所有業(yè)務(wù)邏輯處理。

                        具體實(shí)現(xiàn)功能的模型層中,我們?yōu)槊總€(gè)DAO定義了接口和實(shí)現(xiàn)類,這也是我第一次將接口真正應(yīng)用到程序中。同時(shí)我們?cè)诿總€(gè)模塊的DAO中應(yīng)用了工廠模式,由一個(gè)factory類實(shí)現(xiàn)所有DAO的單例生成。之后在Manager中調(diào)用這個(gè)實(shí)例實(shí)現(xiàn)操作。而這個(gè)Manager同時(shí)本身也是單例實(shí)現(xiàn)的,由Action進(jìn)行靜態(tài)調(diào)用。可見其中實(shí)現(xiàn)Action控制層和DAO持久層交互的就是Manager模型層,并將兩者嚴(yán)格的分離開來。同時(shí)在Manager中還集合處理了所有來至業(yè)務(wù)功能邏輯和底部數(shù)據(jù)庫的所有異常。因?yàn)閿?shù)據(jù)庫的連接也是在Manager中創(chuàng)建的,但這不影響持久層的獨(dú)立性,因?yàn)檫@是考慮到有時(shí)一次業(yè)務(wù)操作會(huì)進(jìn)行多個(gè)數(shù)據(jù)庫操作、調(diào)用多個(gè)數(shù)據(jù)庫方法,將連接在模型層中創(chuàng)建更便于數(shù)據(jù)庫的高效使用。模型層中對(duì)異常的集中處理,更簡(jiǎn)化了上下控制層和模型層的實(shí)現(xiàn),使其更專注于各自的業(yè)務(wù)實(shí)現(xiàn)。在異常處理上,使用了struts的一種異常處理機(jī)制,在xml配置文件中進(jìn)行異常配置。這樣在Manager中將異常拋出,由struts實(shí)現(xiàn)異常跳轉(zhuǎn)和提示。同時(shí)我們還將自定義的異常處理類也作為公共類公用,這樣就可以在需要的時(shí)候?qū)Ξ惓_M(jìn)行統(tǒng)一的處理。

                        在持久層的實(shí)現(xiàn)上,我們使用了tomcat數(shù)據(jù)庫連接池,在編碼中將數(shù)據(jù)庫連接等方法封裝到公共類中,并且將連接數(shù)據(jù)源作靜態(tài)單例實(shí)現(xiàn),以提高數(shù)據(jù)庫調(diào)用的效率。在DAO的設(shè)計(jì)方面,我們主要針對(duì)實(shí)際的操作對(duì)象和對(duì)應(yīng)的數(shù)據(jù)庫進(jìn)行DAO層方法的封裝。每個(gè)方法盡量實(shí)現(xiàn)一些簡(jiǎn)單的操作。這樣在不同模塊直接有數(shù)據(jù)和操作交互的時(shí)候,只在模型層只要去各個(gè)模塊的DAO中取得需要的方法加以組合,實(shí)現(xiàn)自己的業(yè)務(wù)處理。很好的提高了代碼的復(fù)用性和可維護(hù)性,降低了各個(gè)模塊間數(shù)據(jù)交互處理的設(shè)計(jì)復(fù)雜度。

              //文采太爛, 結(jié)尾的感慨段就不發(fā)了

          主站蜘蛛池模板: 门源| 泾源县| 东明县| 若羌县| 荔波县| 广丰县| 石阡县| 万年县| 台北县| 集安市| 大埔县| 喀什市| 安陆市| 宜宾市| 定西市| 丽江市| 四会市| 昭觉县| 英德市| 攀枝花市| 永胜县| 阳江市| 临城县| 边坝县| 西乌珠穆沁旗| 雅江县| 瑞金市| 昭通市| 通化市| 安仁县| 社会| 郴州市| 仁怀市| 泽州县| 通州市| 新野县| 和平县| 百色市| 叙永县| 丹寨县| 田林县|