.NET初學者架構設計指南(二)OO設計初次見面

作者: 小陸  來源: 博客園  發布時間: 2008-09-10 14:04  閱讀: 10895 次  推薦: 2   原文鏈接   [收藏]  
 

系列文章導航:

.NET初學者架構設計指南(一)Hello world的時代

.NET初學者架構設計指南(二)OO設計初次見面

.NET初學者架構設計指南(三)設計模式

.NET初學者架構設計指南(四)Model-View-Controller

 

  我使用OO技術第一次設計軟件的時候,犯了一個設計者所能犯的所有錯誤。那是一個來自國外的外包項目,外方負責功能設計,我們公司負責程序設計、編碼和測試。

  第一個重要的錯誤是,我沒有認真的把設計說明書看明白。功能點設計確實有一些問題,按照他們的設計,一個重要的流程是無法實現的。于是我在沒有與投資方溝通的情況下,擅自改動了設計,把一個原本在Linux系統上開發的模塊改到了Windows系統上。結果流程確實是實現了,但是很不幸,根本不符合他們的需要,比起原先的設計差的更多。在詢問了這個流程的設計意圖之后,我也清楚了這一點。對方的工程師承認了錯誤,但是問題是:“為什么不早說啊,我們都跟領導講過了產品的構架,也保證了交貨時間了,現在怎么去說啊?”。他們設計的是一個蘋果,而我造了一個桔子出來。最后和工程師商議的結果是:先把桔子改成設計書上的蘋果,按時交貨,然后再悄悄的改成他們真正需要的香蕉。這時候距離交貨的時間已經不足三天了,于是我每天加班工作到天明,把代碼逐行抽出來,用gcc編譯調試。好在大部分都是體力活,沒有什么技術含量,即使在深夜大腦半休眠的情況下仍然可以接著干。

  項目中出現的另外一個錯誤是:我對工作量的估計非常的不準確。在第一個階段的時候,按照功能設計說明書中的一個流程,我做了一個示例,用上了投資方規定的所有的技術。當我打開瀏覽器,看到頁面上出現了數據庫里的“Tom,Jerry,王小帥”,就愉快的跑到走廊上去呼吸了一口新鮮空氣,然后樂觀的認為:設計書都已經寫好了,示例也做出來了,剩下的事情肯定就象砍瓜切菜一樣了。不就是把大家召集起來講講設計書,看看示例,然后撲上去開工,然后大功告成。我為每個畫面分配的編碼工作量是三個工作日。結果卻是,他們的設計并不完美,我的理解也并不正確,大家的思想也并不一致。于是我天天召集開會,朝令夕改,不斷返工。最后算了一下,實際上寫完一個畫面用的時間在十個工作日以上。編碼占用了太多的時間,測試在匆忙中草草了事,質量……能掩蓋的問題也就只好掩蓋一下了,性能更是無暇顧及了。

  還有一個方面的問題是出在技術上的,這方面是我本文要說的重點。按照投資方的方案,系統的主體部分需要使用J2EE框架,選擇的中間件是免費的JBoss。再加上Tomcat作為Web服務器,Struts作為表示層的框架。他們對于這些東西的使用都是有明確目的,但是我并不了解這些技術。新手第一次進行OO設計,加上過多的新式技術,于是出現了一大堆的問題。公司原本安排了一個牛人對我進行指導,他熟悉OO設計,并且熟悉這些開源框架,曾熟讀Tomcat和Struts源代碼。可是他確實太忙,能指導我的時間非常有限。

  投資方發來設計書以后,很快就派來了兩個工程師對這個說明書進行講解。這是一個功能設計說明書,包括一個數據庫設計說明書,和一個功能點設計說明。功能點說明里面敘述了每一個工作流程,畫面設計和數據流程。兩位工程師向我們簡單的說明了產品的構想,然后花了一個多星期的時間十分詳細的說明了他們的設計,包括數據表里每一個字段的含義,畫面上每一個控件的業務意義。除了這些功能性的需求以外,他們還有一些技術上的要求。

  為了減少客戶的擁有成本,他們不想將產品綁定在特定的數據庫和操作系統上,并且希望使用免費的平臺。于是他們選擇了Java作為開發語言,并且使用了一系列免費的平臺。選用的中間件是JBoss,使用Entity Bean作為數據庫訪問的方式。我們對Entity Bean的效率不放心,因為猜測他運用了大量的反射技術。在經過一段時間的技術調查之后,我決定不采用Entity Bean,而是自己寫出一大堆的Value Object,每個Value Object對應一個數據庫表,Value Object里面只有一些setter和getter方法,只保存數據,不做任何事情。Value Object的屬性與數據庫里面的字段一一對應。與每個Value Object對應,做一個數據表的Gateway,負責把數據從數據庫里面查出來塞到這些Value Object里面,也負責把Value Object里面的數據塞回數據庫。

 

  按照這樣的設計,需要為每一個數據表寫一個Gateway和一個Value Object,這個數量是比較龐大的。因此我們做了一個自動生成代碼的工具,到數據庫里面遍歷每一個數據表,然后遍歷表里面的每一個字段,把這些代碼自動生成出來。

 

  這等于自己實現了一個ORM的機制。當時我們做這些事情的時候,ORM還是一個很陌生的名詞,Hibernate這樣的ORM框架還沒聽說過。接著我們還是需要解決系統在多種數據庫上運行的問題。Gateway是使用JDBC連接數據庫的,用SQL查詢和修改數據的。于是問題就是:要解決不同數據庫之間SQL的微小差別。我是這樣干的:我做了一個SqlParser接口,這個接口的作用是把ANSI SQL格式的查詢語句轉化成各種數據庫的查詢語句。當然我沒必要做的很全面,只要支持我在項目中用到的查詢方式和數據類型就夠了。然后再開發幾個具體的Parser來轉換不同的數據庫SQL格式。


2
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()