为了账号安全,请及时绑定邮箱和手机立即绑定

几乎重复我自己

几乎重复我自己

Go
慕少森 2021-11-08 16:53:38
组合爆炸你有很多代码几乎都在做同样的事情……但在数据或行为上有微小的变化。这可能很难重构——也许使用泛型或解释器?- 杰夫阿特伍德通过编码恐怖在这种情况下,它不是很多代码,但它仍然困扰着我。我有一个共同的问题,即尝试连接到 IP 时,如果失败,我应该使用下一个 IP 重试。我有一个函数可以为 NSQ 生成一个生产者://Since we are in a critical system, we try with each IP until we get a producervar err errorfor i, success := 0, false; i < len(ips) && !success; i++ {    publisher, err = nsq.NewProducer(ips[i], nsq.NewConfig())    if err == nil {        success = true    }}另一个几乎共享相同代码的函数是一个接受 NSQ 消费者并连接它的函数:var err errorfor i, success := 0, false; i < len(ips) && !success; i++ {    err = consumer.ConnectToNSQD(ips[i])    if err == nil {        success = true    }}我想在不牺牲易读性的情况下摆脱这个几乎重复的代码。想法?
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

你把它倒过来了。您的解决方案应该遵循问题的形状,而不是特定解决方案的形状。解决方案中没有任何内容值得重构。它只会增加毫无意义的复杂性。


例如,


package main


import "github.com/nsqio/go-nsq"


// NewProducer is nsq.NewProducer with retries of an address list.

func NewProducer(addrs []string, config *nsq.Config) (producer *nsq.Producer, err error) {

    if len(addrs) == 0 {

        addrs = append(addrs, "")

    }

    for _, addr := range addrs {

        producer, err = nsq.NewProducer(addr, config)

        if err == nil {

            break

        }

    }

    return producer, err

}


// ConnectToNSQD is nsq.ConnectToNSQD with retries of an address list.

func ConnectToNSQD(c *nsq.Consumer, addrs []string) (err error) {

    if len(addrs) == 0 {

        addrs = append(addrs, "")

    }

    for _, addr := range addrs {

        err = c.ConnectToNSQD(addr)

        if err == nil {

            break

        }

    }

    return err

}


func main() {}


查看完整回答
反对 回复 2021-11-08
?
大话西游666

TA贡献1817条经验 获得超14个赞

也许像这样?


var publisher *nsq.Producer


connectToWorkingIP(ips, func(ip string) error {

    var err error

    publisher, err = nsq.NewProducer(ip, nsq.NewConfig())

    return err

})


connectToWorkingIP(ips, func(ip string) error {

    return consumer.ConnectToNSQD(ip)

})



func connectToWorkingIP(ips []string, f func(string) error) {

    for i, success := 0, false; i < len(ips) && !success; i++ {

        err := f(ips[i])

        if err == nil {

            success = true

        }

    }

}


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信