9 月 13 日,2025 Inclusion・外滩大会「开源嘉年华」正在限量报名中! 了解详情
写点什么

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

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

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

关注

评论

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

十大排序算法--冒泡排序

Ayue、

排序算法 8月日更

20道高频面试题(含答案),看完豁然开朗

Java 程序员 面试 后端

如何做分库分表,常见方案汇总

架构精进之路

MySQL 分库分表 8月日更

kubernetes/k8s CRI 分析 - 容器运行时接口分析

良凯尔

Kubernetes 源码分析 Kubernetes Plugin #Kubernetes# cri-o

渣男已经预订大碗牢饭,“科技渣男”怎么还在疯狂套路?

白洞计划

35岁程序员半月4轮面试,HR的话扎心了

策划Java工程师

Java 程序员 面试 后端

异常机制的概述

程序员阿杜

Java 8月日更

Numpy 常用数据结构和清理函数

若尘

Numpy 数据清洗 Python编程 8月日更

Spring 源码解析 -- SpringWeb过滤器Filter解析

Java spring 源码阅读

中大型组织 DevOps 成熟度模型设计

Phodal

DevOps thoughtworks phodal

🏆【Java技术之旅】教你如何使用异步神器CompletableFuture

码界西柚

Java 异步编程 8月日更 CompetableFuture

Web 身份验证:Cookie 与 令牌

devpoint

Cookie 8月日更

使用PSI(Pressure Stall Information)监控服务器资源

mazhen

Linux DevOps Linux Kenel linux运维

爱你的人,会管着你。而不是惯着你。

石云升

娱乐圈 8月日更 刑法

2021谈一下当下最合适的Java架构,感悟分享

Java 程序员 面试 后端

35岁的程序员被裁,电子版已问世

策划Java工程师

Java 程序员 面试 后端

Vue进阶(幺捌零):JS 向 Vue 传值

No Silver Bullet

Vue 8月日更

Vue进阶(幺柒幺):前端用户体验提升(五)Flex实现弹性布局

No Silver Bullet

Vue Flex 8月日更

35岁的程序员被裁,90%的人看完都说好

策划Java工程师

Java 程序员 面试 后端

35岁程序员半月4轮面试,项目实战

策划Java工程师

Java 程序员 面试 后端

Python 数值中的下划线是怎么回事?

Python猫

Python

25K大牛甩出的超详细面试总结,已获万赞

策划Java工程师

Java 程序员 面试 后端

25K大牛甩出的超详细面试总结,砥砺前行!

策划Java工程师

Java 程序员 面试 后端

互相讨厌的奥运与气候

脑极体

来自跨越边界的急件,我推荐你用这三步,走出锁住你的圈套。

叶小鍵

【Flutter 专题】131 图解 AnimatedList 动画列表

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

恐惧和自我偏见 -- 成长的最大障碍

俞凡

认知

2021谈一下当下最合适的Java架构,神操作!

Java 程序员 面试 后端

34岁Java开发大叔感慨,100%好评!

策划Java工程师

Java 程序员 面试 后端

350道Java面试真题分享,王者笔记!

策划Java工程师

Java 程序员 面试 后端

35岁以后的Java程序员出路在哪里?最全的BAT大厂面试题整理

策划Java工程师

Java 程序员 面试 后端

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