写点什么

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

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

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

关注

评论

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

一束光的旅程

白洞计划

Java面试必问:一位清华大牛用一个坦克大战讲明白了23种设计模式(视频+源码笔记)

Java架构追梦

Java 架构 面试 设计模式 坦克大战

经常被面试官问道的JavaScript数据类型知识你真的懂吗?

koala

JavaScript 面试 大前端

阿里P7大牛手把手教你!美团Android开发工程师岗位职能要求,附赠课程+题库

欢喜学安卓

android 程序员 面试 移动开发

小鼎量化机器人系统开发详情介绍

系统开发咨询1357O98O718

Apache Ranger安全认证配置

大数据技术指南

大数据 3月日更

Spark性能调优-Shuffle调优及故障排除篇

五分钟学大数据

spark Spark调优 3月日更

SpringBoot-技术专题-启动自动装配过程

码界西柚

spring springboot

WC,误删数据库了,会被开除吗?

Java架构师迁哥

滴滴OCE惊喜福利!

滴滴云

如何实现一个简易版的 Spring - 如何实现 Setter 注入

mghio

spring 依赖注入

悖论和直觉

阳龙生

4大华为云“安全镖局”秘密法宝揭秘

华为云开发者联盟

态势感知 华为云 企业主机安全 数据安全中心 Web应用防火墙

Ai特征选择,一篇就够了

泳鱼

Python 人工智能 机器学习 深度学习 AI

巩固知识体系!应聘高级Android工程师历程感言,面试建议

欢喜学安卓

android 程序员 面试 移动开发

Android开发必须要会!2021大厂Android面试经验,全网疯传

欢喜学安卓

android 程序员 面试 移动开发

【实战问题】-- 缓存穿透之布隆过滤器(1)

秦怀杂货店

缓存 布隆过滤器 java;

领域驱动设计101 - 绑定模型与实现

luojiahu

领域驱动设计 DDD

Google Material Design 元件库

zhuchuanming

元件库

Ai调参炼丹,一篇就够了

泳鱼

Python 机器学习 深度学习 AI

Python OpenCV 图像旋转,取经之旅第 11 天

梦想橡皮擦

3月日更

HUBDEX交易所系统开发源码案例

系统开发咨询1357O98O718

如何阅读 Java 字节码(Byte Code)

Kori Lin

Java JVM bytecode 字节码

实例讲解如何制作Python模式程序

华为云开发者联盟

Python 编程语言 星型程序 Programs 模式程序

一文归纳Python特征生成方法(全)

泳鱼

Python 机器学习 深度学习

EGG NETWORK永动金融EFTalk火爆来袭

币圈那点事

深入理解 JavaScript, 从作用域与作用域链开始

koala

JavaScript 大前端

【JS必知必会】高阶函数详解与实战

koala

JavaScript 面试 大前端

数据加密:你应该知道的数仓安全

华为云开发者联盟

数据加密 GaussDB(DWS) 数仓安全 透明加密 加密函数

2021年GitHub上爆火的999页Java面试宝典终开源

比伯

Java 编程 架构 面试 程序人生

牛链NB系统开发案例源码

系统开发咨询1357O98O718

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