写点什么

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

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

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

关注

评论

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

TDS构建数据湖、数据仓库应用介绍

星环科技

react源码解析16.concurrent模式

buchila11

React React Hooks

Java 动态代理之 InvocationHandler 最简单的入门教程

汪子熙

Java 动态代理 28天写作 SAP 12月日更

说了半天跨平台,今儿咱就来跨跨!(上)

为自己带盐

Docker dotnet 28天写作 签约计划第二季 12月日更

Java 开发中常见的 10 个错误

编程江湖

JAVA开发 java编程

从源码分析快速实现对新开源软件的检测

华为云开发者联盟

二进制 开源软件 二进制SCA 特征

Kotlin 初学者教程【Kotlin专题1】

坚果

kotlin 28天写作 12月日更

分布式系统中,权限设计实践

架构 分布式 权限设计

如何查看Java进程和线程

李子捌

28天写作 JAV A 12月日更

全面适配DPDK 20.11,DPVS发布v1.9.0版本

爱奇艺技术产品团队

架构训练营 模块五 作业

dog_brother

「架构实战营」

quarkus微服务+istio+k8s云原生devops持续集成演示( Tekton(ci/cd) + quarkus + harbor + Nexus)

weir威尔

Kubernetes istio 持续集成 Tekton Quarkus

大厂算法面试之leetcode精讲22.字典树

全栈潇晨

LeetCode 算法面试

异构组网如何解决共享资源冲突?|HDC2021技术分论坛

HarmonyOS开发者

HarmonyOS

Flutter 自定义 ACERaido 单选框 & ACECheckBox 复选框

阿策小和尚

28天写作 内容合集 签约计划第二季 12月日更

Git进阶(九):Git 命令实现提交指定文件

No Silver Bullet

git 12月日更

大厂算法面试之leetcode精讲21.树

全栈潇晨

算法 LeetCode

深度解读|Spark 中 CodeGen 与向量化技术的研究

Kyligence

node服务端渲染

编程江湖

node.js 大前端

爱奇艺基础数据平台演进

爱奇艺技术产品团队

华为AppCube入选Forrester《中国低代码平台市场分析报告》

华为云开发者联盟

华为 低代码 AppCube 应用魔方 Forrester

python入门难?十之八九是因为python 协程吧!

梦想橡皮擦

12月日更

给弟弟的信第4封|你需要尽早知道的理财知识

大菠萝

28天写作

网络协议之:还在用HTTP代理?弱爆了!快试试SOCKS5

程序那些事

网络协议 HTTP 程序那些事 12月日更 SOCKS5

陈齐彦 Roby:开源也许是中国未来IT行业最重要的统战对象 I OpenTEKr 大话开源 Vol.1

OpenTEKr

大话开源

Linux系统学习《Linux一学就会》Linux文件系统结构

侠盗安全

Linux linux运维 运维工程师 云计算架构师

学习心得 - 架构训练营 - 毕业设计项目

Fm

react源码解析15.scheduler&Lane

buchila11

React React Hooks

让设计如语言一般自然

鲸品堂

设计 通信 运营商

瞰源 | 当我们谈论开源时,我们在谈论什么?

OpenTEKr

狄安瞰源

java开发SSM框架整合之MyBatis动态SQL

@零度

mybatis ssm JAVA开发

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