组合爆炸你有很多代码可以做几乎相同的事情......但是数据或行为的变化很小。这可能很难重构 - 可能使用泛型或翻译? - 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
}
}
我想在不牺牲易读性的情况下摆脱这几乎重复的代码。想法?
答案 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
}
}
}