<分区>
我是 DRY 的忠实追随者和 KISS原则,但上周我遇到了一个案例,两者似乎相互矛盾:
对于我正在做的应用程序,我必须实现一个执行以下操作的时间循环:
- 遍历 A 类型列表的元素
- 将类型A的元素转换为类型B并将它们插入到类型B的列表中
这是一个例子:
for (A a : listOfA) {
listOfB.add(BFactory.convertFromAToB(a));
}
在代码中,我必须执行大约 4 次,将一种类型(例如 D、E 等)转换为另一种类型。我可能无法更改我将要转换的类型,因为它们是我们必须在应用程序中使用的第 3 方类型。
所以我们有:
for (A a : listOfA) {
listOfB.add(BFactory.convertFromAToB(a));
}
for (C a : listOfC) {
listOfB.add(DFactory.convertFromCToD(c));
}
...
所以,为了不违反 dry,我想出了一个通用的解决方案:
private interface Function<S, T> {
T apply(S s);
}
public <S, T> void convertAndCopy(List<S> src, List<T> dst, Function<S, T> f) {
for (S s : src) {
dst.add(f.apply(s));
}
}
调用看起来像这样:
convertAndCopy(listOfA, listOfB, new Function<A, B>() {
A apply(B b) {
return CFactory.convertFromBToC(b);
}
});
现在,虽然这在 DRY 方面更好,但我认为它违反了 KISS ,因为这个解决方案比重复的 for 循环更难理解。
那么,这是 DRY 还是 KISS?在这种情况下应该支持哪一个?
编辑
需要说明的是,我所说的类是一个适配器,它将对遗留系统的调用委托(delegate)给我们自己的实现,并在此过程中将遗留系统转换为我们自己的类型。我无法更改遗留类型,也无法更改我们的类型(由 XML 模式生成)。