18 Feb 2009

用封装来解决代码重复

最近一段时间,项目上改进了Cruise中artifact repository部分的设计,在原有的代码基础之上做了一次重构,同时加入了新的功能。

在重构过程中,我们发现原有的代码存在不少的问题。比如说下面这个例子,为了得到存放一个特定job的artifact repository路径,原有的代码类似于:

File artifactPath = new File(cruiseConfig.getArtifactRoot(), String.valueOf(jobId));

这样写代码至少存在两个问题:

  • 重复:每次调用的时候都要做类似的文件名拼接
  • 暴露实现细节:artifact repository的内部存放结构属于Cruise中的领域设计细节,这一细节是有可能发生变化的(事实上在目前开发的Cruise 2.0中这一细节的确发生变化了)。我们应该通过面向对象的封装特性来隐藏这一细节,而不应该把它直接暴露在外面

新的设计把artifact的内部实现细节封装给了一个ArtifactService类。其中findArtifact方法解决了上面的问题:

public File findArtifact(JobIdentifier jobId) {
  return new File(.....);
}

当系统中只有这一个方法了解artifact repository的内部结构时,再改动起来就非常容易了。

blog comments powered by Disqus