写点什么

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

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

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

关注

评论

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

【CSS 学习总结】第五篇 - CSS 变量 var

Brave

CSS 12月日更

如何根据不同业务场景调节 HPA 扩缩容灵敏度

xcbeyond

Kubernetes 28天写作 12月日更

圣诞节

Tiger

28天写作

Golang中的协程是干什么用的?

liuzhen007

28天写作 12月日更

JavaScript 中对象和映射之间的 6 个区别

devpoint

JavaScript map Object 12月日更

模块3作业

miliving

深圳买房记

hackstoic

房地产

物联网场景中灵活实施对设备的控制管理

亚马逊云科技 (Amazon Web Services)

IoT

左手自研,右手开源,技术揭秘华为云如何领跑容器市场

华为云开发者联盟

Docker 开源 Kubernetes 容器 云原生

面试官:说说32位和64位

喵叔

28天写作 12月日更

十大排序算法思想与Python实现

宇宙之一粟

Python 排序算法 12月日更

Amazon ES现更名为Amazon OpenSearch Service并支持OpenSearch 1.0

亚马逊云科技 (Amazon Web Services)

IoT

使用模版自动化 Amazon IoT 设备创建及证书注册过程

亚马逊云科技 (Amazon Web Services)

IoT

LabVIEW灰度图像操作与运算(基础篇—2)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 灰度图像操作与运算

【CSS 学习总结】第四篇 - CSS 选择器-伪类和伪元素

Brave

CSS 12月日更

23《重学JAVA》--泛型

杨鹏Geek

Java25周年 28天写作 12月日更

构建安防视频云存,和传统安防视频业务的烦恼说再见!

亚马逊云科技 (Amazon Web Services)

IoT

利用 Cognizant APEx 2.0 和 Amazon IoT SiteWise Edge 提高产品质量

亚马逊云科技 (Amazon Web Services)

IoT

圣诞节

圣迪

圣诞节 圣诞老人 平安夜 尼古拉斯 长筒袜

收集、处理并监控设备数据——Amazon IoT SiteWise Edge“一网打尽”

亚马逊云科技 (Amazon Web Services)

IoT

Capgemini 如何利用 Amazon IoT 通过农业洞察监控农田

亚马逊云科技 (Amazon Web Services)

IoT

Amazon IoT Core 服务成本优化

亚马逊云科技 (Amazon Web Services)

IoT

给弟弟的信第23封|如何写一篇文章?

大菠萝

28天写作

PassJava 开源 (六) :整合Spring Cloud Alibaba Nacos组件

悟空聊架构

28天写作 passjava 悟空聊架构 12月日更 naocs

设计千万级学生管理系统的考试试卷存储方案

drizzle

「架构实战营」

1个通用工具平台+多个热点场景工具套件,助力开发者快速构建应用

华为云开发者联盟

云计算 低代码 开发工具 devcloud 应用构建

为什么要空投?(24/28)

赵新龙

28天写作

利用Amazon Lambda实现Amazon IoT设备证书的即时注册

亚马逊云科技 (Amazon Web Services)

IoT

Certificate Vending Machine – Amazon IoT 设备接入 Amazon IoT 平台解决方案

亚马逊云科技 (Amazon Web Services)

IoT

Servlet基础知识与新手常遇到的错及解决方法(01)

海拥(haiyong.site)

服务器 28天写作 12月日更

2022年就要开始啦

搬砖的周狮傅

目标

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