写点什么

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

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

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

关注

评论

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

东方园林应邀参加人民网《人民会客厅——两会时刻》栏目访谈

科技大数据

信通院牵头数列科技参与主编的《信息系统稳定性保障能力建设指南》正式发布

TakinTalks稳定性社区

netty系列之:netty中的核心MessageToByte编码器

程序那些事

Java Netty 程序那些事 4月月更

Flutter 简单实用的 fluro 路由管理插件简介

岛上码农

flutter 大前端 ios开发 安卓开发 跨平台开发

《数据密集型型系统设计》LSM-Tree VS BTree

懒时小窝

哈希 B-tree 列式存储 LSM-Tree

Postman中文版客户端

Liam

Jmeter Postman API swagger Mock

Tapdata Cloud 2.1.2 来啦:大波细节已就绪!字段类型可批量修改、支持微信扫码登录、新增支持 Vika 为目标

tapdata

计算机网络: IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解

喀拉峻

网络安全 IP

津厦两地托育行业发展线上视频交流会成功召开

InfoQ 天津

大数据洞察画像自动化实践

网易云信

大数据

软件设计模式:适配器模式

正向成长

设计模式 适配器模式

在线JSON压缩工具

入门小站

工具

模块二:作业微信朋友圈的高性能复杂度

本人法海

「架构实战营」

Rust中值销毁前的清理动作

Shine

rust

AI 加持实时互动|ZegoAvatar ⾯部表情随动技术解析

ZEGO即构

计算机视觉 即构科技 Avatar

吹爆Python,解决了10个痛苦已久的难题

Jackpop

前端食堂技术周刊第 31 期:Vue 3、Vitest 中文文档上线、Pinia 正式成为 Vue 官方默认推荐的状态管理库、Vite v2.9.0

童欧巴

JavaScript 前端 Web web前端 前端工程师

沙龙:如何使信息系统更加稳定

博睿数据

Linux之lastb命令

入门小站

完美结合,10款提升编程能力的游戏项目!

Jackpop

ElasticSearch写入流程详解

IT巅峰技术

elasticsearch

持续精进,性能突破,openGauss 3.0社区版正式发布

Geek_32c4d0

GaussDB(for openGauss) 社区版

Whats On Tap | Tapdata Cloud 如何助力大型家居连锁商城推进数字化经营?

tapdata

北京市支援合作办公室党组书记、主任丁勇一行到正镶白旗调研京蒙协作工作

科技大数据

新闻速递 I MobTech首席数据官杨冠军受CSDN之邀,探索企业数字化转型最佳路径

MobTech袤博科技

数字化转型 企业 数智未来

一文浅谈:我们为什么需要云原生

穿过生命散发芬芳

4月月更

Redis(二)分布式锁与Redis集群搭建

神农写代码

Redis集群架构剖析(4):槽位迁移,重新分配

非晓为骁

redis 分布式架构 redis cluster

中国信通院联合OpenMLDB邀您参加《开源数据库发展研究报告》调研问卷

第四范式开发者社区

数据库 大数据 开源

2022第12周-程序接盘侠

李印

离职交接

在线正则表达式可视化测试工具

入门小站

工具

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