我有20到30个函数,我必须在函数中调用wsse_authenticate,而这个wsse_authenticate函数返回一个基于该值的值我发送错误消息,有什么方法可以改进这个代码,所以我只是在每个函数中调用函数wsse_authenticate(soap),然后用一些更好的代码替换switch开关,我想让它更有效率,请给我一些输入
wsse_ret = (wsse_authenticate(soap));
if(wsse_ret)
{
switch(wsse_ret)
{
case 1: onvif_fault(soap,"ter:NoSecuritytoken","ter:Failed_wsse_Aunthentication");
case 2: onvif_fault(soap,"ter:InvalidUserName","ter:FailedAunthentication");
case 3: onvif_fault(soap,"ter:InvalidPassword","ter:FailedAunthentication");
}
}
答案 0 :(得分:2)
从上面的代码中,我看到你正在为函数 onvif_fault 作为参数传递的“失败消息”所期望的所有情况调用相同的函数。并且在每个案例陈述之后也没有中断,这不会给你预期的结果。
使用break语句的说明: 假设ret值为1,则由于末尾有break语句,因此将执行所有三种情况。这意味着 onvif_fault 将使用不同的参数调用三次。
您的问题解决方案 您可以使用c中的结构创建一个表,该结构实际上包含故障列表 这是你可以用一行代码替换你的Switch语句。
EX:
typedef struct _fault_messages
{
char msg1 [254];
char msg2 [254];
} fault_messages;
fault_messages msg_table[3] = {
{"ter:NoSecuritytoken", "ter:Failed_wsse_Aunthentication"},
{"ter:error1", "ter:fault1"},
{"ter:error2", "ter:fault2"}
};
现在,映射上表中的错误消息。您可以按照以下说明优化代码:
wsse_ret = (wsse_authenticate(soap));
if(wsse_ret)
{
onvif_fault(soap, msg_table[wsse_ret-1].msg1, msg_table[wsse_ret-1].msg2);
}
答案 1 :(得分:1)
如果我理解正确 - 你的主要问题是你不想在30个函数集中的每个函数中重复安全检查代码:-) 如果是这种情况,您可以尝试使用这种模式:
#include <stdio.h>
#include <string.h>
int isUserPasswordValid(char * password) {
return strcmp(password, "MyBigPassword") == 0;
}
#define callFunctionWithAuthentication(password, secPayload, execPayload) \
do {\
if (!isUserPasswordValid(password)) {\
secPayload\
}\
else {\
execPayload\
}\
} while(0);
int myTestFunction(int x) {
return x;
}
int main(int argc,char* argv[]){
// bad password - executes only authentication
callFunctionWithAuthentication(
"randomPassword",
printf("oops - bad password - can't continue\n");,
int a = myTestFunction(10); printf("function returned %d\n",a);)
// good password - executes authentication AND code after
callFunctionWithAuthentication(
"MyBigPassword",
printf("oops - bad password - can't continue\n");,
int a = myTestFunction(10); printf("function returned %d\n",a);)
return 0;
}
唯一的缺点是你必须将每个30函数的调用替换为callFunctionWithAuthentication
的调用。但这是一次性的任务。此外,您必须始终调用此宏而不是plain
函数。