BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

代码之丑(十一)——封装全局变量

| 作者 郑晔 关注 2 他的粉丝 发布于 2012年5月31日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

全局变量永远是不受欢迎的,因为它会带来太多的问题,所以,诸如Java这样的程序设计语言干脆摒弃了全局变量。一旦我们有机会面对全局变量,想都不要想,干掉它。

if (IDLE == g_status) {
  ...
}

那个g打头的家伙就是全局变量,它就是我们的靶子。第一直觉,我们不要直接访问全局变量,那就用函数把它封装起来:

int getCurrentStatus() {
  return gStatus;
}

于是,代码变身了:

if (getCurrentStatus() == IDLE) {
  ...
}

把变量封装成函数,从某种角度说,这是一种进步。但我想说,这还不够。这只是一种简单的封装,本质上来说,这与直接暴露数据差别不大,我们需要更好的封装,通常的做法是封装出行为。行为从哪来,从实际需求来。

就以上面这段代码为例,我们封装了status,其实,它的目的是为了与IDLE状态相比较,这就是一种行为,我们可以这样封装:

bool isCurrentStatus(int status) {
  return status == g_status;
}

if (isCurrentStatus(IDLE)) {
  ...
}

还有一种修改方式,既然IDLE是一个固定的常量,索性把它也隐藏起来:

bool isIdle() {
  return IDLE == g_status;
}

if (isIdle()) {
  ...
}

实际上,这种封装出行为的方式不仅仅适用于全局变量,把数据拿出来再用的情形也是经常可以见到的:

if (machine.getStatus() == IDLE) {
  ...
}

封装的方式同上面一样,这里选择一种实现:

class Machine {
  ...
  bool isIdle() {
  return status == IDLE;
  }
}

if (machine.isIdle()) {
  ...
}

封装,就得封装出个行为来。

作者简介:

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

查看原文:代码之丑(十一)


感谢张凯峰对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

不要歧视全局变量!!! by baozi alex

你的只是把一个全局变量,变成全局函数,再变成一个全局类。

不同的变量、函数、类,应该放到相应的作用域中。
全局、名字空间、模块、局部等。

Re: 不要歧视全局变量!!! by gaf king

是这样,全局变量不是全民公敌,不被滥用即可。

Re: 不要歧视全局变量!!! by 苏 龙

如果所有的东西都不被滥用就好了。问题就出在没有好的办法让人用,同事又不让人滥用。

仅封装判断部分还不够,应进一步将整段 if 语句封装起来! by 高 翌翔

既然做了封装,就要封装得干净利落,
仅封装判断部分还不够,应进一步将整段 if 语句封装起来,
即用简洁的函数名来说明整段 if 语句的用途!

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

4 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT