Dispatcher Pattern

出自VFP Wiki

(修訂版本間差異)
跳轉到: 導航, 搜尋
(revert)
 
第1行: 第1行:
====Dispatcher Pattern====
====Dispatcher Pattern====
-
看完 RUN!PC 六月號由李維先生所寫的"由軟體品質檢驗談Design Pattern的應用"一文,我覺得用 VFP 就可以很簡單的作到,所以就以 VFP 實作.
+
看完 RUN!PC 六月號由李維先生所寫的"由軟體品質檢驗談Design Pattern的應用"一文,我覺得用 VFP 就可以很簡單的作到,所以就以 VFP 實作.
-
該文以計算牌照稅為引子
+
該文以計算牌照稅為引子
-
計算牌照稅的時候,會需要依照汽缸的cc數以及私人/營業用車來判定收費的標準,照一般的寫法,很自然就會用到很多 If...Then...Else 或 do case...endcase, 可是這樣子程式碼就會變得很長很長,而難以維護.
+
計算牌照稅的時候,會需要依照汽缸的cc數以及私人/營業用車來判定收費的標準,照一般的寫法,很自然就會用到很多 If...Then...Else do case...endcase, 可是這樣子程式碼就會變得很長很長,而難以維護.
-
像是這樣:
+
像是這樣:
<pre>
<pre>
If cc < 500
If cc < 500
第11行: 第11行:
   if cc < 600  
   if cc < 600  
     money=1200
     money=1200
-
   && ..... 略
+
   && .....
   endif
   endif
endif
endif
</pre>
</pre>
-
用 do case 的話則是這樣
+
do case 的話則是這樣
<pre>
<pre>
do case
do case
第23行: 第23行:
   case between( 501, 599 )
   case between( 501, 599 )
     money=1200
     money=1200
-
   && ... 略
+
   && ...
endcase
endcase
</pre>
</pre>
-
李先生以一個 Dispatcher pattern 解決此一問題.
+
李先生以一個 Dispatcher pattern 解決此一問題.
-
在 VFP 裡面可以直接結合資料庫作更好的解法
+
VFP 裡面可以直接結合資料庫作更好的解法
<pre>
<pre>
第89行: 第89行:
</pre>
</pre>
-
瞧,這樣不是簡單多了嗎??
+
,這樣不是簡單多了嗎??
-
在這裡拋磚引玉一下,希望大家如果有更好的解法
+
在這裡拋磚引玉一下,希望大家如果有更好的解法
-
也 post 上來,讓大家觀摩一下
+
post 上來,讓大家觀摩一下
^_^
^_^
-
[[category:以VFP介紹Design Pattern]]
+
[[category:以VFP介紹Design Pattern]]

在2009年9月1日 (二) 02:04的最新修訂版本

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 上來,讓大家觀摩一下 ^_^