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

第一次见到这样的代码时,我的第一感觉是,它真复杂:

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)关注我们,并与我们的编辑和其他读者朋友交流。

This entry was posted in Best Practices. Bookmark the permalink.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s