50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

  • 2012-05-30
  • 本文字数:864 字

    阅读完需:约 3 分钟

全局变量永远是不受欢迎的,因为它会带来太多的问题,所以,诸如 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 )关注我们,并与我们的编辑和其他读者朋友交流。

2012-05-30 21:337557
用户头像

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

关注

评论

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

钱包开发:区块链钱包热钱包​加密货币开发公司集成服务

区块链软件开发推广运营

交易所开发 dapp开发 区块链开发 链游开发 NFT开发

Transformer与预训练语言模型的探索

百度开发者中心

人工智能 大模型 LLM

通过Python脚本支持OC代码重构实践(二):数据项提供模块接入数据通路的代码生成

百度Geek说

Python 重构 脚本 企业号10月PK榜

工赋开发者社区 | 数字化转型的两大关键点:转什么 ,如何转?

工赋开发者社区

Lunar Pro for Mac(屏幕亮度调整软件) v6.2.7激活版

Rose

Mac破解软件 Lunar for Mac 显示器亮度调整

BES 在大规模向量数据库场景的探索和实践

Baidu AICLOUD

elasticsearch 向量检索 大模型

大模型训练中Loss出现NaN的解决策略

百度开发者中心

大模型训练 大模型 LLM

大模型在金融监管科技中的应用价值

百度开发者中心

人工智能 大模型 LLM模型

网站加速神器:国外服务器让你的网页飞起来

一只扑棱蛾子

国外服务器

SecureCRT常见问题|不允许从系统上的所有字体中进行选择

Rose

SSH SecureCRT激活 SecureCRT常见问题 SecureCRT不能选择字体 SecureCRT Mac破解版

详述 IntelliJ IDEA 遇到 Maven 项目 pom.xml 文件没有识别的解决方法

Rose

IntelliJ IDEA

中文最新Infuse 激活安装包7.6.2

胖墩儿不胖y

Mac软件 多媒体播放器

云资源信息安全就用行云管家!

行云管家

云计算 云安全 云资源

企业如何对多个IT系统快速管理?谁能告诉一下!

行云管家

IT运维 安全运维 运维管理

开发第一个flutter应用时需要注意什么

Onegun

flutter 前端框架

API管理平台搭建过程问题总结

谷云科技RestCloud

API ipaas API 安全

一文带你了解什么是“三渲二”?

Finovy Cloud

3D 建模 影视动漫

利用LLM大模型和智能问答BI实现智能报表生成

百度开发者中心

人工智能 数据可视化 大模型 LLM

Cinema 4D 2023常见问题:c4d 2023看不到新的加厚和对称对象怎么办?

Rose

c4d 2023 加厚和对称对象 Cinema 4D中文破解

生产管理MES系统的功能和作用/开源MES

万界星空科技

数字化转型 生产管理系统 mes #开源 开源mes

代码之丑(十一)——封装全局变量_Java_郑晔_InfoQ精选文章