全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2036
推到 Plurk!
推到 Facebook!

一個OO的實例

 
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-14 21:56:00 IP:218.161.xxx.xxx 未訂閱
商用程式連接到資料庫的動作,幾乎是無法避免的.但,有時礙於網路等外在環境的影響,這個動作有時很快就可以完成,有時卻要使用者等上老半天,甚至讓使用者以為當機.尤其是3-tire的程式,在連接到apserver時,情況更是明顯.    通常,我都用以下的程式碼來解決:    
Screen.Cursor:=crSQLWait;
try
  try
    SocketConnection1.Connected:=True;
  except
    on E:Exception do
    begin
      raise Exception.Create('連接遠端伺服器失敗,錯誤訊息如下:'#13 e.Message);
    end;
  end;
finally
  Screen.Cursor:=crDefault;
end; 
像這樣會需要時間去處理,讓user等待的情況其實滿多的.尤其是報表,你可能會先需要下SQL指令拉出這個月所有的出貨明細,然後再下SQL指令拉出上個月的出貨明細,接著再依客戶別統計,最後成為一個上個月與這個月的客戶出貨比較表.尤其是資料量大時,光是拉半個月的資料出來都會等上老半天,更何況完成整個報表.老實說,光是把游標轉成crSQLWait,有時很難讓使用者相信程式沒有當機,如果能在下SQL指令時顯示個"讀取XX月出貨明細資料中,請稍待..."的訊息,在依客戶別統計時顯示個"資料統計中,請稍待...",藉者顯示訊息的不斷變換,我想使用者比較容易相信:嗯,程式還沒有當機. 在決定要讓程式變的很精緻及親切後,首先就遇到一個問題:如果要顯示訊息,甚至加上個動畫(就是那個有個手電筒在那裡照呀照的那個),得要對每個查詢的form一一去加元件,且一一的去修改需要的程式碼,這是個負擔很重的工作.改第一個pas,可能覺得還OK,但一個系統計算了一下,將近20個報表的程式要改,嗯....,加薪我就改!! 於是思路一改,是否可以寫另外一個TfrmWait的form,專門負責顯示動畫及訊息,然後每個報表都來呼叫這個畫面,這樣最少不用每個form都要重新去加元件,而且萬一後面還需要再加其他顯示元件(例如ProgressBar等),那也不用每個form再去加一次. 發表人 - change.jian 於 2004/08/14 21:56:37 發表人 - change.jian 於 2004/08/14 23:26:53
附加檔案:54788_Decorator.rar
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-14 22:01:50 IP:218.161.xxx.xxx 未訂閱
好,問題來了:如果是正常的寫法可能如下:  
Screen.Cursor:=crSQLWait;
try
  try
    StateMessage.Capton:='連接遠端伺服器中,請稍待...';
    Animate1.Active:=True;
    SocketConnection1.Connected:=True;
    StateMessage.Capton:='遠端伺服器連接成功';
  except
    on E:Exception do
    begin
      StateMessage.Capton:='連接遠端伺服器失敗';
      raise Exception.Create('連接遠端伺服器失敗,錯誤訊息如下:'#13 e.Message);
    end;
  end;
finally
  Animate1.Active:=False;
  Screen.Cursor:=crDefault;
end; 
如果我要讓訊息的顯示統統在TfrmWait裡,那我要如何讓SocketConnection1在原來的form裡執行,而讓StateMesssage及Animate1在TfrmWait裡執行,且在SocketConnection1連線後TfrmWait自動關閉,接著讓原來的form繼續執行;換言之,我要如何把上面這段程式改成以呼叫另外一個form的方式來執行? 如果TfrmWait能夠在被叫起來後,就去執行呼叫這個TfrmWait的程式所指定的程式碼就可以解決了.例如,在上面,我可以在TfrmWait.ShowModal前,告訴TfrmWait你要去執行"SocketConnection1.Connected:=True;"的指令,那麼我只要接著呼叫TfrmWait.ShowModal即可. 想法有了之後,程式碼的實作就容易多了. 首先,在TfrmWait的public宣告一個procedure,允許外界對TfrmWait設定當TfrmWait被呼叫ShowModal時,應該執行的程序.程序的型式,就用最常用的TNotifyEvent就好了,而除了要執行的程序外,TfrmWait執行這個程序時該顯示什麼訊息給使用者,播什麼動畫,也應該一併告知,所以這個procdure的參數就出來了,如下:
procedure AddProcToShowModal(aProc:TNotifyEvent;CommAVI:TCommonAVI;DisplayMessage:String;Sender:TObject);
而procedure的內容,其實很簡單,就是把aProc等傳入的參數存起來,等待showModal時一起取出來執行即可.至於原來的程式,就變成以下的模樣:
frmWait:=TfrmWait.Create(Self);
try
  frmWait.AddProcToShowModal(ConnectedSocket,aviFindComputer,'連接遠端伺服器中,請稍待...',SocketConnection1);
  //告訴frmWait,在執行ConnectedSocket時,要播aviFindComputer這個動畫,要顯示'連接遠端伺服器中,請稍待...'的訊息,
  //而SocketConnection1即是執行ConnectedSocket時要傳入的參數
  frmWait.ShowModal;
finally
  frmWait.Free;
end;
當然,原來的form裡,就該把"SocketConnection1.Connected:=True;"這個指令放在一個符合TNotifyEvent的procedure裡,好讓TfrmWait.ShowModal時可以呼叫,如下:
procedure TfrmMain.ConnectedSocket(Sender: TObject);
begin
  SocketConnection1.Connected:=False;
  SocketConnection1.Connected:=True;
end;
其他詳細的程式碼,...有空再解說吧,如果有問題的話可以把問題post上來,歡迎大家一起討論.底下才是我想表達的重點: 發表人 - change.jian 於 2004/08/14 23:32:13
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-14 22:05:09 IP:218.161.xxx.xxx 未訂閱
物件導向設計想法,我只能說,發明的人真的是超天才!!相對於以往強調結構化的設計,這是個重大的突破.只是感覺一般對於Delphi所提供的物件導向設計精神,似乎用的不多(VCL元件除外).像本站裡大部分的問題,都圍繞在某個技術如何寫,某個component如何用,但我想說,程式碼的佈置才是程式設計的重點,這關係著程式開發的成本/時間.常常看到那種一個procedure裡寫了近百行甚至更多的程式碼,或者其實只是單純的把程式碼一一切成一個一個的procedure,然後再一一呼叫.這樣的程式碼佈置,如果碰上後續的修改或維護,往往很花時間.而以上面的例子來說,可以把一個顯示程式目前動作內容的功能獨立在一個物件裡,然後供其他的程式叫用,雖然第一次可能會花點時間,但往後如果再有需要這樣的功能,只需要叫用這個物件即可.除了可以減少開發時間,對於程式的寫法統一也有很大的幫助. 這裡,我只是做一拋磚引玉的動作,其實並沒有什麼很難的技術.大部分的人都把重點放在某種專門的技術,某個演算法的實作,但對於如何發揮OO的程式實例,其實很少,因為這無關程式的執行結果,且一直以來,如何以OO來解決問題也都是各自發揮,各憑感覺.就算真的寫出來了,也沒有什麼標準可以決定好或不好.不過我認為,好的程式碼寫法是減少程式設計人員工作量的一個好方法!! 發表人 - change.jian 於 2004/08/14 23:37:49
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-16 00:56:04 IP:61.70.xxx.xxx 未訂閱
change.jian 大大真是熱心,本想看看各位看了change.jian 的文章之後,必有熱烈的回響,等了一,二天感覺大家並沒有特別去注意,那我只好先行回應好了,因為 OO 的精神實在太重要了,台灣要將軟體業推升到回際化一定要往工業化的方向走,而工業化的開發方式首推以 OO 的方法來開發軟體,不能在以過去沒效率及難以維護的方式開發軟體,change.jian 大大舉的列子,在 UML 上稱之為委任,物件本身的所有功能,並不一定要自己實作,可透過委任的方式由其他物件來達成,以這種方式來實作物件,一則客戶端本身並不知他所叫要的功能是由什麼樣的方式來達成,對客戶端這種叫要是通透件的,二則當此功能要新增功能或修改,或改由其他物件完成,只要抽換 SERVER  物件與委任者之間的關係就是了,完全不會影響到原有系統的運作,系統也變的有彈件,當然這種作法在  OO 裡算是起手式而以,沒什麼了不起,更厲害的是多型的充分利用及DESIGN PATTERNS 的配合,那寫起程式來真是漂亮又愉快,這一部份改天有空我們在來討論 現在我舉另一個委任的例子,以供大家參考   這樣說好了,如果把你放到非洲大草園裡,讓你一個人獨自行走,你敢嗎?裡面充滿了各種野生動物,我想不用多久你大概就成為某種動物的晚餐了,但如果讓你到動物園裡走動,你敢嗎?雖然動園裡也充滿各動肉食動物,但我想連三歲小孩都敢,為什麼?因為他們全被關在籠子裡. 嗯! 我們寫程式也是一樣,裡面處處是危險,要小心非常,否則一下子就出差錯了 有沒有一種可能,我們也能把這些動物分門別類關起來,讓我們好管理呢? 答案當然是肯定的 比如,我們在 FORM  上會放上各種類型的資料感資原件,他們的共同特性,就是除了顯示資料給使用者看外,還要做各種前檢查與編輯後檢查,通常大家的做法是,在這個原件的 ONENTER 或 ONEXIT 或你要檢查的物件按個  CLICK, DELPHI 會將你帶住  ONxxxCLICK 事件裡讓你寫下各種程式, 想想,如果你的FORM 上有四五十個資料感知件,那你的 FORM 上會有一堆  ONXXXCLICK 的事件,以後你要維護程式,可就費心了,最重要的一點,可能是大家沒想到的,你這個 FORM 可就很難成為其他 FORM 的父類別了,所以如果我們能把這些事件全委由另一個物件集中管理,那可就好處理了,怎麼才能這樣作呢?大家先想想,下回分解 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福
------
Thomas Chiou
renth555
一般會員


發表:32
回覆:65
積分:19
註冊:2003-02-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-17 01:27:19 IP:61.56.xxx.xxx 未訂閱
看了這編討論 在我開始學程式時到我看了C 物件導向 書籍 初學者認為 oop 觀念設計 比認何高深 指標運算函數運用語法精簡 要有學問 目前上面程式作法小弟目前都還不會 但我只想要了解 如何把 真實世界--->轉換成物件程式 我認為唯有物件化才是程式的真理 (物件) 對不起文筆不好形容不出他的(奧妙)
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-17 16:16:56 IP:61.218.xxx.xxx 未訂閱
其實,我是從Delphi1.0開始摸的,那時國內根本沒有Delphi的書籍,我的第一隻程式,是看著國外的書籍邊看邊自習的.那時只是因為有興趣,可是本身並不是從事軟體設計的工作,再加上沒有人帶,老實說,知道的不多.而大概碰了半年後,那時D2也出來了,覺得程式寫來寫去,就是在新增,修改,刪除,查詢...,似乎沒有什麼創新,對於Delphi失去興趣,也就沒有再學.直到D3出來,我試著用D3來寫多媒體的畢業光碟,那時的多媒體還不像現在技術這樣好.本以為又找到另一個興趣,但花了半年,說穿了,就是程式在控制流程,播放一些avi,mid等,加上一些圖形與晝面的處理...覺得寫軟體是很boring的...(更慘的是在二年後的資訊展裡看到一套軟體,用來編輯多媒體光碟,只要三兩下的操作,效果比我自己做的還好...) 後來,入伍去了,D4,D5相繼問市,技術從原來的dbase,發展到後來的c/S,甚至於今的n-tire,COM/DCOM/COM ,SOAP,WebSnap...等,要學的技術真是不可同日而語. 而退伍後,雖然也真的進入了軟體公司,開始當一個programmer,但對於OO一直沒有機會接觸.直到一年多後,有機會在自己負責的案子裡,因為要解決一個問題,理論上最佳的解法就是利用OO繼承的特性來處理,才開始試著把OO的精神放入程式裡.經過了二年多的歷練,我很清楚的了解,OO的好處在那裡,也很難過大部分的programmer對於OO的使用其實很有限,看著他們用dirt的方式去寫程式,然後日以繼夜的做苦工....其實,thomas0728大大說的很對,也是我一直的理想.我認為程式設計應該是一個製造業,一個軟體工廠,而OO就是確保最佳生產效率的工廠管理方法...扯遠了 回想起自己的programmer之路,如果有人帶的話,不知可以少花多少時間.藉著這個網站分享的精神,把這個話題引出來,讓那些有心在程式設計的新人有一個學習的方向.本以為對OO認同的人可能不多(國內所有的Delphi書籍,還沒有人對這個有專門的討論),但看到有人把這篇文章加入珍藏,我知道用的人應該有一定的人數在,只是寫文章真的很花時間.... 至於renth555所提的,如何把"真實世界--->轉換成物件程式",老實說,我認為沒有什麼物件可以是從真實世界轉換過來(也許有其他大大有這樣的例子可以發表).但依我的經驗,OO的程式碼可以減少你的程式區塊之間的相依性,就像thomas0728大大所提的,一個form裡那麼多的ONXXXCLICK,ONENTER,ONEXIT procedure,如果有一個物件可以管理這些程式碼,或者這些程式碼的實作都由某個物件繼承下來等,那麼當你需要改rule時,可能只要對這個管理的物件或者被繼承的物件加以修改即可.
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-17 17:29:06 IP:211.22.xxx.xxx 未訂閱
深表認同 程式寫了一段時間後 真的是覺得一直在做重複的動作 寫一支進銷存程式,每個表單都重頭來真是累人 沒人帶,真不知Delphi可以使用物件寶庫,可以省掉很多麻煩 一直到最近,才發現有此功能 不知道有哪一本書對於物件導向介紹的比較詳細的 可否請前輩推薦一下 ~~應無所住而生其心~~
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-17 17:42:13 IP:61.218.xxx.xxx 未訂閱
我也在找討論這方面的書籍,但老實說,國內我還沒有發現. 不過我沒有用物件寶庫,一方面是物件太多了,再來是如果我有一個檔案是純pas檔的,就沒有辦法存入物件寶庫裡....
引言: 深表認同 程式寫了一段時間後 真的是覺得一直在做重複的動作 寫一支進銷存程式,每個表單都重頭來真是累人 沒人帶,真不知Delphi可以使用物件寶庫,可以省掉很多麻煩 一直到最近,才發現有此功能 不知道有哪一本書對於物件導向介紹的比較詳細的 可否請前輩推薦一下 ~~應無所住而生其心~~
xz
一般會員


發表:0
回覆:1
積分:0
註冊:2003-04-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-17 22:12:07 IP:218.164.xxx.xxx 未訂閱
您好.. 不好意思... 小弟下載您寫好的程式.. 參考 但是您是不是使用一些特殊元件呢...  可不可以告訴我,元件名稱...  小的很感謝您...
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-18 01:38:16 IP:219.80.xxx.xxx 未訂閱
引言: 我也在找討論這方面的書籍,但老實說,國內我還沒有發現. 不過我沒有用物件寶庫,一方面是物件太多了,再來是如果我有一個檔案是純pas檔的,就沒有辦法存入物件寶庫裡....
引言: 深表認同 程式寫了一段時間後 真的是覺得一直在做重複的動作 寫一支進銷存程式,每個表單都重頭來真是累人 沒人帶,真不知Delphi可以使用物件寶庫,可以省掉很多麻煩 一直到最近,才發現有此功能 不知道有哪一本書對於物件導向介紹的比較詳細的 可否請前輩推薦一下 ~~應無所住而生其心~~
既然沒有就請前輩寫一本讓小弟參考吧 ~~應無所住而生其心~~
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-18 08:54:31 IP:61.218.xxx.xxx 未訂閱
耶~~~,我沒有用什麼特殊元件 我的版本是D6,裡面真要說特殊,就是InterBase的元件而已,其他沒有了    
引言: 您好.. 不好意思... 小弟下載您寫好的程式.. 參考 但是您是不是使用一些特殊元件呢... 可不可以告訴我,元件名稱... 小的很感謝您... < face="Verdana, Arial, Helvetica"> 我了不起只能寫一頁而已.... <>< face="Verdana, Arial, Helvetica">引言: 既然沒有就請前輩寫一本讓小弟參考吧 ~~應無所住而生其心~~
發表人 - change.jian 於 2004/08/18 09:00:15
系統時間:2024-06-29 18:52:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!