進銷存軟體之OO設計--中間層處理(二) (轉)
。。。接上文
另:參考圖 請見上文
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好像是趨勢(李維的<
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 中小企業進銷存辦理軟體管理
- 進銷存設計與分析_總體(1)
- 盤點服裝進銷存軟體和生產進銷存軟體排行榜
- 可以學習的進銷存軟體
- 如何挑選門店進銷存軟體?進銷存軟體排名選這五款準沒錯!
- 服裝進銷存辦理軟體應用價值和功用
- 服裝進銷存軟體哪個好?十大優質服裝進銷存管理軟體排名
- 傢俱ERP-進銷存軟體
- 不改變中間層,如何玩轉 .NET 的遠端處理功能?
- java crm 進銷存 模組設計方案Java
- 線上進銷存軟體相比較傳統軟體的優勢
- 軟體設計雜談(二)--軟體設計與設計人員的個人素質 (轉)
- 【軟體工程】軟體設計之總體設計軟體工程
- 進銷存系統資料庫設計資料庫
- 2021十大進銷存軟體排名
- 進銷存軟體與ERP有哪些差異?
- 程式設計小技巧之 Linux 文字處理命令(二)程式設計Linux
- Java異常處理設計(二)Java
- 【軟體開發底層知識修煉】二 深入淺出處理器之二 中斷的概念與意義
- 進銷存軟體ERP管理系統開發搭建
- 適合貿易公司的進銷存軟體有哪些?
- 軟體設計中的可用性 (轉)
- 軟體中事務處理問題!
- 用shell處理二進位制檔案(轉)
- 影像處理第二篇之波段運算(軟體外掛篇)
- OO設計模式中的工廠模式設計模式
- (OO + 分散式計算) = 軟體架構的方向分散式架構
- RocketMQ高效能之底層儲存設計MQ
- 國內做得好的進銷存軟體有哪些啊?
- 十大進銷存管理軟體亮點大對比
- 中小企業如何選擇合適的進銷存軟體?
- 軟體開發質量管理層次模型(二)(轉)模型
- 眼鏡 進銷存 ERP設計(skycto JEEditor)
- [個體軟體過程]之時間管理 (轉)
- Linux核心模組程式設計--中斷處理程式(轉)Linux程式設計
- 三層switch轉一層switch的處理方法
- 軟體的效能設計(二) 臨時物件對軟體效能的影響 (轉)物件
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”