c# - 基于 Bool 的方法调用,没有 if 语句

标签 c# methods boolean-logic

<分区>

很难制定一个标题。 不过,我会快速解释我当前的选择,希望有人能告诉我一种更简洁的方法来完成这项工作。


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

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 语句。而且这些方法很干净,只做他们应该做的事情。

但我仍然不能放弃,必须有其他方法来做到这一点。

这不是代码无法运行的问题。我更想要一种“最好”或“最干净”的方式来做到这一点。 ^_^ 我是三年级的软件工程师学生,仍在寻找清理或优化我的代码的方法。

如果您有任何意见或建议,请告诉我!

注意:这主要是伪代码,我还没有运行或测试过它。这与工作无关,这是我试图弄清楚的概念。

最佳答案

我会选择一种更客观的方式来做到这一点。

首先是 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 接口(interface)。

关于c# - 基于 Bool 的方法调用,没有 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26605463/

相关文章:

c# - ML.NET 显示哪个分数与哪个标签相关

c# - EF Core 2.0 - 按用户最佳实践过滤数据

boolean - 将 4 个与非门简化为 1 个异或门 boolean 代数?

return 语句中的 Java 逻辑运算符

c# - 我应该如何检查用户是否在 MVC5 中经过身份验证?

python - Python 类的最大方法数是多少?

android - 如何从 Android 应用程序连续调用两个电话

python - 当使用组合而不是继承时,如何在 Python 中的兄弟对象之间进行通信

boolean - 这个 boolean 定律叫什么

c# - NSTextView 自动拼写检查无法正常工作