在写业务逻辑的时候如何写可扩展的代码?
-------------------以下是具体的应用------------------------------
//用户需要符合某些规则才能购买产品//1.在某个时间段,2.产品订单金额大于一个数//实现代码如下//定义结构体(规则相关的参数) type Rule struct { Key string TimeStart string TimeEnd string OrderAmount int } //map关系 var muxRule map[string]func(rule *Rule) error //定义register,有新的规则则需要调用一下这个函数进行注册 func registerBuy(key string,f func(rule *Rule) error) { if muxRule == nil { muxRule = make(map[string]func(rule *Rule) error) } if _,exist := muxRule[key]; exist { fmt.Println("handler exist") } muxRule[key] = f } //factory,调用实际方法,返回结果 func factoryBuy(rule *Rule) error { return muxRule[rule.Key](rule) } func Test_rule(t *testing.T) { //实现规则一 rule1 := &Rule{ Key:"rule1",TimeStart:"2010-01-01 OO:00:00",TimeEnd:"2020-01-01 OO:00:00",} opRule1 := func(rule *Rule) error { if rule.TimeStart > time.Now().Format("2006-01-02 15:04:05") || rule.TimeEnd < time.Now().Format("2006-01-02 15:04:05") { return errors.New("time is invalid") } return nil } //实现规则二 rule2 := &Rule{ Key:"rule2",OrderAmount:100,} //设传入参数用户购买金额为10 amount := 10 opRule2 := func(rule *Rule) error { if rule.OrderAmount != amount { return errors.New("orderAmount is invalid") } return nil } registerBuy("rule1",opRule1) registerBuy("rule2",opRule2) ret1 := factoryBuy(rule1) ret2 := factoryBuy(rule2) if ret2 != nil || ret1 != nil { fmt.Printf("ret %v\n",ret1) fmt.Printf("ret %v\n",ret2) }else { fmt.Println("OK!") } }
原文地址:https://www.jb51.cc/go/188071.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。