宋娜娜
(鄭州航空工業(yè)管理學院 信息科學學院,河南 鄭州 450015)
管理信息系統(tǒng)(Management Information System,MIS)是一個建立在網(wǎng)絡(luò)環(huán)境下的綜合信息管理系統(tǒng),通過計算機網(wǎng)絡(luò),可實現(xiàn)企業(yè)不同部門之間數(shù)據(jù)的流通和共享,使得決策部門能及時得到需要的數(shù)據(jù),并將決策信息反饋給各部門.管理信息系統(tǒng)的開發(fā),無論是使用流行的第4代編程語言開發(fā),還是基于Web的應用程序,人們常采用3層(表示層、業(yè)務層和持久層)體系結(jié)構(gòu),其中,對數(shù)據(jù)庫的使用是必不可少的.如何方便地實現(xiàn)數(shù)據(jù)庫的訪問是管理信息系統(tǒng)開發(fā)過程中需要重點考慮的部分.
隨著面向?qū)ο蠹夹g(shù)的成熟,在各種軟件開發(fā)環(huán)境中都提供了對數(shù)據(jù)庫訪問的支持,一般是通過一組類來實現(xiàn)的,在這些類之間存在著復雜的相互依賴關(guān)系.在面向?qū)ο蟮脑O(shè)計中,最困難的是尋找合適的對象來構(gòu)造軟件系統(tǒng),從而設(shè)計出理想的類,由于要考慮多種因素諸如封裝、粒度以及靈活性,而這些因素往往是沖突的,所以如何進行權(quán)衡取舍找到一個合理的方案是相當困難的.
在軟件設(shè)計工作中,當找到對于某類問題好的解決方案時,一般會從中抽象出模型并反復使用,這有助于我們將新的設(shè)計建立在以往工作的基礎(chǔ)上并復用以往成功的設(shè)計方案,使得面向?qū)ο蟮脑O(shè)計更靈活和更具復用性.目前,面向?qū)ο蠹夹g(shù)的研究人員正在嘗試使用設(shè)計模式這一概念.所謂設(shè)計模式,就是將這些面向?qū)ο蟮脑O(shè)計經(jīng)驗按模式名稱、問題、解決方案和效果這4個基本要素系統(tǒng)地歸類以便重用,從而構(gòu)成不同設(shè)計之間通信的基礎(chǔ).它是一種可重用的“財富”,可以應用于不同的問題域.本文使用面向?qū)ο箝_發(fā)技術(shù),應用設(shè)計模式,提出了一個在.NET開發(fā)環(huán)境中數(shù)據(jù)庫訪問的解決方案.
設(shè)計模式的思想最初來源于建筑領(lǐng)域,建筑師 Christopher Alexander 首先提出了設(shè)計模式的概念,盡管他描述的是建筑和規(guī)劃中的設(shè)計模式,但其中體現(xiàn)的思想也適用于建筑設(shè)計以外的一些領(lǐng)域,例如面向?qū)ο筌浖O(shè)計領(lǐng)域.只是在這里,對象和接口取代了墻和門窗,但模式的核心都是一樣的,即在某種環(huán)境下解決特定問題的通用方法[1].
設(shè)計模式關(guān)注的是特定設(shè)計問題及其解決方案,在每種模式中均描述一個設(shè)計問題和一個經(jīng)過驗證的、通用的解決方案,這個解決方案是對反復出現(xiàn)的設(shè)計結(jié)構(gòu)進行識別和抽象得到的,它通常由多個對象組成,模式中不僅描述對象的設(shè)計,而且描述對象間的通信.同時,在每種模式中還包括該模式的適用環(huán)境、使用效果和利弊的權(quán)衡以及該模式是否與其他模式有關(guān)等內(nèi)容.
設(shè)計模式的基本描述格式通常包括:
(1)模式的名稱;
(2)模式要解決的問題及模式所適用的環(huán)境;
(3)一個通用的解決方案,包括模式中的組件、組件間的交互以及它們的職責、關(guān)系和協(xié)作;
(4)使用這種解決方案會產(chǎn)生的效果.
依據(jù)目的不同,模式可分為創(chuàng)建型模式、結(jié)構(gòu)型模式和行為模式3類.創(chuàng)建型模式與對象的創(chuàng)建有關(guān);結(jié)構(gòu)型模式處理類和對象的組合,將一組對象組合成一個大的結(jié)構(gòu),例如復雜的用戶界面;行為模式描述類或?qū)ο蟮慕换ズ吐氊煼峙?,定義對象間的通信和復雜程序中的控制流.
Facade模式要求一個子系統(tǒng)的外部與其內(nèi)部的通信必須通過一個統(tǒng)一的門面(Facade)對象進行.Facade模式提供了一個高層次的接口,使得子系統(tǒng)更易于使用.Facade模式的門面類將客戶端與子系統(tǒng)的內(nèi)部復雜性分隔開,使得客戶端只需要與門面對象打交道,而不需要與子系統(tǒng)內(nèi)部的很多對象打交道[2].
(1)意圖
為子系統(tǒng)中的一組接口提供一致的界面,F(xiàn)acade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用.
(2)適用性
為一個復雜子系統(tǒng)提供一個簡單接口時,可以使用Facade模式.
子系統(tǒng)往往因為不斷演化而變得越來越復雜.大多數(shù)模式使用時都會產(chǎn)生更多更小的類,這使得子系統(tǒng)更具可重用性,也更容易對子系統(tǒng)進行定制,但這也給那些不需要定制子系統(tǒng)的用戶帶來一些使用上的困難.Facade可以提供一個簡單的缺省視圖,這一視圖對大多數(shù)用戶來說已經(jīng)足夠,而那些需要更多的可定制性的用戶可以越過Facade層.
客戶程序與抽象類的實現(xiàn)部分之間存在著很大的依賴性.引入Facade將這個子系統(tǒng)與客戶以及其他的子系統(tǒng)分離,可以提高子系統(tǒng)的獨立性和可移植性.
當需要構(gòu)建一個層次結(jié)構(gòu)的子系統(tǒng)時,使用Facade模式定義子系統(tǒng)中每層的入口點.如果子系統(tǒng)之間是相互依賴的,可以讓它們僅通過Facade進行通訊,從而簡化了它們之間的依賴關(guān)系.
(3)結(jié)構(gòu)圖
圖1 Facade模式的通用結(jié)構(gòu)圖Fig.1 General structure of Facade pattern
現(xiàn)在有多種流行的數(shù)據(jù)庫,包括Microsoft公司的Access、Foxpro、SQL Server,IBM公司的DB/2、Oracle、Sybase等.這些數(shù)據(jù)庫都支持SQL語言,所以似乎應該是可以互換使用的,但是由于這些數(shù)據(jù)庫系統(tǒng)都有各自的用戶接口和編程接口以及不同的特點,盡管它們都支持SQL,但每個數(shù)據(jù)庫系統(tǒng)都有自己的接受SQL查詢和返回查詢結(jié)果的方法,所以這些系統(tǒng)不能互換使用.
為了解決這個問題,在.NET平臺上提供了一個新的數(shù)據(jù)庫訪問模型ADO.NET,它由一組互相聯(lián)系類組成[3]:
(1)OleDbConnection——代表了實際到數(shù)據(jù)庫的連接,實際編程時可以實例化該類的一個對象,在需要時打開和關(guān)閉該對象,在使用完成后關(guān)閉它以便垃圾回收.
(2)OleDbCommand——代表發(fā)送給數(shù)據(jù)庫的一個SQL命令,該命令可能不返回結(jié)果.
(3)OleDbDataAdapter——在數(shù)據(jù)庫和本地數(shù)據(jù)集之間的數(shù)據(jù)交互提供一個橋梁,可以指定OleDbCommand、數(shù)據(jù)集和數(shù)據(jù)連接.
(4)DataSet——代表一個或多個數(shù)據(jù)表或查詢返回結(jié)果.
(5)DataTable——代表數(shù)據(jù)庫中的一個數(shù)據(jù)表或從查詢返回的表.
(6)DataRow——代表DataTable中的一行.
這些類相互之間是緊密聯(lián)系的,使用以上這組類進行數(shù)據(jù)庫訪問的一般方式如下:
a、首先創(chuàng)建一個數(shù)據(jù)庫鏈路;
b、請求一個記錄集合;
c、把記錄集合暫存到DataSet;
d、如果需要,返回第2步(DataSet可以容納多個數(shù)據(jù)集合);
e、關(guān)閉數(shù)據(jù)庫鏈路;
f、在DataSet上作所需要的操作.
對數(shù)據(jù)庫的訪問需要這些類配合完成,直接使用這些類來完成數(shù)據(jù)庫訪問的任務,類之間的關(guān)系復雜,使用起來不易掌握.Facade模式是管理這些類對象的理想方法.Facade模式由兩個類組成:Dbase和DBTable,其中Dbase包裝了ADOConnection、Database、DataTable、ADOCommand、ADODatasetCommand類,DBTable包裝了ADOCommand、Dataset、Datarow、Datatable、ADODatasetCommand類.具體實現(xiàn)如下:
public abstract class DBase {
protected OleDbConnection conn;
private void openConnection() {
if (conn.State == ConnectionState.Closed){
conn.Open ();
}
}
private void closeConnection() {
if (conn.State == ConnectionState.Open ){
conn.Close ();
}
}
public DataTable openTable (string tableName) {
OleDbDataAdapter adapter = new OleDbDataAdapter ();
DataTable dtable = null;
string query = "Select * from " + tableName;
adapter.SelectCommand = new OleDbCommand (query, conn);
DataSet dset = new DataSet ("mydata");
try {
openConnection();
adapter.Fill (dset);
dtable = dset.Tables [0];
}
catch(Exception e) {
Console.WriteLine (e.Message );
}
return dtable;
}
public DataTable openQuery(string query) {
OleDbDataAdapter dsCmd = new OleDbDataAdapter ();
DataSet dset = new DataSet ();
DataTable dtable = null;
try {
dsCmd.SelectCommand = new OleDbCommand(query, conn);
openConnection();
dsCmd.Fill(dset, "mine");
dtable = dset.Tables[0];
closeConnection();
return dtable;
}
catch (Exception e) {
Console.WriteLine (e.Message);
return null;
}
}
public void openConnection(string connectionString) {
conn = new OleDbConnection(connectionString);
}
public OleDbConnection getConnection() {
return conn;
}
}
類DBTable只給出粗略的定義:
public class DBTable {
protected DBase db;
protected string tableName;
private bool filled, opened;
private DataTable dtable;
private int rowIndex;
private Hashtable names;
private string columnName;
private DataRow row;
private OleDbConnection conn;
private int index;
public DBTable(DBase datab, string tb_Name) {//-----}
public void createTable() {//-----}
public bool hasMoreElements() {//-----}
public int getKey(string nm, string keyname){//-----}
public virtual void makeTable(string cName) {//-----}
private void closeConn() {//-----}
private void openConn() {//-----}
public void openTable() {//-----}
public void delete() {//-----}
}
在實際應用開發(fā)中,可使用從這兩個類派生的子類并加以實例化.Facade模式為客戶提供了一個簡單的編程接口,客戶不需使用復雜的數(shù)據(jù)庫訪問子系統(tǒng)部件.而且,使用Facade模式并不阻止客戶使用底層的復雜的子系統(tǒng)部件,還可以更改底層的子系統(tǒng)而不更改客戶代碼.
在當前的軟件開發(fā)中,良好的軟件設(shè)計方法能夠大幅度提升軟件設(shè)計的質(zhì)量和效率.以往,只有具有豐富軟件設(shè)計經(jīng)驗的設(shè)計職員才能設(shè)計出結(jié)構(gòu)均衡、質(zhì)量保證的軟件;現(xiàn)在,應用軟件設(shè)計模式方法能夠很好地重用優(yōu)秀的軟件設(shè)計方案,進而得到良好的設(shè)計結(jié)果.本文介紹了設(shè)計模式的一般特點,并詳細分析了Facade模式.在此基礎(chǔ)上,提出了一個使用Facade模式的數(shù)據(jù)庫訪問模型,并給出了實際的實現(xiàn).該模型應用在實際MIS開發(fā)過程中,可以使開發(fā)人員避免使用以往的復雜的數(shù)據(jù)庫訪問技術(shù),從而大大提高開發(fā)效率.
參考文獻:
[1] 鄒娟,田玉敏. 軟件設(shè)計模式的選擇與實現(xiàn)[J] .計算機工程,2004(10) : 29-31.
[2] ERICH G, RICHARD H, RALPH J, et al. 設(shè)計模式——可復用面向?qū)ο筌浖幕A(chǔ):英文版[M].北京:機械工業(yè)出版社,2002:121-127.
[3] TOM A. C#技術(shù)內(nèi)幕[M].侯曉霞,柴洪輝,譯.北京:清華大學出版社,2002:290-305.