几乎重复我自己

时间:2015-09-21 07:41:59

标签: go refactoring

  

组合爆炸你有很多代码可以做几乎相同的事情......但是数据或行为的变化很小。这可能很难重构 - 可能使用泛型或翻译? - Jeff Atwood通过Coding Horror

在这种情况下,它不是很多代码,但它仍然困扰着我。我有一个共同的问题,就是在尝试连接到IP时,如果失败,我应该重试下一个IP。

我有一个为NSQ生成生产者的函数:

//Since we are in a critical system, we try with each IP until we get a producer
var err error
for 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 error
for i, success := 0, false; i < len(ips) && !success; i++ {
    err = consumer.ConnectToNSQD(ips[i])
    if err == nil {
        success = true
    }
}

我想在不牺牲易读性的情况下摆脱这几乎重复的代码。想法?

2 个答案:

答案 0 :(得分:4)

你倒退了。您的解决方案应该遵循问题的形状,而不是特定解决方案的形状。解决方案中没有任何值得重构的东西。这只会增加无意义的复杂性。

例如,

tableView.reloadData()

答案 1 :(得分:1)

也许是这样的?

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
        }
    }
}