oop - 在这种情况下是否首选方法而不是函数

标签 oop go types

我有一整套看起来像这样的函数:

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 对象行为的一部分(不像属性的 getter 或 setter some.Frob)。

最佳答案

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

关于oop - 在这种情况下是否首选方法而不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45007100/

相关文章:

java - "Tell Don' t 请问,"shouldn' t所有方法都无效吗?

c - 区分数据类型和数据结构

json unmarshal 不工作但解码确实

go - 总是与 channel 陷入僵局

go - 带 slice 结构的隐式类型

scala - Scala 中类型安全的完美二叉树

Haskell IO Int 和 Int

java - 更新对象的方法的返回类型分析

php - 将此对象添加到此静态数组的奇怪行为

php - 访问子类的私有(private)属性