写点什么

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

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

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

关注

评论

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

车企纷纷进军海外市场,海外专线有何作用?

Ogcloud

SD-WAN 海外网络专线 海外专线 跨国专线 跨国网络专线

用PyTorch, Profiler和TensorBoard优化AI训练性能

王玉川

profiler 性能调优 PyTorch tensorboard AI模型训练

信通院发布第七批“可信AI”评测,望繁信科技获最高评级!

望繁信科技

数字化转型 流程挖掘 流程资产 流程智能 望繁信科技

基于Web组件的可视化地图开发平台的设计与实现

快乐非自愿限量之名

openai chatgpt 大语言模型

霍格沃兹测试开发学社

Swarm 框架登场:OpenAI 第 3 阶段「敲门砖」;马斯克的 Teslabot 实际有人远程操控丨 RTE 开发者日报

声网

不起眼的错误参数导致remote-debugging-port不生效

LLLibra146

chrome macos Python 3.12

Ubuntu 22报错:PAM unable to dlopen(pam_tally2.so)

百度搜索:蓝易云

2024 荣耀开发者大会,报名开启!

荣耀开发者服务平台

行业资讯 开发者大会 新版本/特性发布 荣耀 AI Agent

Go 语言基准测试入门

FunTester

创建git分支命名原则

百度搜索:蓝易云

DockerCompose部署es和kibana

百度搜索:蓝易云

OpenHarmony统一互联PMC启动孵化

科技热闻

关于使用plsql操作oracle的一点小技巧和几个常用的查询语句

不在线第一只蜗牛

数据库 oracle

《京东金融APP的鸿蒙之旅系列专题》新特性篇:意图框架接入

京东科技开发者

【稳定性】稳定性建设之变更管理

京东科技开发者

Spring 实现 3 种异步流式接口,干掉接口超时烦恼

程序员小富

Java spring 异步设计

深度解析淘宝商品评论API返回值:评价热度与关注度

代码忍者

pinduoduo API API 性能测试

什么是数据治理?我国与新加坡的数据治理有何异同

郑州埃文科技

数据治理

网站云服务器配置方案

百度搜索:蓝易云

“OpenHarmony开发者激励计划”授牌仪式圆满举行

科技热闻

行业认可 | 钛铂数据喜获2024爱分析 · 数据智能优秀厂商奖

tapdata

Springboot --- 使用国内的 AI 大模型 对话

快乐非自愿限量之名

Python 人工智能 Spring Boot

为什么线下面试越来越流行了?

王磊

ERP系统是什么?ERP系统如何与数据库对接?

RestCloud

数据挖掘 数据库 数据同步 ETL ERP

ubuntu22.04开机自启动Eureka服务

百度搜索:蓝易云

技术干货|热门仿真平台HyperMesh CFD功能详解:几何和网格(Part 2)

Altair RapidMiner

仿真 altair Hypermesh CFD

01.单例模式设计思想

杨充

MPI高性能计算和集合通信编程

王玉川

HPC 集合通信 高性能计算

《京东金融APP的鸿蒙之旅系列专题》鸿蒙工程化:Hvigor构建技术

京东科技开发者

Web3 游戏周报(10.06 - 10.12)

Footprint Analytics

链游

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