2 回答

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
對(duì)于你所擁有的來說switch
會(huì)很好:
switch function {
case "queryProduce":
? ? return s.queryProduce(APIstub, args)
case "initLedger":
? ? return s.initLedger(APIstub)
case "createProduce":
? ? return s.createProduce(APIstub, args)
case "queryAllProduces":
? ? return s.queryAllProduces(APIstub)
case "changeProduceStatus":
? ? return s.changeProduceStatus(APIstub, args)
}
使用映射會(huì)很不方便,因?yàn)椴⒎撬蟹椒ǘ季哂邢嗤暮灻?,但您可以使用多個(gè)映射。
另一種解決方案可能是使用反射來調(diào)用方法,但同樣,處理不同的參數(shù)會(huì)很不方便。反射也比較慢,更不用說您必須注意不允許調(diào)用不打算公開的方法。

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
可以將您所擁有的內(nèi)容表達(dá)為地圖。這里的基本設(shè)置是,無論你走哪條路,你都會(huì)得到一些可以不帶參數(shù)調(diào)用的函數(shù),并且它總是返回相同的類型()error。我可能會(huì)明確地傳遞args進(jìn)來。
其高級(jí)結(jié)構(gòu)是具有函數(shù)名稱到函數(shù)的映射,然后調(diào)用所選函數(shù)。
funcMap := map[string]func([]string) error{...}
funcName, args := APIstub.GetFunctionAndParameters()
f := funcMap[funcName]
if f == nil {
f = func(_ []string) error {
return shim.Error("Invalid Smart Contract function name.")
}
}
return f(args)
映射語法變得有點(diǎn)冗長(zhǎng)
funcMap := map[string]func([]string) error{
"queryProduce": func(args []string) error {
return s.queryProduce(APIstub, args)
},
"initLedger": func(_ []string) error {
return s.initLedger(APIstub)
},
}
如果您要在多個(gè)地方調(diào)用它,或者您想要一個(gè)單獨(dú)的驗(yàn)證步驟,如果使用的話將定義一些名稱,或者如果函數(shù)的實(shí)際列表是動(dòng)態(tài)的(您可以添加或刪除東西),那么映射方法會(huì)更好來自運(yùn)行時(shí)的地圖)。initLedger不一致的方法簽名確實(shí)會(huì)帶來復(fù)雜性,并且使所有內(nèi)容保持一致會(huì)有所幫助(即使函數(shù)未使用,也可以采用參數(shù)列表之類的函數(shù))。
在普通代碼中,我希望switch@icza 的答案中的形式更加慣用。
- 2 回答
- 0 關(guān)注
- 135 瀏覽
添加回答
舉報(bào)