進銷存軟體之OO設計--中間層處理(二) (轉)

themoney發表於2007-09-15
進銷存軟體之OO設計--中間層處理(二) (轉)[@more@]

 

。。。接上文

另:參考圖 請見上文

 

 

TbizProcess類:namespace prefix = o ns = "urn:schemas--com::office" />

  這個類是從TBaseBillobj繼承下來的,如果說TBaseBillobj是用來處理業務單據的一般事務,那TbizProcess就是用來處理單據過賬操作的,但是TBaseBillobj實際上只用幾個Abstract Method來提供過賬操作的’介面’而真正實現是由那些個TxxxBillobj的具體業務單據類來實現。請看下面討論:

單據不僅要做儲存這樣的操作,還要有過賬處理從而才能影響的庫存和賬務,最終才能從報表功能中表現這些影響,從而才能使得知當前業務的狀況如何。基本上各單據的過賬處理對賬務的影響都是不同的,但大體可以歸納為錢流處理和物流處理,無論哪種單據最少都要這兩個其中的一個,比如一張採購進貨單處理後即會對系統錢流資料產生影響,而且對物流資料也產生影響,那麼一張銷貨收款單隻會對錢流資料產生影響,而銷售訂單即不會對錢流資料產生影響也不會對物流資料產生影響。於是對於不同的單據我們知道要進行錢流或物流的處理,但不知道具體單據型別之前,我們並不確定錢流或物流處理的具體內容,那麼根據此特點,我們可以宣告一個類TbizProcess(見圖2,3),它有兩個Abstract的方法:MoneyProcess和GoodsProcess(見圖3),代表錢流處理和物流處理的動作名稱,之所以是‘動作名稱’即這裡只宣告介面(我用的是Abstract Method做為介面而並非Interface),這樣在具體單據處理子類的中”實現”這些Abstract Method後即可做‘具體動作’,另外PrepareProcess和FinishProcess也是如此,分別在處理前和處理後做一些準備和善後工作。TbizProcess類還有一個方法是Proceslow,它來實現整個過賬處理,無論是什麼單據處理都是使用如下ProcessFlow:

 

//業務單據過賬處理:

function TBizProcess.ProcessFlow(BillHead:OleVariant; BillDetail:OleVariant; Tag:integer):

  Integer;

Begin

  。。。。。。。

  FConnection.BeginTrans;

。。。。。。。

。。。。。。。

   PrepareProcess;

  GoodsProcess;

  MoneyProcess;

  FinishProcess;

。。。。。。。

。。。。。。

  FConnection.CommitTrans;

  。。。。。。。

End;

這裡以MoneyProcess為例:

 

進貨單是這樣的錢流處理

procedure TBuyBillobj.MoneyProcess;

begin

  with FBizProvr do

  begin

  BankProcess(-1); //現金銀行賬務處理

  ArApForBuy;  //應收應付賬務處理

  StockGoods;  //庫存成本賬務處理(並非庫存變動處理)

  end;

end;

收款單的錢流處理內容與進貨單不相同,依此類推…

procedure TGatheringBillobj.MoneyProcess;

begin

  with FBizProvider do

  begin

  BankProcess(1);

  ArApForGather;

  end;

end;

這樣TbizProcess宣告瞭介面(Abstract Method),那下層的單據子類如:TbuyBillobj和TgatheringBillobj用統一介面實現不同操作內容。對於PrepareProcess; GoodsProcess;FinishProcess;也是一樣的。這樣無論子類的實現內容如何變化,呼叫都不被(或很少)受影響,因為有一至的介面。

注:可以用Abstract Method當做’介面’,但Interface更先進,特別是更復雜的情況下,VCL不少地方使用Abstract Method來當介面,但使用Interface好像是趨勢(李維的<>中對Interface說明的相當的詳細),另外看看的,很多地方都使用Interface而不再是Abstract Method,特別是。我使用Abstract Method的原因是當初的‘認識’問題以及系統並不巨大,而且當前所用的辦法也工作的很好就是了。

 

TxxxBillobj類:

這是一系列具體單據處理類,xxx代表單據的英文名如TbuyBillobj,TsaleBillobj等,見圖(4)。比如以下是銷售單類的宣告,它重新override了一些父類的方法以及實現了上面提到的4個抽象方法。其它TxxxBillobj的實現也都是基於這種思路。

 

  TSaleBillobj = class (TBizProcess)

  private

  FBizProvider: TBizProvider;

  public

  function BillHeadCondition: string; override;

  function Detail(optype:integer): string; override;

  procedure FinishProcess; override;

  procedure GoodsProcess; override;

  procedure MoneyProcess; override;

  procedure OrderCheck(cds:TClientDataSet); override;

  procedure PrepareProcess; override;

  end;

TbizProvider類:

  上面提到可以把業務流的處理分為MoneyProcess和GoodsProcess,而錢流和物流處理實際上各自又包括一些具體內容,比如從上面進貨單的錢流處理procedure TBuyBillobj.MoneyProcess;就可以看到總共有現金銀行賬務處理、應收應付賬務處理、庫存成本賬務處理等,那麼系統中像這些具體的處理功能有很多,用非OO的設計方法實現時可以寫若干個通用的Function或Procedure達到目的,如果用OO實現,我考慮了兩種方法,一個是從父類宣告Abstract Method(如果基類有實現可以用Virtual Method)方法,然後到子類再做具體實現。第二種是寫一個服務類或者說是工具類比如就叫它TbizProvider類,它提供這些現金銀行賬務處理、應收應付賬務處理、庫存成本賬務等處理的實現,然後各業務單據子類再宣告一個此型別的屬性或是域(我這裡用的域FBizProvider)來使用。如下:

參考上面TsaleBillobj類的宣告中 有FBizProvider: TBizProvider;

TbizProvider的細節見圖3,另外TbizProvider的Create如下:

宣告:

constructor Create(AOwner:TComponent;BizObj:TBizProcess); reintroduce; overload;

實現:

constructor TBizProvider.Create(AOwner:TComponent;BizObj:TBaseBillObj);

begin

  inherited Create(AOwner);

  FBizObj:=BizObj;  

end;

這樣TbizProvider在Create後將來就知道是為哪個業務單據做現金銀行、應收應付等處理

如下為TsaleBillobj建立TbizProvider的例項:
procedure TSaleBillobj.PrepareProcess;

begin

  。。。。

FBizProvider:=TBizProvider.Create(Self,Self);

。。。。

end;

procedure TSaleBillobj.MoneyProcess;

begin

  with FBizProvider do  //呼叫TbizProvider提供的一系列功能

  begin

  BankProcess(1);

  ArApForSale;

  SaleCost;

  SaleIncome;

  StockGoods;

  end;

end;

以上TbizProvider的Create中第二個引數為TbaseBillObj型別的,而傳入的實際為它的子型別(TSaleBillobj)物件例項(self),結合這樣的處理方法正好也是OO中對多型的使用。(Overload那個Create與多型沒有關係),這樣一來,在TbizProvider內部只知道有一個要被提供服務的’單據’(TbaseBillobj)就行了,具體是哪個單據(TxxxBillobj)不用知道,在TbizProvider的實現程式裡使用那個FbizObj就可以了。

最後再看一下圖4,可以看到各業務單據子類與TbizProvider建立了關聯,這個關聯是基於FbizProvider的。(圖4是用ModelMaker反向工程出來的)。

 

 

 

  曹春鵬

  2004-02


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-969617/,如需轉載,請註明出處,否則將追究法律責任。

相關文章