Chinaunix首页 | 论坛 | 博客
  • 博客访问: 56414
  • 博文数量: 16
  • 博客积分: 691
  • 博客等级: 上士
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-07 14:53
文章分类
文章存档

2010年(16)

我的朋友

分类: C/C++

2010-12-05 14:38:08

    转载按:这是我在InfoQ上看到的一个关于代码书写规范的一系列的讨论,文后的评论,有些比较有意思的,我也一并摘抄下来了,大家有什么看法、想法也可以在这里继续讨论。




这是一段长长的C++代码,我的问题是:relaPri、relaSec和 scoutBySec这三个变量在哪里用到了?

void DealForServiceA(const char *oprCode, const char *subID, const char *oID, XList *callCicsList) {
    XString relaPri(“NULL”);
    XString relaSec(“NULL”);
    XString scoutBySec(“0”);
    XList *tempList = new XList ;
    callCicsList->Add(tempList);
    tempList->Add(new XString(oprCode));
    tempList->Add(new XString(oID));
    XString *psTelNum = new XString;
    tempList->Add(psTelNum);
    GetServnumberBySubsID(subID, *psTelNum);
    tempList->Add(new XString(relaPri.table { font-size: 10pt;}c_str()));
    tempList->Add(new XString(relaSec.c_str()));
    tempList->Add(new XString(scoutBySec.c_str()));
}


经过认真仔细的查看,或是使用传说的中“查找”功能,我们发现上面提到的那三个变量只在最后用了一下。

不知道你是否注意到,我在最初特意强调了一下这是C++代码。这意味着,变量可以随用随声明,而不必像传统的C程序那样,只能在函数的开头把函数内部用到的变量一口气声明。 那么 ,我们就让声明和使用团聚吧!

XString relaPri(“NULL”);
tempList->Add(new XString(relaPri.c_str()));
XString relaSec(“NULL”);
tempList->Add(new XString(relaSec.c_str()));
XString scoutBySec(“0”);
tempList->Add(new XString(scoutBySec.c_str()));


当声明和使用走到一起,我们的观察就有了新的视角,其实,这几个变量完全是可以不声明的,于是,代码再进一步:

tempList->Add(new XString(“NULL”));
tempList->Add(new XString(“NULL”));
tempList->Add(new XString(“0”));


看到这里,我们就可以看出原来的做法到底有多么浪费:浪费时间给变量起名字——我们都知道,起个好名字不容易,也 浪费了时间在执行上,修改前的代码创建了两个XString对象,而修改后,只创建了一个对象。

或许,你会觉得,有个变量会让我们了解这里实际上填加的内容到底是什么。不过,也许一个好的函数命名才是更好的选择,比如addRelaPri。这 个疑问会揭示出这段代码存在另外一个问题,直接使用基本的数据结构而没有进行封装。不过,这不是这里讨论的目标,就到此打住吧!

根据这段代码的调整,我们得出一条规则:

  • 代码的声明和使用应尽量接近。

有的C程序员会暗自念叨,这个要求对C程序来说,简直太不合情理了。好吧!我承认,从语言的角度来说,是这样的。但是,我们需要仔细想想,为什么对于C语言来说,变量的声明和使用会距离遥远。通常,遥远的背后意味着硕大的函数,这才是让声明和使用天各一方的重要原因。

在干净代码的世界里,大函数永远是不受欢迎的。为了让声明和使用尽早团聚,请把函数写小。



以下是原出处的评论(摘抄):

2010年11月30日 上午1时29分 发表人 Cui Anders

小函数是比较理想的情况,实际情况是,我遇到过超过两千行的函数,没办法也不允许去重构这些代码,这时候就让人向往声明使用的团聚了。

--------------------------------------------

2010年11月30日 上午6时32分 发表人 jialiang liang

我还没碰过2000+行的代码,但是一般比较大的函数(50+),我都可以找到很多可以重构的地方,或者是重复代码,或者是不同职责的代码混杂在一起。 2000 + 的大函数不可能找不到重构的地方吧?

阅读(958) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-12-07 10:01:44

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com