gpt4 book ai didi

design-patterns - 接口(interface) hell 还是可接受的设计?

转载 作者:行者123 更新时间:2023-12-01 01:15:55 28 4
gpt4 key购买 nike

我正在重构一些通过 case 语句一遍又一遍地做接近相同事情的遗留代码:

switch(identifier)
case firstIdentifier:
(SomeCast).SetProperties(Prop1,Prop2,Prop3);
break;
...
case anotherIdentifier:
(SomeDifferentCast).SetProperties(Prop1, Prop2, Prop3);
break;

所以,我尝试创建一个独特的界面,这样它就可以成为
(SameInterfaceCast).SetProperties(Prop1,Prop2,Prop3);

但是,我随后发现有些项目甚至没有使用所有属性。于是,我开始想到更像这样的东西:
if(item is InterfaceForProp1)
(InterfaceForProp1).SetProp1(Prop1);
if(item is InterfaceForProp2)
(InterfaceForProp2).SetProp2(Prop2);
if(item is InterfaceForProp3)
(InterfaceForProp3).SetProp3(Prop3);

你可以创建一个这样的类:
public class MyClassUsesProp2And3 : InterfaceForProp2, InterfaceForProp3

但是,我担心我过度分散了这段代码,它可能会膨胀太多。也许我不应该太害怕本质上是一种方法接口(interface),但我想在走这条路之前看看我是否缺少设计模式? (唯一出现在我脑海中但不太合适的是 DecoratorComposite 模式)

更新

所有属性都是唯一类型。

最终,这是一种依赖注入(inject)的形式。代码太乱了,现在不能使用像 Ninject 这样的东西,但最终我什至可以摆脱其中的一些并使用注入(inject)容器。除了设置变量之外,目前还有一些逻辑正在完成。这都是遗留代码,我只是想一点一点地清理它。

最佳答案

基本上,您想让 Actor (使用 setProp 方法的类型)成为相同类型的“ Actor ”,并使属性(prop1...n)成为相同类型的“ Prop ”。这会将您的代码减少到

actor.setProp(prop)

如果您想避免使用instanceOf,我能想到的唯一方法是使用访问者模式,使“ Prop ”成为访问者。我也会使用模板方法让我的生活更轻松。在 Java 中,我会让它看起来像这样(对于两种实际的 Prop)。
class Actor {

protected void set(Prop1 p1) {
// Template method, do nothing
}

protected void set(Prop2 p2) {
// Template method, do nothing
}

public void setProp(Prop p) {
p.visit(this);
}

public interface Prop {
void visit(Actor a);
}

public static Prop makeComposite(final Prop...props ) {
return new Prop() {

@Override
public void visit(final Actor a) {
for (final Prop p : props) {
p.visit(a);
}
}
};
}

public static class Prop1 implements Prop {
public void visit(Actor a) {
a.set(this);
}
}

public static class Prop2 implements Prop {
public void visit(Actor a) {
a.set(this);
}
}
}

这使您可以执行以下操作:
    ConcreteActor a = new ConcreteActor();
Prop p = Actor.makeComposite(new ConcreteProp1(42), new ConcreteProp2(-5));
a.setProp(p);

...这是 super 好!

关于design-patterns - 接口(interface) hell 还是可接受的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12080635/

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