在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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

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

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

关注

评论

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

一键生成rpc网关服务项目代码,让你轻松实现跨语言、跨平台的服务调用

vison

微服务 Go 语言 gin 代码自动生成 rpc gateway

《一文带你读懂:云原生时代业务监控》

后台技术汇

三周年连更

Go的内存模型:如何保证并发读写的顺序性?

Jack

iOS MachineLearning 系列(9)—— 人物蒙版图生成

珲少

Bitmap引起的OOM问题

芯动大师

App 三周年连更 Out Of Memory

Qz学算法-数据结构篇(非线性结构、树)

浅辄

数据结构 三周年连更

Django笔记十八之save函数的继承操作和指定字段更新等实例方法

Hunter熊

Python django save auto_increment primary key

2022-04-27:用go语言重写ffmpeg的remuxing.c示例。

福大大架构师每日一题

golang ffmpeg

sdn网络

乌龟哥哥

三周年连更

华为阅读联手20余家头部内容平台,共建数字化阅读

最新动态

挑战 30 天学完 Python:Day13 列表推导式和Lambda

MegaQi

挑战30天学完Python 三周年连更

NCCL源码解析③:机器内拓扑分析

OneFlow

音视频八股文(7)-- 音频aac adts

福大大架构师每日一题

音视频 流媒体

在oracle apex中的Dialog的做法(第一部门):

back_wang

oracle dialog oracle ebs ebs

Go 语言中没有枚举类型,但是我们可以这样做

陈明勇

Go golang 枚举 Enum 三周年连更

2023 年要避免的 17 个致命的网站设计错误

海拥(haiyong.site)

三周年连更

基于STM32+华为云设计的智慧烟感系统

DS小龙哥

三周年连更

Git 速查表:初学者必备的 12 个 Git 命令

Se7en

大数据集群的部署实例

TiAmo

大数据 集群 三周年连更 开发实例

什么是软件开发领域的 disruptive innovation

汪子熙

软件工程 软件开发 三周年连更

《爱在黎明破晓前 | 我有话要说》

后台技术汇

三周年连更

ChatGPT-4!又双叒叕写了一本量化交易的书(附下载)

量化投资与机器学习

机器学习 量化投资 ChatGPT4 对冲基金 Quant

干货|SpringBoot JMS(ActiveMQ)API实践应用详解

浅羽技术

Apache 中间件 ​ActiveMQ 消息列队 三周年连更

Selenium操作已经打开的浏览器

IT蜗壳-Tango

三周年连更

从软件哲学角度谈 Amazon SageMaker

亚马逊云科技 (Amazon Web Services)

Amazon SageMaker

如何在 Linux 中查看正在运行的进程?这三个命令轻松实现!

wljslmz

Linux 三周年连更

2023移动端技术探索

轻口味

android 移动端 行业趋势 三周年连更

《详谈·张勇》

石云升

读书笔记 三周年连更

Java 中的 null 到底是什么?

Java架构历程

Java 三周年连更

【Python实战】Python采集图书信息

BROKEN

三周年连更

Spring Boot之根据数据库连接信息指定分页查询表结构信息

bug菌

Spring Boot 2 spring-boot 三周年连更

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