亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

幾乎重復我自己

幾乎重復我自己

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 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號