不使用"if"|来做到这一点 if(s =="value1"){...} else if(s =="value2"){...}

Omu*_*Omu 22 c# java

根据反if运动,最好不要在我们的代码中使用ifs.任何人都可以告诉我是否有可能摆脱这段代码中的if?(switch也不是一个选项,重点是删除条件逻辑,而不是用类似的语言结构替换ifs)

if(s == "foo")
{
    Writeln("some logic here");
}
else if(s == "bar")
{
    Writeln("something else here");
}
else if(s == "raboof")
{
    Writeln("of course I need more than just Writeln");
}
Run Code Online (Sandbox Code Playgroud)

(语言:Java或C#)

cle*_*tus 65

这是一种方式...... :)

delegate void DoStuff();

...

IDictionary<string, DoStuff> dict = new Dictionary<string, DoStuff>();
dict["foo"] = delegate { Console.WriteLine("some logic here"); };
dict["bar"] = delegate { Console.WriteLine("something else here"); };
dict["raboof"] = delegate { Console.WriteLine("of course I need more than just Writeln"); };
dict["foo"]();
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`Action`类型而不是声明委托. (5认同)
  • 我会接受这作为C#的正确答案,太糟糕了,我不能接受2个答案:) (2认同)

bma*_*ies 18

建立关联数据结构.Map<String, String>在Java中,IDictionary<string, string>在C#中.在开始时初始化它,然后......

  • Map <String,Functor-like-object-that-does-computation-and-returns-a-string> (3认同)

Bal*_*usC 17

利用战略模式.

用Java术语:

public interface Strategy {
    void execute();
}

public class SomeStrategy implements Strategy {
    public void execute() {
        System.out.println("Some logic.");
    }
}
Run Code Online (Sandbox Code Playgroud)

您使用如下:

Map<String, Strategy> strategies = new HashMap<String, Strategy>();
strategies.put("strategyName1", new SomeStrategy1());
strategies.put("strategyName2", new SomeStrategy2());
strategies.put("strategyName3", new SomeStrategy3());

// ...

strategies.get(s).execute();
Run Code Online (Sandbox Code Playgroud)

  • 这**确实*不是战略模式的用途. (12认同)
  • 这些评论只是让我觉得IFs是个好主意:) (7认同)
  • 噢,"基本的例子",有人吗?RuntimeExceptions足以掩盖自己.每个自尊的开发人员都可以轻松添加nullcheck或附加策略,不使用null键. (6认同)
  • 您的代码可能会抛出NPE:stategies.get("bye").execute(); (4认同)

ufu*_*gun 12

使用从抽象基类SomeThingWriter派生的虚方法编写类.

那么从基类派生的每个类都应该实现像writeSomething或任何你想要的函数.

abstract class MyBaseClass
{
     public abstract void writeSomething();
}

class DerivedClass1 : MyBaseClass
{
    public override void writeSomething()
    {
        Writeln("something else here  1");
    }
}

class DerivedClass2 : MyBaseClass
{
    public override void writeSomething()
    {
        Writeln("something else here  2");
    }
}
Run Code Online (Sandbox Code Playgroud)

而不仅仅是打电话

MyBaseClass c = new DeriveClass1();
c.writeSomething();
c = new DerivedClass2();
c.writeSomething();
Run Code Online (Sandbox Code Playgroud)


Dra*_*mon 12

看看这个广告系列,它解释得非常糟糕.ifs没有任何问题,但在某些情况下,它们可以表明你没有充分利用OOP.

该活动试图推广的是增加多态性的使用,以便将调用代码与它正在查看的对象类型分离.

你会使用一些更聪明的对象而不是s作为字符串:

interface I {
  public String getName();
  public void doSomething();
}

class A implements I {
  public String getName() { return "one"; }
  public void doSomething() { ...; }
}

class B implements I {
  public String getName() { return "two"; }
  public void doSomething() { ...; }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以用以下内容替换ifs:

I obj = ...get an A or B from somewhere...;
obj.doSomething();
Run Code Online (Sandbox Code Playgroud)


Pet*_*ter 7

在某些情况下,避免if结构可能是合法的

在其他人,它只是简单的白痴,试图避免如果.

虽然为避免if结构而提供的示例是有效的替代方案,但您应该问自己:

为什么我要使我的代码不必要地复杂以避免简单的if结构?如果唯一的原因是你必须因为反竞选活动那么它的坏理由

  • 听,听,听!(至少15个字符,所以3个听到) (2认同)

glm*_*ndr 7

Java的

使用实现某种方法的枚举.

enum MyEnum{

    foo{
        public void mymethod(String param1, String param2){
            //dostuff...
        }
    },

    bar{
        public void mymethod(String param1, String param2){
            //dostuff...
        }
    };

    public abstract void mymethod(String param1, String param2);
}
Run Code Online (Sandbox Code Playgroud)

然后在你的班上:

MyEnum.valueOf(mystring).mymethod(param1, param2);
Run Code Online (Sandbox Code Playgroud)

  • +1好主意.可悲的是它与C#不兼容. (2认同)

ser*_*hio 5

首先,在阅读这些"反"运动时要非常细心.

  • 问问自己,反IF活动是否会消除应用程序中的逻辑?!
  • 这些想法在一种情况下可以很好地应用,在另一种情况下可以很愚蠢.合理.
  • 有可能的是多个的使用IF可能妨碍代码的读取器.但这是从你的代码中消除if的任何理由,更多的是,这几乎是不可能的.
  • 顺便说一下MS设计指南中的任何地方都指出不要使用if(就像完成时一样,例如goto语句不建议使用女巫)...

C#

    switch (myStringVar)
    {
        case "one": doSomething();  break;
        case "two": doSomething(); break;
        case "three": doSomething(); break;
        default: doSomething(); break;
    }
Run Code Online (Sandbox Code Playgroud)

最后,它将此代码减少到if ...所以,只是为了可读性更好,而不是性能.

实际上,如果微软认为交换机(在c#中)最好用if替换 - 好的,我将使用(在您描述的具体情况下)交换机.

顺便说一句,在这个例子中,该活动似乎非常清楚地回应了您的问题

  • 关键是要删除*conditional*逻辑,而不是用类似的语言结构替换ifs. (5认同)