【问题标题】:Are methods instead of functions preferred in this case在这种情况下是否首选方法而不是函数
【发布时间】:2017-12-13 21:30:18
【问题描述】:

我有一整套如下所示的函数:

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 的属性的getter 或setter 不同)。

【问题讨论】:

    标签: oop go types


    【解决方案1】:

    您可以做这样的事情来避免一遍又一遍地显式传递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 ...
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-07
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2017-12-11
      • 1970-01-01
      相关资源
      最近更新 更多