硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

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

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

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

关注

评论

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

Linux内核编译很简单,六步编译一个自己的内核

树上有只程序猿

Linux 编译

Coral Finance 将为 Zepoch 节点空投,Nautilus生态空投季开启

股市老人

Dify.AI:简单易用的 LLMOps 平台,可视化创造和运营你的 AI 原生应用

Dify

AI LLMOps

低代码平台技术分享官丨系统集成系列之领域建模

inBuilder低代码平台

AntDB数据库与东方通TongWeb完成兼容互认,共筑数字化底座核心能力

亚信AntDB数据库

数据库 AntDB 企业号 7 月 PK 榜

vhdns软件介绍与功能特性

新消费日报

oracle已有表的分表分区优化操作步骤(单表过大)

zhengzai7

oracle 表分区

更新合集 | 七月功能上新记

CODING DevOps

百度智能云连拿四年第一,为什么要深耕AI公有云市场

脑极体

AI 大模型

Golang微服框架Kratos与它的小伙伴系列 - ORM框架 - GORM

golang ORM gorm Kratos

Cassandra SSTable 合并策略(一):STCS

冰心的小屋

Cassandra STCS Compaction

Java 命令行参数解析方式探索(二):Apache Commons CLI

冰心的小屋

Java 命令行 console Apache Commons CLI

C++ 中的std::array实现编译器排序

芯动大师

热烈祝贺埃文科技荣获CCF第38届中国计算机应用大会计算机应用科学技术二等奖

郑州埃文科技

Golang微服框架Kratos与它的小伙伴系列 - ORM框架 - Ent

golang ORM Kratos

Golang微服务框架kratos实现SignalR服务

golang SignalR Kratos

Golang微服务框架kratos实现Socket.IO服务

golang socket websocket Kratos

16款好用的白板笔记软件推荐,干货整理!

彭宏豪95

效率工具 软件推荐 科技 在线白板 Mac笔记软件

微信安全基于 Flink 实时特征开发平台实践

Apache Flink

大数据 flink 实时计算

从可逆计算看DSL的设计要点

canonical

低代码 dsl 低代码平台 领域特定语言 模型驱动

如何确定产品要做什么终端?

Bonaparte

产品 产品设计 产品终端

Docker学习路线12:开发者体验

小万哥

Java c++ Go Docker 运维

Coral Finance 将为 Zepoch 节点空投,Nautilus生态空投季开启

鳄鱼视界

指标让 AI 更懂业务|Kyligence Copilot 是如何做到的?

Kyligence

Kyligence Copilot 数智助理

分布式事务两阶段提交和三阶段提交有什么区别?

王磊

java面试

如何实现高效的动态鉴权

KaiwuDB

KaiwuDB 动态鉴权

Golang微服务框架kratos实现SSE服务

golang websocket Kratos openai

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