免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8638 | 回复: 57
打印 上一主题 下一主题

[c] 勇敢的拿出我的劣质代码让大家批评 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-28 10:09 |只看该作者 |倒序浏览
本帖最后由 MarkAllenWeiss 于 2012-03-28 10:10 编辑

   注意这是一个c项目中摘出来的片段
  1. while(node != NULL)
  2. {
  3.    if(node->key == 1722)
  4.    {
  5.      char dtime[50];
  6.      struct tm tm;
  7.    
  8.      memset(&tm, 0, sizeof(struct tm));
  9.      localtime_r(&node->time, &tm);
  10.      strftime(dtime, 50, "%Y%m%d%H%M%S", &tm);
  11.      printf("%s: %s\n",  dtime, node->value);
  12.    }
  13.    node = node->next;
  14. }
复制代码
每次写类似上面的代码时, 都有些纠结, 局部变量如果声明在函数开始位置, 感觉距离太远, 体现
   不出来它的作用.

   但是函数体一旦大的话, 势必使用很多局部变量, 它们混在一起, 看着真是头疼.

   同事见我像上面这么写, 说这不是c的规范, c++可以这么做. 当初我这么写确实是见c++代码中
   这么玩, 学习c的时候确实没有这方面的例子.

   不知道同事说的对不对, c中不允许这么做吗, 能够编译通过只是gcc的特性?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2012-03-28 10:14 |只看该作者
是的。
另外鄙视下1722以及memset等

论坛徽章:
0
3 [报告]
发表于 2012-03-28 10:14 |只看该作者
问题是有啊
1.为什么要有那么多magic number?
2.至于局部变量声明这个问题的话,C现在也是支持的
3.变量命名尽量要有意义啊,一般不要短于3个字符吧

论坛徽章:
0
4 [报告]
发表于 2012-03-28 10:21 |只看该作者
hellioncu 发表于 2012-03-28 10:14
是的。
另外鄙视下1722以及memset等



    1722只是和业务相关的只一个值, 如果设成宏就太多了,  不过你说的对, 单个的话应该设成宏
    memset有问题吗?
    你是说memset只用初始化时做一遍就ok了, 是吗?

论坛徽章:
0
5 [报告]
发表于 2012-03-28 10:21 |只看该作者
本帖最后由 Moon_Bird 于 2012-03-28 10:22 编辑

{}  就是一作用域,局部变量只要声明在作用域前 都是可以的吧

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2012-03-28 10:24 |只看该作者
MarkAllenWeiss 发表于 2012-03-28 10:21
1722只是和业务相关的只一个值, 如果设成宏就太多了,  不过你说的对, 单个的话应该设成宏
    m ...


纯属画蛇添足,对代码没有信心的表现

论坛徽章:
0
7 [报告]
发表于 2012-03-28 10:26 |只看该作者
enough_zerg 发表于 2012-03-28 10:14
问题是有啊
1.为什么要有那么多magic number?
2.至于局部变量声明这个问题的话,C现在也是支持的


   这正是我纠结的地方.
   如果每个变量都认真的为其命名, 那么花在这项工作上的精力势必过多, 另外
   长的变量名让程序丑陋.

   因为上面的例子中用到的是局部变量, 它的作用空间只在6行代码内, 编程人员
   一眼就能看明白了, 它的命名应该精简.

  于此对比的是, 全局对象(函数, 变量等等)的命名更花些心思.

论坛徽章:
0
8 [报告]
发表于 2012-03-28 10:29 |只看该作者
hellioncu 发表于 2012-03-28 10:24
纯属画蛇添足,对代码没有信心的表现



   可是我曾经经历过因为没有memset而strftime错乱的情况, 因为localtime并没有
   帮我们做太多事, 此问题可能因不同标准库而不同

论坛徽章:
0
9 [报告]
发表于 2012-03-28 10:34 |只看该作者
本帖最后由 x5miao 于 2012-03-28 10:35 编辑

回复 7# MarkAllenWeiss


    支持,小的语句块里面的变量命名只要不和外部的冲突,还是尽量短点吧。


另外,不知道你那个同事是那一年毕业的?基本上现代的C编译器都支持变量使用前声明,而不需要在作用域的开头声明。即使对C99支持不完整的编译器对这个特性还是支持的,因为太有用了

论坛徽章:
0
10 [报告]
发表于 2012-03-28 10:36 |只看该作者
回复 7# MarkAllenWeiss

良好的变量命名不会使程序变的丑陋,而会使你的程序变的便于维护(假设你维护的
是别人的代码,请问你看到毫无意义又简陋的繁多的变量名时,你会不会抓狂?)


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP