对重复代码进行治理,发现很多冗余代码就因为其中的一行无法复用,就拷贝一份,造成大量重复代码,且后期维护成本很高,很容易改漏了

 

1、使用函数指针进行代码去重

如下代码相似度非常高,只是因为其中某个函数调用的名字不一样,这种的可以使用函数指针:

修改方法:

typedef WORD16 (*SupiCalGroup)(const SUPI supi, const WORD32 scTypeId)
WORD16 getGroupByXXXXComm(const NgXXXX &5gsuci, SupiCalGroup supiCalGroup,const WORD32 srvType) { WORD16 groupId = NORMAL_USER_GROUP_NUM; if (!checkXXXX(xxxx)) { STAT(calUserGroupIdByErrorxxxx); return generateGrpForErrorXXXX(xxxx); } if (5gsuci.schemeID == PROFILE_A_XXXX) { STAT(calUserGroupIdByAXXXX); groupId = getGroupByMSIN(5gsuci.schm + 32, 5gsuci.schmLen - 40); } if (5gsuci.schemeID == PROFILE_B_XXXX) { STAT(calUserGroupIdByBXXXX); groupId = getGroupByMSIN(5gsuci.schm + 33, 5gsuci.schmLen - 41); } if (5gsuci.schemeID == NULL_SCHEME_XXXX) { SUPI 5gsupi{}; if(getSUPIFromNullSchemeXXXX(5gsuci, 5gsupi)) { STAT(calUserGroupIdByNullXXXX); groupId = supiCalGroup(5gsupi, srvType); } } if(groupId >= MAX_GROUP_NUM) { STAT(calUserGroupIdIsErrorXXXX); groupId = MAX_GROUP_NUM - 1; } return groupId; }

修改后俩个接口:

 

 

 

 

2、使用lamba表达式进行代码去重

下面重复代码也很相似,但是会发现用函数指针咋也搞不定,因为依赖内存里变量不一样,参数稍微有点差别,此时可以用lamba表达式

 

 

 

 将不一样的那行代码作为一个函数参数进行传递,比较这个语句,共享函数主体需要给这个函数传递如下参数: 

 

 

 

(NAAMMFF_GETALLR_AAMMFFIDINSET_ACK&rsp, WORD32 i, WORD32 total)

因此提供如下一个函数包装:

using DealdataFunc = std::function<void(DM_NAMF_MP_GETALLR_AMFIDINSET_ACK &ack, WORD32 i, WORD32 total)>;

 

WORD32 getAllAmfIdInset(DealdataFunc dealData)
{
    NAAMMFF_GETALLR_AAMMFFIDINSET_REQ req = {0};
    NAAMMFF_GETALLR_AAMMFFIDINSET_ACK rsp;

    req.msgType = MSG_CALL;
    req.dwTupleNo = 0;

    WORD32 totalNum = 0;
    do
    {
        if(!DBM_CALL(NAAMMFF_GETALLR_AAMMFFIDINSET, (LPSTR)&req, (LPSTR)&rsp)
                || RC_OK != rsp.retCODE || 0 == rsp.dwValidNum)
        {
            CFG_LOG(LOG_ERROR_LEV, "DBM_CALL NAAMMFF_GETALLR_AAMMFFIDINSET false.");
            return totalNum;
        }

        WORD32 validNum = AAMMFFMIN(rsp.dwValidNum, NAAMMFF_COMMUNICATION_GETALL_MAX);
        for(WORD32 i = 0; i < validNum; i++)
        {
            dealData(ack, i, totalNum);
            totalNum++;

            if(totalNum >= GUAMI_MAX_NUM)
            {
                return totalNum;
            }
        }

        req.dwTupleNo = rsp.dwTupleNo;
    }
    while(!rsp.blEnd);

    return totalNum;
}

然后俩个接口改成如下即可:

 

 

 

lambda表达式详解:

https://blog.csdn.net/A1138474382/article/details/111149792

注意理解仿函数哦~

开开心心每一天~写代码的小熊猫 

 

5gsuci