作者:水煮鱼
时间:2007-7-24 夜
版权申明:本文为水煮鱼为水煮鱼@Donews撰写,不得用于商业用途,如需摘用,请与水煮鱼联系。

当进行软件设计的时候,很多人都喜欢在函数中加入调试信息以方便对问题的定位(当然也可以使用断言,但是由于很多人对断言的使用原则把握不是很清楚,因此也造成了断言的乱用和滥用等现象)。

加入调试信息的缺点是使得代码变得非常冗余。当代码规模较小的时候,其缺点还不易察觉,但是当软件规模变得越加庞大的时候,调试信息的缺点就会暴露出来了:

1、冗余代码降低了代码的效率

2、由于每人编码风格的不一致,使得调试信息最终五花八门,降低了代码的专业性和可维护性。

3、如果是多CPU系统,调试信息会降低系统有限的通信带宽,导致整机系统通信效率的降低。

因此,本文推荐在系统设计中采用这样一种简单而有效的错误码构造方式。

包括两个部分:

首先是错误码的构造方法:

采用比特构造发,也就是通过比特位传递函数的调用关系。如果函数出现调用错误,可以通过查看返回的错误码准确定位到出现问题的函数。

具体方法如下:

/**************************************************************
    This program is to show how to design error code!!!!!
***************************************************************/

/*definition of error code*/
#define ERROR_FUNC_1      0×01           /*0000 0001*/
#define ERROR_FUNC_2      0×02           /*0000 0010*/
#define ERROR_FUNC_3      0×04           /*0000 0100*/
#define ERROR_FUNC_4      0×08           /*0000 1000*/
………
#define ERROR_FUNC_8      0×80           /*1000 0000*/

/*the definition of function*/
ERR_CODE func_1 ()
{
    ……….

    return ERROR_FUNC_1;
}

ERR_CODE func_2 ()
{
    ERR_CODE ulRet;

    ulRet = func_1 ();

    return ERROR_FUNC_2 | ulRet;
}

ERR_CODE func_3 ()
{
    ERR_CODE ulRet;

    ulRet = func_2 ();

    return ERROR_FUNC_3 | ulRet;
}

……….

ERR_CODE func_8 ()
{
    ERR_CODE ulRet;

    ulRet = func_7 ();

    return ERROR_FUNC_8 | ulRet;
}

其第二部分主要就是考虑提供错误码解析模块。

如果总是通过查看错误码和函数的调用关系,太过繁琐。通过错误码解析模块可以对错误码进行统一管理,这样也在很大程度上减小了规范性的影响。

如果对于多CPU系统,可以将该部分工作放在主用系统上完成。这样做到了错误码的统一管理,提高了其规范性。

===============================================

我相信很多朋友在工作中都用到的上述方法,在此我仅仅是抛砖引玉。不过我想表达的意思是:在工作前确定标准是何其重要。尽管上述方法非常简单,但是 在实际的工作中有多少项目能够做到?不要说整个软件的风格一致或者相似,就是一个项目的几个人的编码风格也千奇百怪。这也是为什么越是成熟的软件公司越是 注重编程规范的细节。因为只要规范,才能传承,只有传承才会有积累,只有积累才会有不断的进步,只有不断的进步,才有最终的强大。


评论

该日志第一篇评论

发表评论

评论也有版权!