1 回答

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
關(guān)于您的代碼的一些內(nèi)容
根據(jù)評(píng)論中的討論,我想分享一些經(jīng)驗(yàn)。
我沒(méi)有看到你的解決方案有什么不好的,但是改進(jìn)它的選項(xiàng)很少,這取決于你想做什么。
你的代碼看起來(lái)像經(jīng)典的工廠。這是一種模式,它基于一些輸入?yún)?shù)創(chuàng)建單個(gè)族的對(duì)象。Factory
在Golang中,這通常以更簡(jiǎn)單的方式用作,有時(shí)稱(chēng)為。Factory MethodFactory function
例:
type Vehicle interface {};
type Car struct {}
func NewCar() Vehicle {
return &Car{}
}
但是您可以輕松擴(kuò)展它以執(zhí)行類(lèi)似您的操作:
package main
import (
"fmt"
"strings"
)
type Vehicle interface {}
type Car struct {}
type Bike struct {}
type Motorbike struct {}
// NewDrivingLicenseCar returns a car for a user, to perform
// the driving license exam.
func NewDrivingLicenseCar(drivingLicense string) (Vehicle, error) {
switch strings.ToLower(drivingLicense) {
case "car":
return &Car{}, nil
case "motorbike":
return &Motorbike{}, nil
case "bike":
return &Bike{}, nil
default:
return nil, fmt.Errorf("Sorry, We are not allowed to make exam for your type of car: \"%s\"", drivingLicense)
}
}
func main() {
fmt.Println(NewDrivingLicenseCar("Car"))
fmt.Println(NewDrivingLicenseCar("Tank"))
}
上面的代碼產(chǎn)生輸出:
&{} <nil>
<nil> Sorry, We are not allowed to make exam for your type of car: "Tank"
因此,也許您可以通過(guò)以下方式改進(jìn)代碼:
關(guān)閉到單個(gè)函數(shù)中,該函數(shù)采用 a 并生成
string
Response object
添加一些驗(yàn)證和錯(cuò)誤處理
給它一些合理的名字。
與工廠相關(guān)的模式很少,可以替換此模式:
責(zé)任鏈
調(diào)度
游客
依賴(lài)注入
反射?
@icza也有關(guān)于反射的評(píng)論。我同意他的觀點(diǎn),這是常用的,我們無(wú)法避免代碼中的反射,因?yàn)橛袝r(shí)事情是如此動(dòng)態(tài)。
但在你的場(chǎng)景中,這是一個(gè)糟糕的解決方案,因?yàn)椋?/p>
您丟失了編譯時(shí)類(lèi)型檢查
添加新類(lèi)型時(shí)必須修改代碼,那么為什么不在此 Factory 函數(shù)中添加新行呢?
你使代碼變慢(參見(jiàn)參考),它增加了50%-100%的性能損失。
你讓你的代碼如此不可讀和復(fù)雜
您必須添加更多的錯(cuò)誤處理,以涵蓋反射帶來(lái)的不小錯(cuò)誤。
當(dāng)然,您可以添加大量測(cè)試來(lái)涵蓋大量場(chǎng)景。您可以在代碼中支持 、,并且可以使用測(cè)試來(lái)覆蓋它,但是在生產(chǎn)代碼中,有時(shí)您可以通過(guò),如果不捕獲它,您將收到運(yùn)行時(shí)錯(cuò)誤。TypeA
TypeB
TypeC
TypeXYZ
結(jié)論
你的方案沒(méi)有什么不好的,這可能是做你想做的事情的最容易讀和最簡(jiǎn)單的方法。switch/case
參考
工廠方法:https://www.sohamkamani.com/golang/2018-06-20-golang-factory-patterns/
關(guān)于編程模式的經(jīng)典書(shū)籍:設(shè)計(jì)模式:可重用面向?qū)ο筌浖脑兀琁SBN:978-0201633610
Erich Gamma and his band of four
反射基準(zhǔn):https://gist.github.com/crast/61779d00db7bfaa894c70d7693cee505
- 1 回答
- 0 關(guān)注
- 121 瀏覽
添加回答
舉報(bào)