写点什么

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

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

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

关注

评论

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

基于Serverless架构的社区文章管理小工具

刘宇

抖音快手短视频SEO系统开发

web技术分享| 实现WebRTC多个对等连接

anyRTC开发者

音视频 WebRTC JavaScrip web技术分享

科技平台与社会的和谐相处

CECBC

神策数据微信小程序 SDK 架构解析

神策技术社区

大前端 后端 数据 代码 数据采集

fil为什么会暴涨?fil暴涨还会持续吗?

区块链 分布式存储 IPFS fil币价行情 fil币会大涨吗?

测试开发之系统篇-Docker常用操作

禅道项目管理

Docker 容器 测试开发

缓存 | Redis 缓存避坑指南

RadonDB

数据库 redis

从源码角度解析线程池中顶层接口和抽象类

华为云开发者联盟

Java 线程 软件开发 高并发 线程池

李欲晓:加强关键信息基础设施安全保护的法治基石

郑州埃文科技

抖音快手短视频SEO营销系统软件开发价格

短视频go研发框架实践

百度Geek说

百度 架构 后端 短视频 hulk

用手机写代码:基于Serverless的在线编程能力探索

刘宇

接口管理工具APIPOST的预/后执行脚本里,常见的响应参数变量和常用方法集合——apipost

Proud lion

大前端 后端 Postman 开发工具 接口文档

华为海外女科学家为您揭秘:GaussDB(for MySQL)云栈垂直集成的力量有多大?

华为云开发者联盟

数据库 云数据库 GaussDB(for MySQL) 云栈 事务数据库服务

《MySQL系列》 InnoDB行记录存储结构

Silently9527

MySQL 面试 innodb innodb行记录

Android SDK 启动退出方案演进

神策技术社区

大前端 后端 代码 数据采集

抖音快手短视频平台获客系统开发内容

Go 语言, 一文彻底搞懂 map 实现原理

微客鸟窝

Go 语言 8月日更

LeetCode题解:27. 移除元素,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

Go语言那些事儿之浅谈协程并发竞争资源问题

Regan Yue

Go 语言 8月日更

百度世界2021:百度大脑升级、昆仑芯2量产、智能云加速AI落地爆发

百度大脑

人工智能 百度大脑

接口测试的时候如何一键获取cookie,并在其他接口引用

与风逐梦

软件测试 接口测试 Cookie

抖音快手短视频询盘系统开发

带你读AI论文丨用于目标检测的高斯检测框与ProbIoU

华为云开发者联盟

算法 数据集 目标检测 高斯检测框 ProbIoU

fil价格走势分析?fil为什么会大涨?

区块链 分布式存储 IPFS fil价格走势 fil大涨

一文带你了解NB-IoT标准演进与产业发展

华为云开发者联盟

物联网 IoT NB-IoT

接口文档生成工具 一键生成文档 ApiPost

CodeNongXiaoW

项目管理 大前端 测试 后端 接口管理工具

JNI 提示

Changing Lin

8月日更

前端基础四之JavaScriptDOM与事件

ベ布小禅

8月日更

抖音快手短视频营销软件系统开发案例

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