我使用第三方图书馆。他们向我传递了一个POJO,出于我们的意图和目的,可能是这样实现的:
public class OurData {
private String foo;
private String bar;
private String baz;
private String quux;
// A lot more than this
// IMPORTANT: NOTE THAT THIS IS A PACKAGE PRIVATE CONSTRUCTOR
OurData(/* I don't know what they do */) {
// some stuff
}
public String getFoo() {
return foo;
}
// etc.
}
由于很多原因,包括但不限于封装他们的API和促进单元测试,我想包装他们的数据。但是我不希望核心类依赖于它们的数据(再次出于测试原因)!所以现在我有这样的事情:
public class DataTypeOne implements DataInterface {
private String foo;
private int bar;
private double baz;
public DataTypeOne(String foo, int bar, double baz) {
this.foo = foo;
this.bar = bar;
this.baz = baz;
}
}
public class DataTypeTwo implements DataInterface {
private String foo;
private int bar;
private double baz;
public DataTypeOne(String foo, int bar, double baz, String quux) {
this.foo = foo;
this.bar = bar;
this.baz = baz;
this.quux = quux;
}
}
然后这个:
public class ThirdPartyAdapter {
public static makeMyData(OurData data) {
if(data.getQuux() == null) {
return new DataTypeOne(
data.getFoo(),
Integer.parseInt(data.getBar()),
Double.parseDouble(data.getBaz()),
);
} else {
return new DataTypeTwo(
data.getFoo(),
Integer.parseInt(data.getBar()),
Double.parseDouble(data.getBaz()),
data.getQuux();
);
}
}
该适配器类与其他一些必须了解的第三方API结合在一起,从而限制了它在我系统的其余部分中的普遍性。但是...这个解决方案很重要!在第40页的清理代码中:
超过三个论点(多元论)需要非常特殊的理由-因此无论如何都不应使用。
我考虑过的事情:
- 创建工厂对象而不是静态辅助方法
- 不能解决拥有数十亿论点的问题
- 创建具有依赖构造函数的DataTypeOne和DataTypeTwo的子类
- 仍然具有受多态保护的构造函数
- 创建完全相同的接口的完全独立的实现
- 多个上述想法同时
这种情况应该如何处理?
请注意,这不是反腐败层的情况。他们的API没有错。问题是:
- 我不希望我的数据结构具有
import com.third.party.library.SomeDataStructure;
- 我无法在测试用例中构造它们的数据结构
- 我当前的解决方案导致非常高的参数计数。我想保持参数计数低,而无需传递其数据结构。
- 这个问题是“ 什么是反腐败层?”。我的问题是“ 如何使用一种模式(任何模式)来解决这种情况?”
我也不要求代码(否则这个问题将在SO上),只是要求足够的答案以使我能够有效地编写代码(该问题未提供)。
The ideal number of arguments for a function is zero (niladic). Next comes one (monadic), followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very special justification — and then shouldn’t be used anyway.