工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > C/C++ > 正文
C/C++作用域引申出的编码规范
[文章信息]
作者:周星星
时间:2004-06-18
出处:论坛
责任编辑:方舟
[文章导读]
编码规范非常重要,不仅仅在于没有了它在团体合作中互相读不懂对方的代码,还在于以后的自己也可能需要维护以前自己写的代码
advertisement
热点推荐
· Excel动画图解:“高级筛选”
· 如何使用Ghost备份和恢复系统
· Visual C++ MFC 中常用宏的含义
· PS色彩调整简明教程:色彩调整图层
· 巧用资源实现文件共享
[正文]
  编码规范非常重要,不仅仅在于没有了它在团体合作中互相读不懂对方的代码,还在于以后的自己也可能需要维护以前自己写的代码,还在于可读性越强越不容易犯一些常规错误。

  规范本身应该是一个规定,但C/C++在编码上并没有这样的规定,凡符合C/C++语法的就是合格的代码,但符合C/C++语法的代码不一定是优秀的代码,要对一些不良行为做约定,比如不应该将局部使用的变量作为全局变量,这是其一;其二,代码本身也可能会进行合作开发或后期维护,那么一个表达统一结构清晰的代码是必要的。由这两点产生了编码规范,所以编码规范就是公司或团体对代码编写的一个规定和约定。

  对于第二点而言,虽然其存在的价值是必须的,但是适用场合都有所不同性,且众口难调,缺乏非此不可的科学依据。比如大家熟悉的匈牙利命名法,其在变量名称中包含了类型信息,其优点不言而喻,在代码实现过程中非常方便,但缺点也有不少,比如 变量本身就具有类型,而名称中再次包含了类型信息,这是严重的冗余,修改变量类型就必须修改变量名称,更主要的是没有办法保证它们的一致性,总之 名称应该是对功能的描述,而不应该含有类型信息。所以即使强如匈牙利命名法,在M$的编码规范中也不将再存在。因为第二点不能放之四海而皆准,所以我将在这篇短文中讲述第一点,有科学依据则易于为人接受,但我还是要强调一下,这第一点只是编码规范存在理由的一部分,而不是全部,第二个理由也非常重要,其引申出来的规范不可缺少。

  要想写出优秀的C/C++代码有很多注意点,不是一个小短文可以描述清楚的,我这里仅仅讲述变量的作用域和生存期,根据这些规则产生的编码规范会和你曾经见到过的一些编码规范有所抵触,这不足为奇,比如很多编码规范规定了函数体的最大行数,过多的行数大部分情况下是因为功能结构化分不清,不利于阅读,但却不一定如此,如果在这个规定和规定这个规定的目的之间产生了抵触,那么这时就应该舍弃这个规定,所以我认为称它编码建议胜于称它编码规范。

  对于编码规范含义的讲解至此结束,话入正题,对于一个面向过程的语言而言,函数过程是其基本单位,函数是一个功能完整的实现过程,面向对象也如此,只是类代替了函数过程的部分地位。

  为什么要将一个过程独立成一个函数?这是因为此过程功能完整明确,在独立成一个函数之后其还具备了复用的能力。

  为什么不将一个过程独立成一个函数?这是因为此过程与其他部分耦合度太高,没有明确的功能含义,即使独立出来,也不存在可复用的场合。

  作用域就是起作用的范围,一个应该在多处起作用的对象,不应该局限于一个小空间中,反之亦然。这里可以使用的有 函数、对象、名字空间 等,假如以上皆不符合,那么就应该使用为部分人所忽视的“{}”。

  以下就是一个对变量/过程的作用域和生存期的演示:
  在很多地方都可能会用到的函数或类型()

{
};

  一个功能函数或类型()

{
 仅在此函数或类型中用到且多次用到的子函数或子类型() // C++没有子函数这一说法,可以使用函数对象(仿函数)替代
{
};

  在接下来的部分也需要用到的变量; // 注意这个分号

{
 仅在这个{}中用到的临时变量;
 仅在此函数或类型中用到且只用到一次的功能段
}

  函数或类型其他部分;
};

  这样就将变量和过程局限在它们应有的空间中,避免了变量和过程对以后的变量和过程的污染,尤其在代码量很大的程序中,而且因为有了{}区分不同的功能代码,使得程序可读性增强。当然一切还是了可读性,看以下这个情况:

  某个功能代码的第一行;
  某个功能代码的第二行;
  某个功能代码的第三行;
  {
   只为此功能实现一次的,由与此功能无逻辑关系的代码第一行;
   第二行;
   …… ;
   第 n行;
  }
  某个功能代码的第四行;
  某个功能代码的第五行;
  某个功能代码的第六行;

  这样实现也许逻辑清晰,但在代码编辑器中需要非常麻烦的上下翻页才能看到连续的功能代码,而且{}中的代码太长,像个丑陋的补丁,这时候将{}中的代码移到一个独立子函数中比较适合,就变成了

  某个功能代码的第三行;
  {
   call子函数( 参数s ); // 上下的{}可以不要
  }
  某个功能代码的第四行;

  当然前面也提到过如果这个子函数和这个功能代码段的耦合性太强的话,就需要传递很多的参数,这没有什么好的方法,因为这毕竟是为了可读性而作出的妥协。

  局部类(比如定义在函数内部的类)有一些令人不快的功能限制,比如没办法作为模板参数,我还不知道在c++中为什么有这样的限制,但这一点确实确实令人不快。

  短文完毕,编码规范有很多,希望这篇短文可以起到抛转引玉的作用,谢谢!


天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • C++开发常用工具“群英会”
  • 使用C++深入研究.NET委托与事件
  • 使用纯粹的C++语言编写COM组件
  • 解析C++中的内部连接与外部连接
  • C++实现三维视图绘制与消隐技术
  • 杨元庆终未能如愿 陈俊圣被台积电招至麾下
  • 女CEO辞职无损惠普“形象” 股价不降反升
  • 专家论道:跨国并购与打造中国IT跨国公司
  • 收购案后 甲骨文公布产品联合路线发展计划
  • 电子电器业人才需求解读 三类人才持续走俏
  • 公安机关:网上销售违禁品多为诈骗勿购买
  • IT企业巨头出谋献策 成都优先发展软件产业
  • 我国将加快以社会信息化推进城市应急联动
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索