2017-07-10 57 views
0

我有一整套的功能優先功能看起來像這樣:是方法而不是在這種情況下

package rules; 

import "project/some" 

func frobDiscountLimit(frob some.Frob, maxDiscount float64) (RuleStatus, string) 
func frobDiscountPercentageLimit(frob some.Frob, maxDiscountPercentage float64) (RuleStatus, string) 
func frobUsageLimit(frob some.Frob, interval valueInterval) (RuleStatus, string) 
func frobPermanentExpiryLimit(frob some.Frob) (RuleStatus, string) 
func frobVoucherValidity(frob some.Frob, maxValidityDays uint) (RuleStatus, string) 

用例:

package rules 

import "project/some" 

func doChecks(frob some.Frob) { 
    status, message := frobDiscountLimit(frob, 100) 

    if status != PASSED { 
     .... 
    } 

    ... evaluate all remaining rules here ... 
} 

我不知道它有什麼優勢寫它像:

func (f someFrob) discountLimit(maxDiscount float64) (RuleStatus, string) 
... 

寫起來似乎較短,但我不確定哪一種是正確的風格。因爲我不認爲這些驗證方法是「對象的一部分」,所以它們不屬於some.Frob對象的行爲的一部分(與some.Frob屬性的吸氣器或設置器不同)。

回答

3

你可以這樣做,以避免必須一遍又一遍明確地通過frob,同時仍然可以避免在frob上製作這些函數方法。

type frobChecker struct { 
    frob some.Frob 
} 

func (fc frobChecker) discountLimit(maxDiscount float64) (RuleStatus, string) 
func (fc frobChecker) discountPercentageLimit(maxDiscountPercentage float64) (RuleStatus, string) 
func (fc frobChecker) usageLimit(interval valueInterval) (RuleStatus, string) 
func (fc frobChecker) permanentExpiryLimit() (RuleStatus, string) 
func (fc frobChecker) voucherValidity(maxValidityDays uint) (RuleStatus, string) 

func doChecks(frob some.Frob) { 
    fc := frobChcker{frob} 

    status, message := fc.discountLimit(100) 

    if status != PASSED { 
     .... 
    } 

    ... evaluate all remaining rules here ... 
} 
+0

是的,我喜歡這樣,歡呼! – Max

相關問題