我最近遇到了一个非常有趣的网站,它表达了一个非常有趣的想法--反如果运动。你可以在www.antiifcampaign.com这里看到这个。我必须同意,复杂嵌套的IF语句是绝对痛苦的后方。我目前在一个项目,直到最近有一些疯狂的嵌套IFs,向右滚动相当的方式。我们用两种方式解决了我们的问题--我们使用Windows Workflow Foundation来解决路由(或工作流)问题。我们正在使用ILOG规则为.NET实现所有业务规则(最近被IBM!!购买)。这在很大程度上已经治愈了我们嵌套的IF pains...but,我发现自己想知道有多少人以AntiIfCampaign的好人建议(见这里的一个例子)的方式治愈他们的痛苦,方法是创建大量的抽象类来表示最初由嵌套的IF所涵盖的给定场景。我想知道解决这一复杂性的另一种解决方法是否也是使用IoC容器(如StructureMap )来移动不同的功能。不管怎样..。
问题:给出了一个场景,在这个场景中,我有一个嵌套的复杂IF或SWITCH语句,用于计算给定类型的事物(比如评估Enum),以确定如何通过枚举类型处理该事物--有哪些方法可以不使用IF或开关层次结构来完成相同形式的处理?
public enum WidgetTypes
{
Type1,
Type2,
Type3,
Type4
}
...
WidgetTypes _myType = WidgetTypes.Type1;
...
switch(_myType)
{
case WidgetTypes.Type1:
//do something
break;
case WidgetTypes.Type2:
//do something
break;
//etc...
}发布于 2009-07-22 19:27:58
问题不在于“if”语句,而是编写错误代码的程序员。
编辑:另外,正如其他人所指出的,在使用if语句检查对象的类型时,您应该使用多态性(如果可用的话),但是如果语句本身是非常有用和基本的构造。
发布于 2010-03-17 11:37:04
在Java中,使用enum作为多态反if代理很容易。
public class AntiIf {
public enum WidgetTypes {
Type1 {
public void doSomething() {
//...
}},
Type2 {
public void doSomething() {
//...
}},
Type3 {
public void doSomething() {
//...
}},
Type4 {
public void doSomething() {
//...
}};
public abstract void doSomething();
}
WidgetTypes _myType; // set by someone to one of the types.
public void someFunction() {
//...
_myType.doSomething();
//...
}
}发布于 2009-07-22 19:52:52
反-如果是愚蠢的。
有时,通过多态替换条件是正确的,但在这些情况下,真正的问题不是if语句。真正的问题是以非抽象的方式处理抽象类型,即不能在基类的抽象级别进行思考。
其他情况下,可以通过多态替换条件,但这样做是个坏主意。导致您处理一种类型与另一种不同的逻辑可能属于算法本身,而不是单个类。将该逻辑移到类中可能会导致类的代码对使用它们的上下文过于敏感。
但最常见的情况是,if语句与多态性完全无关。去掉if语句是错误的目标。
反-如果是愚蠢的。
https://stackoverflow.com/questions/1167589
复制相似问题