2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

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

关注

评论

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

如何在Linux (CentOS7.3) 下安装JDK1.8?【一篇文章教会你】

Bug终结者

java; Linux Kenel 8月月更

开发者独立搭建一个跨模态搜索应用有多难?

Jina AI

深度学习 云原生 神经搜索 跨模态应用 多模态数据

基于 Next.js实现在线Excel

葡萄城技术团队

前端 在线excel nextjs 表格 控件

使用python获取浏览器收藏夹和历史浏览记录,然后可以...

技能实验室

签约计划第三季

直播系统开发——直播间架构的设计及难点分析

开源直播系统源码

软件开发 语聊房 语音聊天源码 直播系统开发

智能电视可以打开小程序应用,再也不用头痛内存了

Geek_99967b

小程序

未来已来,只是尚未流行

石云升

读书感悟 未来社会 8月月更 未来以来

信创是什么意思?涉及哪些行业?为什么要发展信创?

行云管家

信息安全 信创

兆骑科创创新创业大赛活动举办,线上直播路演,投融资对接

兆骑科创凤阁

干货丨数学规划视角下的分货优化解题思路

杉数科技

运筹优化 智能分货 供应链计划 仓储优化 门店分货

IDC:阿里云稳居中国大数据平台公有云市场第一位

阿里云大数据AI技术

阿里云

百度APP Android包体积优化实践(三)资源优化

百度Geek说

Andriod

2022年7月国产数据库大事记-墨天轮

墨天轮

数据库 腾讯云 GaussDB 国产数据库 KingBase

《分布式云最佳实践》分论坛,8月11日深圳见

阿里云弹性计算

分布式云 飞天 数字化升级 一云多形态

leetcode 48. Rotate Image 旋转图像(Medium)

okokabcd

数组 LeetCode 数据结构与算法

Vue3 初探

怀府风

从-99打造Sentinel高可用集群限流中间件

艾小仙

Java 高可用 sentinel 集群限流

Pisanix v0.2.0 发布|新增动态读写分离支持

SphereEx

数据库 开源 ShardingSphere SphereEx

快速打造安全的车联网平台

Geek_99967b

小程序

【SpringBoot 二】spring.factories加载时机分析

石臻臻的杂货铺

springboot 8月月更

如何通过使用“缓存”相关技术,解决“高并发”的业务场景案例?

冉然学Java

高并发 java; 单线程 redis'

《中国综合算力指数》《中国算力白皮书》《中国存力白皮书》《中国运力白皮书》在首届算力大会上重磅发出

GPU算力

化繁为简,聊一聊复制状态机系统架构抽象

阿里技术

数据库 架构

大数据开发,Hadoop Spark太重?你试试esProc SPL

华为云开发者联盟

大数据 开源 后端

Mybatis中#{}和${}的区别

开发微hkkf5566

技术分享| 小程序实现音视频通话

anyRTC开发者

小程序 uni-app 音视频 语音通话 视频通话

中大型商业银行堡垒机升级改造就用行云管家!必看!

行云管家

信息安全 银行 堡垒机 IT安全

重构指标之如何监控代码圈复杂度

京东科技开发者

测试 重构 软件重构 分布式应用软件

【SpringBoot 一】SpringApplication启动类的Args详解

石臻臻的杂货铺

spring-boot 8月月更

HTTP和HTTPS的区别

开发微hkkf5566

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