写点什么

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

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

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

关注

评论

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

如何发布组件模板?

Towify

面试题:为什么不建议在MySQL中使用UTF-8?

风铃架构日知录

Java MySQL 程序员 后端 IT

乐信集团刘志诚:构建可观测、可管、可控的数据安全体系

极盾科技

数据安全

【FAQ】推送服务常见问题及解决方案

HarmonyOS SDK

HMS Core

谈谈在 select for update 中到底加了什么锁

风铃架构日知录

Java 数据库 IT 隔离级别

2022转转技术年货发布啦

转转技术团队

转转 技术年货

达摩院2023十大科技趋势发布,生成式AI将进入应用爆发期

阿里技术

云计算 AI 芯片 科技趋势

资源中心里的图片裁切如何使用?

Towify

SEO 已死,LLMO 万岁

Jina AI

人工智能 搜索引擎 SEO 谷歌 ChatGPT

会议室怎么添加预约功能?快速解决会议室使用效率问题

天天预约

小程序 SaaS 线上预约 会议室 预约工具

HarmonyOS智能座舱体验是怎样炼成的?立即查看

HarmonyOS开发者

HarmonyOS

mouseover 和 mouseenter 的区别

ModStart

用 SQL 慢死了,还是 Java Stream 快啊

风铃架构日知录

Java MySQL sql 后端 IT

开源工具系列2:Trivy

HummerCloud

云原生安全

融云再添多项荣誉!产品、服务获多方认可

融云 RongCloud

即时通讯 即时通讯IM

技术分享| anyRTC 视频监控融合方案

anyRTC开发者

监控 音视频 指挥调度 快对讲 GB28181

阿里云Imagine Computing创新技术大赛决赛启幕!

阿里云CloudImagine

云计算 阿里云 视频云 边缘云

PHP 中命令行调用 escapeshellarg 函数中文问题

ModStart

消息服务 + Serverless 函数计算如何助力企业降本提效?

Serverless Devs

助力 100+ 家企业实现 CentOS 平滑迁移,OpenCloudOS「千百双扶计划」重磅上线

OpenCloudOS

Linux centos

火山引擎DataTester升级:降低产品上线风险,助力产品敏捷迭代

字节跳动数据平台

大数据 AB testing实战

【带你读论文】向量表征经典之DeepWalk

华为云开发者联盟

人工智能 华为云 企业号 1 月 PK 榜 向量表征

TiDB 底层存储结构 LSM 树原理介绍

京东科技开发者

技术 算法 LSM树 TiDB 企业号 1 月 PK 榜

2022年总结:责任驱动开源

李孟聊AI

开源 总结

数据分析的尽头不是可视化,而是行动!行动!行动!

Kyligence

数据分析 指标洞察

阿里云计算巢 x GBase GCDW:自动化部署云原生数据仓库

云布道师

阿里云

MySql树形结构(多级菜单)查询设计方案

风铃架构日知录

Java MySQL 程序员 后端 IT

新书赠送丨《中国金融科技发展概览:创新与应用前沿》

Kyligence

数据分析 金融行业

云图说 | 勒索病毒防治解决方案

华为云开发者联盟

云计算 后端 华为云 企业号 1 月 PK 榜

Databend 借助对象存储帮你实现降本增效

Databend

Nerdctl 原生支持 Nydus 加速镜像

SOFAStack

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