基于Bool的方法调用,不包含if语句

本文关键字:包含 if 语句 调用 Bool 方法 基于 | 更新日期: 2023-09-27 18:28:01

很难形成一个标题。然而,我会很快解释我目前的选择,希望有人能告诉我一个更整洁的方法来实现这一点。


我们的第一个"快速"解决方案是:

public class Test
{
        public bool UseSomething = false;
        public bool UseSomethingElse = false;
        public bool UseAnother = false;
    public void MyMethod(){
        if(UseSomething){
            if(UseSomethingElse){
                if(UseAnother){
                    // UseSomething, UseSomethingElse, UseAnother
                }
                else{
                    // UseSomething, UseSomethingElse
                }
            }
            else{
                // UseSomething
            }
        }
        else if(UseSomethingElse){
            if(UseAnother){
                // UseSomethingElse, UseAnother
            }
            else{
                // UseSomethingElse
            }
        }
        // etc...
    }
}

现在,在我看来,这是一个丑陋的解决方案,很快就会变得一团糟,尤其是如果你想添加选项的话。更不用说,除了我自己,任何人都会一眼就不知道该去哪里/改变什么。

所以我很快想出了另一个解决方案如下:

public class Test
{
    public bool UseSomething = false;
    public bool UseSomethingElse = false;
    public bool UseAnother = false;
    short options = 0;
    public void Init() // call this @ start of your program
    {
        if (UseSomething)
            options += 1;
        if (UseSomethingElse)
            options += 2;
        if (UseAnother)
            options += 4;
    }
    public void MyMethod(){ 
        Something something = MatchOption(foo); 
    }
    public void MatchOption(Foo foo)
    {
        switch (options) // based on the Options value (which is unique for every bool-triggered) perform a specific method.
        {
            case 0: //000
                return NoOptions(foo);
            case 1: //100
                return OptionSomething(foo);
            case 2: //010
                return OptionSomethingElse(foo);
            case 4: //001
                return ... etc;
            case 3: //110
                break; 
            case 5: //101
                break;
            case 6: //011
                break;
            case 7: // 111
                break;
            case -1:
                return;
        }
    }
}

现在,这使它更易于管理,人们基本上不必担心要放入哪个if/else语句。此外,方法是干净的,只做他们应该做的事情。

但我还是不能让它过去,必须有其他的方法来做到这一点。

这不是一个很大的问题,代码在哪里不起作用。更重要的是,我想要一种"最好"或"最干净"的方式来做到这一点^_^我是软件工程师三年级的学生,仍在寻找清理或优化代码的方法。

如果你有意见或建议,请告诉我!

注意:这主要是伪代码,我还没有运行或测试过它。这不是关于工作,这是一个我正在努力弄清楚的概念

基于Bool的方法调用,不包含if语句

我会去寻找一种更具对象性的方法。

首先是DoSomething层次结构。

abstract class BaseDoingThings
{
    abstract void Do();
}
class Something : BaseDoingThings
{
    override Do() { ... }
}
class SomethingElse : BaseDoingThings
{
    override Do() { ... }
}

然后是测试类

class Test
{
    private List<BaseDoingThings> stuffToDo = new List<BaseDoingThings>();
    public void AddStuffToDo(BaseDoingThings todo)
    {
        stuffToDo.Add(todo);
    }
    public void Execute()
    {
        foreach(var stuff in stuffToDo)
        {
            stuff.Do();
        }
    }
}

这是基本的想法。现在您必须适应您的情况,这意味着您必须正确定义BaseDoingThings接口。

为什么不直接写:

if (useSomething)
    //use something
if (useSomethingElse)
    //use somethingElse
if (useAnother)
    //use another

如果你要添加新的布尔值,我想你会通过List:来完成

List<bool> useThings = new List<bool>();
// populate the list
foreach (var useThing in useThings)
{
    if (useThing)
        //useThatThing
}