我重构这是通过一个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
不过,恐怕我过于碎片化这个代码,它可能气球太多了。也许我不应该太担心本质上是一种方法的接口,但我想看看在我走下这条路之前是否错过了一种设计模式? (即突然出现在我的脑海里,但都不太合适人选的唯一的人的Decorator或Composite模式)
UPDATE
所有属性是唯一的类型。
最终,这是一种依赖注入的形式。该代码太乱了,现在使用类似Ninject的东西,但最终我甚至可能会摆脱其中的一些并使用注入容器。目前还有一些逻辑正在被完成,而不仅仅是设置一个变量。这是所有遗留代码,我只是试图一点一点地清理它。
属于同一类型的Prop1,Prop2和Prop3吗?因为我几乎认为你想为InterfaceForProp1,InterfaceForProp2和InterfaceForProp3创建一个具有SetProp()方法的超类,该方法接受任何类型的参数Prop1,Prop2和Prop3。 – dmn
也许Prop1,Prop2和Prop3是尚未由对象表示的域概念的属性。这可能会简化您的界面。 – neontapir
@dmn我刚刚更新了我的问题,添加了所有类型都是不同的。如果他们都一样,那么这将是蛋糕。 –