免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 58560 | 回复: 133

[函数] 大家在项目代码中会大量使用断言么?  关闭 [复制链接]

论坛徽章:
0
发表于 2008-07-01 09:14 |显示全部楼层
这个投票只因为看《编程精粹》中,建议项目大量使用断言。
但是我们的项目都是采用条件判断+异常保护+日志。没有用过,惭愧。
单选投票, 共有 378 人参与投票
您所在的用户组没有投票权限

论坛徽章:
0
发表于 2008-07-01 09:18 |显示全部楼层
断言有什么好处?

论坛徽章:
0
发表于 2008-07-01 09:22 |显示全部楼层
原帖由 lipingtababa 于 2008-7-1 09:18 发表
断言有什么好处?

我感觉:
1 代码量小:往往一条语句就可以了。但是如果自己用宏定义等方式进行debug版本,代码两会多一些。
2 能够找出“程序员认为不可能发生的错误”:当然这个用宏定义debug版本等方式也能达到。
3 直观:是断言,别人一眼就能看出来。

总结就是定位自认为不可能发生的错误比较方便。

[ 本帖最后由 77h2_eleven 于 2008-7-1 09:23 编辑 ]

论坛徽章:
0
发表于 2008-07-01 09:32 |显示全部楼层
我是用宏定义debug的办法写log,看log比较直观,你说assert这么好,那我也去试一下

论坛徽章:
0
发表于 2008-07-01 10:17 |显示全部楼层
个人感觉:

断言,在代码中对问题逻辑尽可能多的描述,这样,有些错误发生后,这些逻辑群本身就出现问题,不和谐,因而可以比较容易的调试。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
发表于 2008-07-01 10:43 |显示全部楼层

论坛徽章:
0
发表于 2008-07-01 11:20 |显示全部楼层
不用,断言错了程序也挂了,基本不用

论坛徽章:
0
发表于 2008-07-01 11:24 |显示全部楼层
假设你现在正在面试,主考不紧不慢地给出下一道题目:“请用C语言写一个类似strcpy的函数。
正在装载数据……
要考虑可能发生的异常情况。” 你会怎么做呢?很明显,对方不是在考察你的编程能力,因为复制字符串实在太容易了。对方是在考察你的编程风格(习惯),或者说,要看看你编码的质量。

    下面是多种可能的做法:

    void
    string_copy1(char* dest, const char* source)
    {
      assert(dest != NULL); /* 使用断言 */
      assert(source != NULL);
     
      while (*source != '\0') {
        *dest = *source;
        ++dest;
        ++source;
      }

      *dest = '\0';
    }

    void
    string_copy2(char* dest, const char* source)
    {
      if (dest != NULL && source != NULL) {  /* 对错误消极静默 */
        while (*source != '\0') {
          *dest = *source;
          ++dest;
          ++source;
        }

        *dest = '\0';
      }
    }

    int
    string_copy3(char* dest, const char* source)
    {
      if (dest != NULL && source != NULL) {
        while (*source != '\0') {
          *dest = *source;
          ++dest;
          ++source;
        }

        *dest = '\0';
        return SUCCESS;  /* 返回表示正确的值 */
      }                        
      else {
       errno = E_INVALIDARG;  /* 设定错误号 */
       return FAILED;         /*  返回表示错误的值 */
      }
    }
   
    // C++
    void
    string_copy4(char* dest, const char* source)
    {
       if (dest == NULL || source == NULL)
         throw Invalid_Argument_Error();  /*  抛出异常 */

       while (*source != '\0') {
         *dest = *source;
         ++dest;
         ++source;
       }

       *dest = '\0';
    }

我会选 3 、4

1 2 就出局

3是c 的做法 4是c++的做法

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2008-07-01 11:44 |显示全部楼层
很少用。基本上自己去检查相应的错误。

论坛徽章:
0
发表于 2008-07-01 13:55 |显示全部楼层
原帖由 benjiam 于 2008-7-1 11:24 发表
假设你现在正在面试,主考不紧不慢地给出下一道题目:“请用C语言写一个类似strcpy的函数。
正在装载数据……
要考虑可能发生的异常情况。” 你会怎么做呢?很明显,对方不是在考察你的编程能力,因为复制字符 ...


这个例子觉得不是很恰当,因为在这个情况下,的确不应该用断言

我的理解是
断言用在绝对不可能发生的情况下,或者说一旦发生,就需要停止程序进行检查的情况下,而不是用在错误处理上
主要按照业务逻辑来判断

上面举的strcpy为例,strcpy底层函数,默认应该具有返回strcpy成功与否的逻辑
并且也应该可以接受任何参数,但是需要判断的逻辑
所以这题考的并不是assert的使用,是考察strcpy所应该处理的问题
当然不可以用assert,因为NULL也是一个合法参数,按照规定参数等于NULL就不处理,返回strcpy失败

又比如,现在有1~5 5种东西,1、2、3是可以吃的,4、5是不可吃的
现在写一个函数 “吃”
int eat(int id)
{
  // 问题只考虑5种东西,如果不在这个范围内,就是不合法的
  // 所以用断言
  assert( 1 <= id && id <= 5);
  // 这个才是错误处理,全是合法参数的情况下,4~5是不可以吃的
  if ( 4 <= id ) return CANT_EAT;
  
  ... ...
}
当然,用if判断不在1~5之间也不是不可以,确实是判断了
这些就是各人对程序的理解,和程序实际需求之间的调整了

[ 本帖最后由 Strange 于 2008-7-1 13:56 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP