c语言 switch case 太多优化/重构[二]

您所在的位置:网站首页 c语言中case语句 c语言 switch case 太多优化/重构[二]

c语言 switch case 太多优化/重构[二]

2023-08-01 12:09| 来源: 网络整理| 查看: 265

c语言 switch case 太多优化/重构[二] 1. 背景 - 某该函数switch case 复杂度太高 ,函数太长 pclint不过2. 解决 - 建表,查表处理3. witch 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语言特性本质是描述一种查表逻辑,其中表结构和表的控制(即查表)都通过软件来表达。 表通过代码来描述,这显然不是一种最佳的实现方式。 我们需要做的就是,避免控制中的复杂性,将精力集中在数据的组织上,以反映所模拟世界的真实结构,并将数据与控制进行分离。

参考:

https://www.bbsmax.com/A/kvJ3L6bp5g/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3