5、重構數據庫訪問代碼
我們原來在開發過程當中,常常要求對有關數據庫的操作進行一些封裝,并把它們獨立為一個DAL層。DAL層其實就是一種和持久層的交互媒介。通過這種分層方式,開發者往往只需要修改DAL層的代碼就可以滿足變更,而不用重寫整個應用系統。
伴隨著敏捷方法和大型重構的出現,DAL的優勢又一次得到了有力的證明:對于那些有關數據庫架構的修改所帶來的影響只會被限制在DAL層。也只有這樣,我們才能夠讓我們后續的工作足夠的少。下圖給出了這樣一種分層結構:
5.1同步修改數據庫模式和數據庫訪問代碼
總體來說,應用系統之所以要保存數據,是為了在之后在讀出它們。
當和關系數據庫整合的時候,你就不得不創建一些冗余的數據類。業務對象作為數據類需要和數據庫中的數據進行對應。所以一旦重構這些業務對象,就不得不同時修改數據庫和應用系統。
這就意味著,在重構過程中,有四個潛在的地方可能需要修改:
1、有關這些業務對象的數據庫模式。
2、應用程序中定義這些業務對象的類。
3、從數據庫讀入數據,并將數據裝入業務對象的代碼。
4、把業務對象的數據持久化到數據庫中的代碼。
大體上,讀和寫數據作為直接和業務對象有關的操作,可以任意的放置在系統的任意地方。而一個設計精良的系統至少會保證有關某一個業務對象的持久化操作只會出現在特定的地方。然而不幸的是,在從數據庫讀取業務對象的數據的時候,你就往往不能夠保證這一點了,因為處于一些數據展示方面的要求,有可能會通過連接操作一次性的載入多個對象。
最為常見的重構業務對象的流程為:
1、以增量形式修改數據表:
總是添加新的字段;
要刪除的字段在代碼中仍然保留,但是被標記為“ 過時”;
通過復制來修改字段,老的字段被標記為“過時”。
2、為新的字段指派合適的默認值。
3、在修改業務對象的時候,要確保新添加字段的數據能夠被保存到業務對象中來,同時那些被聲明為“過時”的字段仍然能夠被提交而不會在運行過程中出現錯誤;如果必要的話,把那些確實要丟棄的字段聲明為“過時”。
4、所有數據的持久化操作必須接受新字段;
5、所有數據的裝載操作都必須確保這些新添字段的數據能夠讀入;所有對那些過時字段進行訪問的讀操作都應當被淘汰掉。
6、所有的數據持久化操作除去那些對過時字段的寫操作。
7、過時的字段從數據庫中刪除;
8、過時的字段從業務對象中刪除。
當然上面這些操作并不是一個通用的操作,他不一定適用于所有的情形。對于特定的重構,這些操作往往需要作出修改。
現在假設我們希望為我們的客戶對象添加一個“國家”的字段(也許在以前,我們只接待德國的客戶,而現在我們的業務擴展到了全世界)。為了達到這個目的,我們將會首先引入新的字段到類Customer中。這里我們把G(Germany)作為默認值來保存。到現在為止,這個字段既不會被寫,也不會被讀。
現在繼續下一步,我們把新的字段添加到數據庫的模式中來,然后我們讓每一個新的Customer都會默認得把G當作自己的國家。然后讀取Customer數據的操作就可以被修改了,接著是保存。最后新的字段的輸入框會被放到GUI上。
簡而言之,過程如下:
1、向類中添加新的字段;
2、向數據庫模式中添加新的字段;
3、讓字段可讀;
4、讓字段可以保存;
5、在GUI上可視。
每一步之后,我們的軟件系統都處在一種一致性的狀態中。直到最后一步完成,達到了我們想要的效果。而在這一步之前,系統只能夠處理德國的客戶。
當然,事情并不是總象我們所想象的那般簡單:現在我們假設這樣一個例子,我們希望把國家代碼以一個數字來代替,而不是這個國家的首字母。為了達到這一點,“國家”字段的類型必須從String型轉換為Integer型,這個變化既要應用于程序代碼中,也要應用于數據庫中。
下面一系列的操作將要完成這個需求:
1、向類中添加新字段,然后指定默認值。
2、修改數據庫模式,指定默認值。添加對這個字段進行保存的有關代碼;
3、添加用來進行業務對象數據載入的代碼;
4、把所有GUI上面有關對于舊字段的訪問轉換為對于新字段的訪問。
5、去除舊字段的載入代碼;
6、去除舊字段的保存代碼;
7、從類中刪除舊字段;
8、從數據庫模式中刪除舊字段。
注意第一點和第二點:在這里不要使用靜態默認值,因為默認值是依賴于已經存在的國家編碼的。需要一個額外的算法來計算已經存在的那些國家的數字表現形式?;谶@個目的,這個額外的算法有可能去訪問數據庫中的有關國家、編號對應的表。
進一步看這個過程,你會發現,載入數據和保存數據總是無法在一步完成。事實是,系統中和這兩個操作有關的過程往往需要經過多次變動才能滿足要求。
當然,讓重構的最后一步去處理這些事情是相當誘人的。一旦第三步中有關數據載入的操作被去掉,系統可能開始的時候看上去還不錯,但不可避免的就是你可能在一段時間之內得不到存放在數據庫中的真正的數值,取而代之的是你的那個默認值。這樣的潛在問題會四處爆發,你的相關的代碼都不能幸免于難。
posted on 2007-08-23 21:00
littlegai 閱讀(206)
評論(0) 編輯 收藏 引用