c语言 switch case 太多优化/重构[二]
1. 背景 - 某该函数switch case 复杂度太高 ,函数太长 pclint不过
CHAR * AB_FUN_XXXX(IN ULONG ulResult)
{
UINT uiRcID;
switch (ulResult)
{
case ERROR_SUCCESS:
return NULL;
case ERROR_NO_ENOUGH_RESOURCE:
uiRcID = XX_YY_MEM_ALERT;
break;
case ERROR_BB_URL_GETFAILED:
uiRcID = XX_YY_GETFAILED;
break;
case ERROR_BB_UPDATE_FAILED:
uiRcID = XX_YY_FAILED;
break;
……
default:
uiRcID = XX_YY_GENERAL_FAILED;
break;
}
return RUN_Test(uiRcID);
}
2. 解决 - 建表,查表处理
/* for AB_FUN_XXXX */
typedef struct tagErrorCodeToIDS
{
UINT uiErrorCode;
UINT uiIDS;
}ERROR_TO_IDS_S;
static ERROR_TO_IDS_S g_astErrorToIds[]=
{
{ERROR_SUCCESS, 0},
{ERROR_NO_ENOUGH_RESOURCE, XX_YY_MEM_ALERT},
{ERROR_BB_URL_GETFAILED, XX_YY_URL_GETFAILED},
{ERROR_BB_UPDATE_FAILED, XX_YY_FAILED},
{ERROR_AB_PROC_UPDATE, XX_YY_PROC_UPDATE},
{ERROR_AB_CANNOT_CONNECT, XX_YY_CANNOT_CONNECT},
{ERROR_AB_CANNOT_CONNECT, XX_YY_CANNOT_CONNECT},
{ERROR_AB_CONNECT_TIMEOUT, XX_YY_CONNECT_TIMEOUT},
{ERROR_AB_MEM_ALERT, XX_YY_MEM_ALERT},
……
}
CHAR * AB_FUN_XXXX(IN ULONG ulResult)
{
UINT uiRcID = 0;
ULONG ulLoop = 0;
ULONG ulArrLen = 0;
ulArrLen = sizeof(g_astErrorToIds)/sizeof(g_astErrorToIds[0]);
for(ulLoop = 0; ulLoop < ulArrLen; ulLoop++)
{
if(ulResult == g_astErrorToIds[ulLoop].uiErrorCode)
{
uiRcID = g_astErrorToIds[ulLoop].uiIpsIDS;
}
……
}
……
}
3. witch case 原理/代码优化 重构
对于一个switch有几十个case的情况,其圈复杂度往往上百,程序块重构显然已不能解决其本质复杂度。
如果要降低其圈复杂度,必然需要对代码进行重新设计。
C语言的switch/case语言特性本质是描述一种查表逻辑,其中表结构和表的控制(即查表)都通过软件来表达。
表通过代码来描述,这显然不是一种最佳的实现方式。
我们需要做的就是,避免控制中的复杂性,将精力集中在数据的组织上,以反映所模拟世界的真实结构,并将数据与控制进行分离。