Dispatcher Pattern
出自VFP Wiki
(修訂版本間差異)
ElaclIliva (對話 | 貢獻) |
小 (revert) |
||
第1行: | 第1行: | ||
====Dispatcher Pattern==== | ====Dispatcher Pattern==== | ||
- | + | 看完 RUN!PC 六月號由李維先生所寫的"由軟體品質檢驗談Design Pattern的應用"一文,我覺得用 VFP 就可以很簡單的作到,所以就以 VFP 實作. | |
- | + | 該文以計算牌照稅為引子 | |
- | + | 計算牌照稅的時候,會需要依照汽缸的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 的話則是這樣 | |
<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 解決此一問題. | |
- | + | 在 VFP 裡面可以直接結合資料庫作更好的解法 | |
<pre> | <pre> | ||
第89行: | 第89行: | ||
</pre> | </pre> | ||
- | + | 瞧,這樣不是簡單多了嗎?? | |
- | + | 在這裡拋磚引玉一下,希望大家如果有更好的解法 | |
- | + | 也 post 上來,讓大家觀摩一下 | |
^_^ | ^_^ | ||
- | [[category: | + | [[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 上來,讓大家觀摩一下 ^_^