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 关注
- 105 浏览
添加回答
举报