【发布时间】:2011-09-05 11:12:53
【问题描述】:
我是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));
}
...
所以,为了不违反干货,我想出了一个通用的解决方案:
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 vs. KISS 吗?在这种情况下,应该支持哪一个?
编辑
为了清楚起见,我正在谈论的类是一个适配器,它将对遗留系统的调用委托给我们自己的实现,并在此过程中将遗留系统转换为我们自己的类型。我无法更改遗留类型,也无法更改我们的类型(由 XML 模式生成)。
【问题讨论】:
-
关键字:java 干吻 - 爱它!
-
“干”是什么意思?啊,答案就是这样,我猜不要重复自己。
-
@Angel,对不起,我稍后会添加参考资料 :-)。
-
@helpermethod - 不需要。 Angel 应该只阅读标签的标签 wiki;例如将鼠标悬停在它上面。