gpt4 book ai didi

java - 当 KISS 和 DRY 碰撞时

转载 作者:太空狗 更新时间:2023-10-29 22:42:30 29 4
gpt4 key购买 nike

<分区>

我是 DRY 的忠实追随者和 KISS原则,但上周我遇到了一个案例,两者似乎相互矛盾:

对于我正在做的应用程序,我必须实现一个执行以下操作的时间循环:

  1. 遍历 A 类型列表的元素
  2. 将类型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 模式生成)。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com