写点什么

专栏:代码之丑(六)——分家的声明和使用

  • 2010-11-29
  • 本文字数:1282 字

    阅读完需:约 4 分钟

这是一段长长的 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 语言来说,变量的声明和使用会距离遥远。通常,遥远的背后意味着硕大的函数,这才是让声明和使用天各一方的重要原因。

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

作者简介:

郑晔,ThoughtWorks 公司咨询师,拥有多年企业级软件开发经验,热衷于探索各种程序设计语言在真实软件开发中所能发 挥的威力,致力于探寻合理的软件开发方式,加入 ThoughtWorks 公司后,投入到敏捷开发方法的实践之中,为其他公司提供敏 捷开发方法方面的咨询服务。他的 blog 是梦想风暴

查看原文:代码之丑(六)

2010-11-29 22:135698
用户头像

发布了 22 篇内容, 共 14.3 次阅读, 收获喜欢 49 次。

关注

评论

发布
暂无评论
发现更多内容

this与super关键字(阿里巴巴面试竟然问道这个了……今天把它盘透彻了!

Java 程序员 后端

Ubuntu16安装Nvidia驱动(GTX1060显卡)

Java 程序员 后端

Vim,人类史上最好用的文本编辑器!从此以后你就是一个善良的极客!

Java 程序员 后端

东吴证券张之浩:从理论到落地的 DevOps 体系建设

BoCloud博云

DevOps 云原生 证券

Spring注解缓存设计原理及实战

Java 程序员 后端

Swagger 3

Java 程序员 后端

T-SQL——数据透视和逆透视

Java 程序员 后端

SQL Server 2008中的分区表(二):如何添加、查询

Java 程序员 后端

System

Java 程序员 后端

基于Fiber的React Diff算法源码分析

贝壳大前端技术团队

Fiber React Diff

TLS加密远程连接Docker

Java 程序员 后端

官宣!Apache ShardingSphere 5.0.0 正式发布

SphereEx

Java 数据库 Apache ShardingSphere

SQL Server 2008中的分区表(二):如何添加、查询(1)

Java 程序员 后端

SQL的单表查询

Java 程序员 后端

SSM框架示例(适合新手)(1)

Java 程序员 后端

TCP面试相关总结

Java 程序员 后端

SQL Server 高性能写入的一些总结

Java 程序员 后端

使用JDBC操作SAP云平台上的HANA数据库

汪子熙

JDBC Cloud SAP 11月日更

Tomcat性能调优

Java 程序员 后端

tomcat的maxThreads、acceptCount,对高并发的影响

Java 程序员 后端

Spring框架(五)SpringMVC高级

Java 程序员 后端

Android技术分享| 【自习室】自定义View代替通知动画(2)

anyRTC开发者

android 音视频 WebRTC 移动开发 自定义view

volatile关键字的原理和要避免的误区

Java 程序员 后端

spring的事务隔离级别

Java 程序员 后端

Spring系列之数据源的配置 数据库 数据源 连接池的区别

Java 程序员 后端

两强联手,百度智能云和中电互联打造自主可控工业互联网联合实验室

百度大脑

人工智能 百度

SSM框架示例(适合新手)

Java 程序员 后端

SymmetricDS 数据库双向同步开源软件入门

Java 程序员 后端

Tomcat 多端口,多虚拟主机配置方法

Java 程序员 后端

Spring(四):bean标签解析

Java 程序员 后端

告别AI模型黑盒子:可解释的神经网络研究

索信达控股

机器学习 模型 可解释模型 可解释机器学习

专栏:代码之丑(六)——分家的声明和使用_Java_郑晔_InfoQ精选文章