2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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

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

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

关注

评论

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

联邦学习在光大科技的落地应用

博文视点Broadview

一文讲述数仓组件SysCache

华为云开发者联盟

事务 存储 GaussDB(DWS) SysCache 缓存信息

明道云对接小鹅通,沉淀内容付费平台数据

明道云

东汉末年,他们把「服务雪崩」玩到了极致

悟空聊架构

熔断 28天写作 服务雪崩 悟空聊架构 12月日更

Java 集合框架面试问题集锦

编程江湖

面试题 JAVA开发 java编程

元气部落盲盒系统开发元气部落app开发

风行无疆

前端开发:Vue中获取input输入框值的方法

三掌柜

28天写作 28 12月日更 12月

Android aapt 在 Mac 和 Windows 上使用方法小结

阿策小和尚

28天写作 Android 小菜鸟 12月日更

明道云荣获2021亚洲最佳职场“最佳创新奖”荣誉!

明道云

今夜无眠

Tiger

28天写作

PingCAP 入选 CB Insights 中国「数据链路安全领航者」榜单,保障全球用户存储安全

PingCAP

简述移动端IM开发的那些坑:架构设计、通信协议和客户端

BeeWorks

小程序的发布【小程序专题3】

坚果

小程序 28天写作 12月日更

【漫画】数据云,真香在哪?

星环科技

大数据

中石化信息化数字化首席专家李剑峰:数字化转型中关键基础软件的国产化应用

OceanBase 数据库

开源 国产化 oceanbase 中石化

跟着动画学Go数据结构之插入排序

宇宙之一粟

golang 数据结构 插入排序 12月日更

WAVE SUMMIT+2021深度学习开发者峰会举办,开源共建助力飞桨生态发展

科技热闻

5G专网+区块链:构筑智慧政务“安全信任基石”

CECBC

100行代码让您学会JavaScript原生的Proxy设计模式

汪子熙

JavaScript 设计模式 代理模式 28天写作 12月日更

实用机器学习笔记十六:循环神经网络

打工人!

深度学习 学习笔记 循环神经网络 机器学习算法 12月日更

给弟弟的信第15封|情绪控制的重要性

大菠萝

28天写作

Java Web开发之API Boy的进阶之路

@零度

Java web API boy

Python爬虫120例之案例58,手机APP爬虫,“武器库”的准备and皮皮虾APP的测试

梦想橡皮擦

12月日更

React进阶(七):props 属性介绍

No Silver Bullet

React 12月日更 props

华为硬件配置命令,建议收藏

Ethereal

网络工程师 网络技术 华为设备 厂商设备 运维技术

资讯|WebRTC M95 更新

网易云信

WebRTC

“十四五”规划,开源重塑软件发展新生态,获国家重点扶持

腾源会

开源

超细!细说Zookeeper选举的一个案例(上)

恒生LIGHT云社区

golang zookeeper Go 语言

从前端到全栈 -- 最全面向对象总结

程序员海军

Java 面向对象

AI 收藏夹 Vol.004:虚拟爱豆出道!

Zilliz

人工智能 神经网络 AI

Spring Boot Serverless 实战系列“架构篇” | 光速入门函数计算

阿里巴巴云原生

阿里云 Serverless 架构 云原生 函数计算

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