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

          項目總結(jié)報告

          Posted on 2008-12-23 21:38 wesley1987 閱讀(744) 評論(0)  編輯  收藏 所屬分類: struts學(xué)習(xí)項目
           

                            項目實訓(xùn)心得

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

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

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

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

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

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

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

                         

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

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

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

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

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

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

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

          主站蜘蛛池模板: 大石桥市| 常宁市| 蛟河市| 澜沧| 大邑县| 宁远县| 七台河市| 梁河县| 东光县| 通州市| 阿拉善左旗| 宣汉县| 鄂伦春自治旗| 衡阳市| 平远县| 屏山县| 黔西县| 保山市| 区。| 绥江县| 名山县| 阳谷县| 肥东县| 北宁市| 和静县| 安塞县| 丹棱县| 漳浦县| 三河市| 万州区| 襄垣县| 曲靖市| 鄂托克旗| 察雅县| 当涂县| 横山县| 额济纳旗| 宁蒗| 遂川县| 田林县| 金昌市|