新手的第一個工程的總結(第一次寫文章,請前輩們指教)

napoleonn發表於2004-10-01
孔子說:“學而不思則罔,思而不學則殆。”從我做專案的經歷,我深深感嘆古人鬧腔邸?

去年我畢業設計時候做的一個專案是畢業設計管理系統。當時老師給我們的要求是用Jsp 和 Javabean來實現。我主要負責專案建模和Javabean部分,後來負責資料庫的同學被SARS困在家不能返校,所以資料庫部分也由我來完成了。當時對java的知識是非常貧乏的,只有簡單的語法基礎,連jsp、 javabean都是第一次聽到過。不知道從哪裡開始,於是就研究老師給的一個非常簡單的演示專案,首先覺得javabean是個比較簡單的東西,於是就先開始分析使用者需求。

需求怎麼來描述呢?由於學校教育的侷限,加上自己研究了很長時間高數,政治,英語(幹什麼用大家都明白吧),造成了知識的嚴重匱乏。我就以參加畢業設計人員為中心,建立他們的需求列表。但是這樣的需求描述是非常片面的,幾乎都是靜態的需求,而且很難設計幾個使用者的互動過程,和某些狀態的改變。而且這種需求是否真正符合需要是個問題,所以我立刻和同學一起設計web介面,目的很簡單,因為使用者的需求都是透過介面來實現的,對介面的設計能涵蓋最終提交使用者的功能,而且還能發掘很多非使用者的需求。這樣我在實現這些功能的時候會有數。在一年後當我仔細看過用例分析,uml後感覺是如獲至寶。心頭的結全部開啟。

建模該怎麼建?當時真是什麼概念都沒有,雖然知道uml,但是僅僅知道皮毛。於是我就很簡單的從物件的角度考慮問題,首先找畢業設計管理系統中涉及的人員,這個是很明顯找出來的,涉及到學生,教師,管理員,進一步提取出專案物件,各個人員之間通訊的訊息物件,畢業設計文件物件,等等。接下來設計資料庫表,由於學校教資料庫的時候只有講述了ER圖到關係模式的轉化,而根本沒有講ODL到關係模式的轉化(現在看來,ODL應該更好,對理解O/R Mapping有更多的幫助。)於是就畫ER圖,建立各種表,設定主鍵,外來鍵,等等。

我遇到的首要問題就是學生,教師,管理員該怎麼辦,每一個物件建一個表,似乎也沒有什麼問題。但是在建立訊息物件的時候就有問題了,因為訊息是要在學生,教師,管理員任意兩者都能傳送的,我建訊息表的時候是這樣設計的:一個訊息的內容,訊息的傳送人,訊息的接收人(訊息內容和傳送人一個表,為解決冗餘接收人單獨一個表),這樣這個訊息就有很大的靈活程度了,訊息傳送人可以是三種角色間的隨便一種,更進一步,這樣的訊息可以是系統生成的訊息,而且接收者可以是隨便哪種角色。但隨之帶來的問題是:訊息傳送人、接收者該去參照誰呢?顯然填一個傳送者、接收者的id是不夠的,必須連傳送者的角色也填上。第二種方法,每個角色有一個收到訊息的列表,讓它去參照單一的訊息表id,這樣也能解決問題。第三種方法,把學生,教師,管理員合併成一個使用者表,那麼訊息傳送人,接收人只要簡單的參照一個通用的使用者id了。這種合併子類的方法會造成教師,管理員的行有些null值,但是考慮到教師和管理員的數目遠遠小於學生的數目,所以這樣的冗餘是忽略不計的。最後我還是選擇了最後一種方法。不過我還是覺的是物件模型向關係模型的一種妥協。

接著我著手設計javabean,訪問資料庫用的是單純的JDBC。因為我對前臺介面要訪問一個物件的哪些屬性是不瞭解的,事實上也不該瞭解。所以我只能從資料庫取出一個完整的物件,讓他來決定究竟要訪問哪些屬性。而且對物件的修改也是這樣,前臺修改好新的物件的屬性,我來進行更資料庫的同步。於是我的javabean就出現了這樣的方法:load()、 store()、 update()、delete()這樣的物件和資料庫表同步的方法。這在一年後的今天看來,實際上我已經自己做了一個O/R Mapping的工作了。當時自己做這樣的O/R Mapping是相當痛苦的事情,而且用的方法也是最粗淺的,就是整個物件更資料庫同步,即使沒有修改的屬性也同步,所以要同步的話,必須要先把物件從資料庫取出來,修改後再寫回。而且要求所有屬性必須是nullable的non-primitive型別。第二個問題,對錶中的外來鍵怎麼反應到bean中?比如每個學生有一個輔導教師,在資料庫中很明顯學生表需要一個外來鍵參照教師id,但是在StudentBean中教師屬性是寫Teacher物件呢,還是Teacher id值呢,按照物件導向,很明顯應該Teacher物件,但是我就覺得這是個多麼heavy的事情呀!再想想教師情況,一個教師有一個Collection的Student物件是多麼“重”!意味著load一個教師要load所有的students。於是我採用的方法是:還是用物件,比如teacher 的學生屬性,還是一個collection Student物件,同時提供了一個loadStudents()的方法,load teacher物件的時候並不load 學生屬性,只有bean的使用者顯式呼叫loadStudents()的時候才會載入一組student物件,這在現在看來似乎我自覺不自覺的實現了lazy loading?

現在審視當時編寫的javabean,犯的最大最大的錯誤就是把data access object和business workflow混在一起了。比如把教師所有要呼叫的功能都放在教師物件裡面,而有些功能有時是要涉及幾個bean的。現在看了簡直是慘不忍睹的設計,雖然當時也困惑過,但是卻沒有動動腦筋來解決,我現在看了session bean 的思路時,覺得是那麼的舒暢、自然。

當時困惑的還有關於jsp的處理,jsp只是負責顯示的,但是為什麼一個jsp提交的資料要給另外一個jsp去處理呢?這是很不舒暢的做法,於是有了最初的servlet做控制器的想法,但是當時顧不了研究那麼多,也沒有最終實現,畢竟前臺不是我負責的。當我現在知道了Structs,MVC Model2的時候,我以前的困惑都隨之解決。又一次感覺非常舒暢。

以上是我一個新手的第一個專案的一些情況,是在非常閉塞的環境裡面做的,上網都是電話卡撥號,根本沒有接觸到主流技術,但是正是這種環境下積累的無數困惑,使我遇到EJB、Hibernate、Structs的時候如飲甘露,迅速的吸收了他們的營養。否則我想學習這些技術無疑是很耗時間的,因為根本沒有更這種技術產生共鳴,不知道他們搞那麼多框框究竟想幹什麼,而我產生了一種共鳴,他們這些框框,正是開我心頭疑惑的鎖。

又回到開頭孔子的話,事實上我在做專案中,一直都是按自己的思考方式在“思”而沒有去“學”,所以常常感到疲倦而無所得,即“殆”。但是如果不實際自己去動手做,而光光學j2ee,必然會很迷惑,即“罔”。我感覺先有困惑再有解決,是掌握技術的十分有效的而且鞏固的方法,而且很有創造性,是屬於歸納的思考方式。所以碰到問題,首先需要想想按常理該怎麼去解決,再去尋找別人怎麼解決的,這樣自己提高會十分迅速。

相關文章