写点什么

代码之丑(十三)–封装代替嵌套容器

  • 2012-06-26
  • 本文字数:905 字

    阅读完需:约 3 分钟

第一次见到这样的代码时,我的第一感觉是,它真复杂:

复制代码
List<Map<String, String>> configurations;

可只要理性稍一回归,便不难察觉,它少东西了。少什么了呢?

看看这段代码如何使用,下面是一个缩略的版本:

复制代码
for (Map<String, String> configuration : configurations) {
for (Map.Entry<String, String> entry : configuration.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}

说白了很简单,其实就是要拿到存在 Map 里的键值对。在面向对象的程序语言中,有一种神奇的构造,叫做类,而它有一个很重要的特点叫做封装。是的,这段代码少了类,少了封装。闲言少叙,封装起来:

复制代码
public class ConfigurationItem {
private String name;
private String value;
...
}

于是,那个容器嵌套容器的声明变成了

复制代码
List<ConfigurationItem> configurations;

有了类,有了封装,我们就可以再进一步进行封装,比如前面那段代码里的

复制代码
entry.getKey() + " " + entry.getValue()

实际上,可能只是为了得到这一项的字符串表示而已,那就不如直接提供一个方法:

复制代码
public class ConfigurationItem {
...
@Override
public String toString() {
return name + " " + value;
}
}

于是,前面那个双重 for 循环就变化了:

复制代码
for (ConfigurationItem item : configurationItems) {
System.out.println(item);
}

单以丑陋而言,这段代码还算不上此类的极致,三五层嵌套也是有的,如果某些貌似负责的程序员再给每层取值都加上非空判定,那场面可是相当壮观的。

当容器开始嵌套容器,请考虑封装。

作者简介

郑晔,ThoughtWorks 公司首席咨询师,拥有十多年企业级软件开发经验,热衷于探索各种程序设计语言在真实软件开发中所能发挥的威力,致力于探寻合理的软件开发方式,加入 ThoughtWorks 公司后,投入到敏捷开发方法的实践之中,为其他公司提供敏捷开发方法方面的咨询服务。他的 blog 是梦想风暴,其微博是 @dreamhead

查看原文:代码之丑(十三)


感谢张凯峰对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-06-26 00:004124
用户头像

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

关注

评论

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

带你实现react源码的核心功能

goClient1992

React

lua中实现判断是否为局域网IP

ModStart

前端vue面试题

bb_xiaxia1998

Vue

Verilog HDL函数与任务的使用

timerring

FPGA

ChatGPT背后的经济账

OneFlow

人工智能 深度学习 大模型

react源码分析:深度理解React.Context

flyzz177

React

文盘Rust -- rust 连接云上数仓 starwift

京东科技开发者

rust Clickhouse 语言 rust语言 企业号 2 月 PK 榜

react源码分析:组件的创建和更新

flyzz177

React

react源码分析:实现react时间分片

flyzz177

React

百度工程师带你了解Module Federation

百度Geek说

JavaScript 微前端 企业号 2 月 PK 榜

实现Promise的原型方法--前端面试能力提升

helloworld1024fd

JavaScript

社招前端一面经典手写面试题

helloworld1024fd

JavaScript

高级前端常考手写面试题(必备)

helloworld1024fd

JavaScript

Backbone前端框架解读

京东科技开发者

Vue 前端 前端架构 企业号 2 月 PK 榜 backbone

从React源码来学hooks是不是更香呢

goClient1992

React

什么是WMS系统?

SAP虾客

wms

湖仓一体电商项目(十九):业务实现之编写写入DWS层业务代码

Lansonli

数据湖 湖仓一体电商项目

谈谈我对于关键思考的理解

阿里巴巴中间件

阿里云 关键

一口气讲完了Redis常用的数据结构及应用场景

小小怪下士

Java redis 程序员

前端工程师leetcode算法面试必备-二分搜索算法(上)

js2030code

JavaScript LeetCode

一文搞懂Redis

京东科技开发者

redis hash Zset Redis 协议 企业号 2 月 PK 榜

用户行为分析模型实践(三)——H5通用分析模型

vivo互联网技术

大数据 数据分析 数仓建模

几个常见的js手写题,你能写出来几道

helloworld1024fd

JavaScript

2023年国家级重大人才工程引进申报

科兴未来News

创新创业 江苏工博会 博士后 #人才政策# 启明计划

从React源码角度看useCallback,useMemo,useContext

goClient1992

React

如何实现OpenHarmony的OTA升级

OpenHarmony开发者

OpenHarmony

用javascript分类刷leetcode16.set&map(图文视频讲解)

js2030code

JavaScript LeetCode

使用 NineData 快速构建企业容灾备份

NineData

数据库 数据管理工具 数据备份 运维开发 企业容灾

让远程成为本地,微服务后端开发的福音

北京好雨科技有限公司

Kubernetes 微服务 云原生 企业号 2 月 PK 榜

前端刷完这12道滑动窗口,就可以出山面试了

js2030code

JavaScript LeetCode

代码之丑(十三)–封装代替嵌套容器_语言 & 开发_郑晔_InfoQ精选文章