Dispatcher Pattern

出自VFP Wiki

在2009年9月1日 (二) 02:04由Elleryq (對話 | 貢獻)所做的修訂版本
(差異) ←上一修訂 | 最新修訂 (差異) | 下一修訂→ (差異)
跳轉到: 導航, 搜尋

Dispatcher Pattern

看完 RUN!PC 六月號由李維先生所寫的"由軟體品質檢驗談Design Pattern的應用"一文,我覺得用 VFP 就可以很簡單的作到,所以就以 VFP 實作.

該文以計算牌照稅為引子 計算牌照稅的時候,會需要依照汽缸的cc數以及私人/營業用車來判定收費的標準,照一般的寫法,很自然就會用到很多 If...Then...Else 或 do case...endcase, 可是這樣子程式碼就會變得很長很長,而難以維護. 像是這樣:

If cc < 500
  money=900
else
  if cc < 600 
    money=1200
  && ..... 略
  endif
endif

用 do case 的話則是這樣

do case
  case between( 0, 500 )
    money=900
  case between( 501, 599 )
    money=1200
  && ... 略
endcase

李先生以一個 Dispatcher pattern 解決此一問題. 在 VFP 裡面可以直接結合資料庫作更好的解法

*
* ITax.prg
*
DEFINE CLASS ITax as custom
  PROCEDURE Init()
    create cursor crTax( cc_lo I, cc_hi I, PrivateTax Y,  BusinesTax Y )
    insert into crTax values (    0,  500, $ 1620, $  900 )
    insert into crTax values (  501,  599, $ 2160, $ 1200 )
    insert into crTax values (  600, 1199, $ 4320, $ 2160 )
    insert into crTax values ( 1200, 1799, $ 7120, $ 3060 )
    insert into crTax values ( 1800, 2399, $11230, $ 6480 )
    insert into crTax values ( 2400, 2999, $15210, $ 9900 )
    insert into crTax values ( 3000, 4199, $28220, $16380 )
    insert into crTax values ( 4200, 5399, $46170, $24300 )
    insert into crTax values ( 5400, 6599, $69690, $33660 )
    insert into crTax values ( 6600, 7799, $117000, $44460 )
    insert into crTax values ( 7800, 9999999, $117000, $44460 )
  ENDPROC
  PROCEDURE Destroy()
    use in crTax
  ENDPROC
  PROCEDURE GetTax( cc, theKind )
    local ly_result
    local lc_oldalias
    lc_oldalias=alias()

    select("crTax")
    go top
    locate for between( cc, crTax.cc_lo, crTax.cc_hi )
    if found()
      ly_result=crTax.&theKind
    else
      ly_result=0
    endif

    select( lc_oldalias )
    return ly_result
  ENDPROC
  PROCEDURE GetPrivateTax( cc )
    return this.GetTax( cc, "PrivateTax" )
  ENDPROC
  PROCEDURE GetBusinessTax( cc )
    return this.GetTax( cc, "BusinesTax" )
  ENDPROC
ENDDEFINE
*
* test_itax.prg
*
LOCAL lo_obj
set procedure to itax.prg
lo_obj=createobject("ITax")
? lo_obj.GetPrivateTax( 1000 )
? lo_obj.GetBusinessTax( 2000 )

瞧,這樣不是簡單多了嗎?? 在這裡拋磚引玉一下,希望大家如果有更好的解法 也 post 上來,讓大家觀摩一下 ^_^