摘  要 本文詳細(xì)描述了在嘗試使用極限編程在軟件開發(fā)中的一個(gè)實(shí)現(xiàn)例子,在小步迭代開發(fā)中逐步的實(shí)現(xiàn)用例需要的功能,同時(shí)每個(gè)迭代都能集成實(shí)現(xiàn)的功能。
關(guān)鍵字 極限編程
 
在一次項(xiàng)目開發(fā)中我們開發(fā)組遇到了一個(gè)需求,該需求的要使用的技術(shù)是我們所不熟悉的,就是說在開發(fā)過程中我們必須逐步的掌握該項(xiàng)技術(shù),同時(shí)希望能夠盡可能的保持代碼有好的結(jié)構(gòu),因?yàn)樵诓粩嘣黾庸δ艿倪^程中,會(huì)讓代碼逐漸的變得復(fù)雜降低可閱讀性。
 
該需求的用例很簡(jiǎn)單,就是把圖檔文件保存到
數(shù)據(jù)庫(kù)中,同時(shí)在需要時(shí)提取出來(lái)顯示。但是有的圖檔文件會(huì)比較大,在向數(shù)據(jù)庫(kù)提交過程中可能會(huì)有性能問題,還有圖檔文件格式的問題,(.bmp,.Jpeg)
小組討論的時(shí),大家提出了首先要對(duì)要保存的數(shù)據(jù)進(jìn)行壓縮,同時(shí)對(duì)較大的文件要分割成合適的塊,這樣提交到數(shù)據(jù)庫(kù)中才不會(huì)有性能問題。這樣提取圖檔文件過程中就得對(duì)分割壓縮的數(shù)據(jù)進(jìn)行解壓和拼接才能獲得原始數(shù)據(jù),還有就是文件格式的轉(zhuǎn)換問題。
該項(xiàng)功能我想對(duì)于熟悉的開發(fā)人員來(lái)說可能很簡(jiǎn)單,但是由于我們組的開發(fā)人員沒有類似的開發(fā)經(jīng)驗(yàn),就不可能在一開始獲得優(yōu)良的設(shè)計(jì),只能在不斷的開發(fā)進(jìn)程中改進(jìn)你的設(shè)計(jì),在以往的開發(fā)中我們嘗試過小步迭代開發(fā)的好處,就是在不斷累積中實(shí)現(xiàn)需求的功功能,同時(shí)減少過程中的挫折感——你的每一步都很好的實(shí)現(xiàn)了需求的功能,還能每日集成你的軟件,實(shí)時(shí)掌握你的開發(fā)進(jìn)度。
每次迭代實(shí)現(xiàn)認(rèn)為優(yōu)先級(jí)高的功能。
我們認(rèn)為圖檔文件的保存和提取在開發(fā)中是優(yōu)先級(jí)最高的,我們首先保證可以向數(shù)據(jù)庫(kù)提交圖檔,同時(shí)可以提起圖檔。這樣在我們完成這個(gè)功能后其它開發(fā)組就可以使用這項(xiàng)功能了(雖然會(huì)有因?yàn)閳D片太大保存和提取的效率問題,但是它是可以使用的功能了)。我們使用的開發(fā)工具是Delphi數(shù)據(jù)庫(kù)是
Oracle 
迭代1:文件以二進(jìn)制的形式保存到數(shù)據(jù)庫(kù)中,然后再以二進(jìn)制的形式從數(shù)據(jù)庫(kù)中提取出來(lái)。
       通過查找資料后我們決定Oracle數(shù)據(jù)庫(kù)使用Long Raw 類型的字段來(lái)保存二進(jìn)制數(shù)據(jù),Delphi里面使用TBlobField來(lái)把流裝載都字段中向數(shù)據(jù)庫(kù)提交。本文的例子簡(jiǎn)化了表的設(shè)計(jì)和使用簡(jiǎn)化后的代碼
 
表的設(shè)計(jì)
| 字段名 | 字段類型 | 字段長(zhǎng)度 | 字段說明 |   | 
| FID | Number |   | 主鍵 |   | 
| F_NAME | VarChar2 | 50 | 文件名稱 |   | 
| F_BINARY_DATA | Long Raw |   | 二進(jìn)制圖檔數(shù)據(jù) |   | 
|   |   |   |   |   | 
 
  
 
PRocedure TForm1.Button2Click(Sender: TObject);
 var
  OpenDialog: TOpenDialog;
  lFileFullName: string;
  lBlobStream: TMemoryStream;
begin
  lFileFullName := '';     
  OpenDialog := TOpenDialog.Create(Self);
  lBlobStream := TMemoryStream.Create;
  try
    OpenDialog.InitialDir := extractfilepath(
application.ExeName);
    if OpenDialog.Execute then
      lFileFullName := OpenDialog.FileName;
  
    if lFileFullName <> '' then
    begin
      lBlobStream.LoadFromFile(lFileFullName);
      ClientDataSet1.Append;
      ClientDataSet1.FieldByName('F_ID').Value := 2;
      ClientDataSet1.FieldByName('F_NAME').Value := lFileFullName;
      (ClientDataSet1.FieldByName('F_BINARY_DATA')
 as TBlobField).LoadFromStream(lBlobStream);
      ClientDataSet1.Post;
    end;
  finally
    OpenDialog.Free;
    lBlobStream.Free;
  end;
end;
 
這樣就可以在向數(shù)據(jù)庫(kù)提交圖檔數(shù)據(jù)了,這里圖檔文件先裝載成流然后以二進(jìn)制流的形式提交到數(shù)據(jù)庫(kù)中的。
提取的方式就是
(ClientDataSet1.FieldByName('F_BINARY_DATA')
 as TBlobField). SaveToStream(lBlobStream);
這樣就完成圖檔文件的保存和提取功能。由于對(duì)該項(xiàng)技術(shù)不熟悉實(shí)現(xiàn)該功能花了我們3小時(shí)時(shí)間。在下午下班的時(shí)候我們提交了可以使用的保存圖檔文件的程序。