速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

  • 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:337129
用户头像

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

关注

评论

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

Spring Boot自动装配的原理

Java收录阁

Spring Boot

分布式限流框架 - Sentinel

Java收录阁

dubbo sentinel

c++11新特性之列表初始化

泰伦卢

c c++ C#

c++11新特性之模板的改进

泰伦卢

c c++ C#

程序员容易忽略的问题

Janenesome

读书笔记 程序员 编程习惯

c++11新特性,所有知识点都在这了!

泰伦卢

c++

Spring Cloud集成Sentinel

Java收录阁

Spring Cloud sentinel

自助设备系列——推广

孙苏勇

产品 行业资讯 智能设备

谈知识付费

兆熊

c++11新特性之智能指针

泰伦卢

c++

左值引用、右值引用、移动语义、完美转发,你知道的不知道的都在这里

泰伦卢

c c++ C#

设计模式入门和策略模式

设计模式

Redis学习笔记(有序集合)

编程随想曲

redis

你体验过 “心流时刻” 吗?

Janenesome

读书笔记 高效工作 碎碎念

产品周刊 | 第 14 期(20200510)

八味阁

产品 产品经理 产品设计

在实战中学习项目管理

兆熊

项目管理 专栏

如果想了解驱动开发,请不要错过这篇。

水滴

最佳实践 开发者 程序设计 测试驱动开发实战营

一位狂热崇拜亚里士多德的男士在酒吧试图勾搭一位女士

黄大路

小说 哲学

内存对齐

泰伦卢

c c++ C#

业务开发过程中的特殊逻辑

Janenesome

产品 碎碎念 开发

Dubbo和Spring集成的原理

Java收录阁

dubbo

Sentinel集成Nacos实现动态流控规则

Java收录阁

sentinel

浅析 - CocoaLumberjack 3.6 之 FileLogger

Edmond

ios log4j CocoaLumberjack DDLog 日志轮替

数据产品经理|关于产品续费率的思考

黄大路

数据挖掘 数据分析 产品经理

c++11新特性之std::function和lambda表达式

泰伦卢

c c++ C#

c++11新特性之线程相关所有知识点

泰伦卢

c c++ C#

RAII妙用之计算函数耗时

泰伦卢

c++ C#

C++11的类型推导详解

泰伦卢

c c++ C#

游戏夜读 | 如何制作互动剧?

game1night

火箭架构思维模型六元组 - 势 道 法 术 器 界

常平

架构 分布式 架构模式

你真的理解线程么?

Simon郎

Java 后端 多线程

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