2 回答

TA貢獻1942條經驗 獲得超3個贊
對于你所擁有的來說switch
會很好:
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)
}
使用映射會很不方便,因為并非所有方法都具有相同的簽名,但您可以使用多個映射。
另一種解決方案可能是使用反射來調用方法,但同樣,處理不同的參數會很不方便。反射也比較慢,更不用說您必須注意不允許調用不打算公開的方法。

TA貢獻1865條經驗 獲得超7個贊
可以將您所擁有的內容表達為地圖。這里的基本設置是,無論你走哪條路,你都會得到一些可以不帶參數調用的函數,并且它總是返回相同的類型()error。我可能會明確地傳遞args進來。
其高級結構是具有函數名稱到函數的映射,然后調用所選函數。
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)
映射語法變得有點冗長
funcMap := map[string]func([]string) error{
"queryProduce": func(args []string) error {
return s.queryProduce(APIstub, args)
},
"initLedger": func(_ []string) error {
return s.initLedger(APIstub)
},
}
如果您要在多個地方調用它,或者您想要一個單獨的驗證步驟,如果使用的話將定義一些名稱,或者如果函數的實際列表是動態的(您可以添加或刪除東西),那么映射方法會更好來自運行時的地圖)。initLedger不一致的方法簽名確實會帶來復雜性,并且使所有內容保持一致會有所幫助(即使函數未使用,也可以采用參數列表之類的函數)。
在普通代碼中,我希望switch@icza 的答案中的形式更加慣用。
- 2 回答
- 0 關注
- 150 瀏覽
添加回答
舉報