生成多个从属输入组合的默认值

时间:2017-01-06 17:19:20

标签: c# default-value

我在开发中有一个ac#程序,它需要来自用户的大量输入变量(当前计数为32,但是增加)。这些可以直接输入到界面中,也可以从预先制作的xml文件加载

在许多情况下,用户不会知道(或关心)某些变量的值 - 他们可能只想输入一些简单的维度并根据一些内部假设得到一般答案,而不必了解每个细节设计。

未知变量可以来自默认值,或者在许多情况下来自与已知变量的关系(有时两者都有,如果已知其他所需值,则优选一种替代方案)

问题是如何最好地处理决策树以获取未知值并评估哪些值可用于填补空白?

作为一个例子:取三个变量:A,B,C

我们知道A = B + C(其中C通常约为A的75%)

如果我们知道所有3个值,那么GREAT(但我们应该检查它是否满足原始规则并且值实际上是有效的) 如果缺少一个值,我们可以从另外两个值中解决(但我们应该先检查另外两个DO是否存在) 如果缺少2个值,我们可以使用75%的关系来填补空白 如果缺少所有3个值,我们可以为其中一个设置默认值,然后从那里开始向上工作。

到目前为止,我一直在用一系列包含' If'检查,但这与FAST失控超过2个关系,并且它高度依赖于在代码中检查每个变量的顺序,而不是任何重要的内部层次结构,这使得维护成为代码扩展时的问题。

static class defaultValue
{
    public static double a(InputValues inputvalues)
    {
        double x;
        if (inputvalues.a != 0) x = inputvalues.a;
        else {
            if ((inputvalues.b != 0) && (inputvalues.c != 0))
            {
                x = publicProgramValues.b + publicProgramValues.c;
            }
            if ((inputvalues.b = 0) && (inputvalues.c != 0))
            {
                x = publicProgramValues.c/0.75;
            }
            if ((inputvalues.b !=  0) && (inputvalues.c = 0))
            {
                x = publicProgramValues.b / 0.25;
            }
            if ((inputvalues.b = 0) && (inputvalues.c = 0))
            {
                x = 100;
            }

        }
        return x;
    }
}

从上面非常简单的例子可以看出,代码已经开始变得与一个相对简单的关系失控,我还没有开始处理其他2个变量的检查。

一个更复杂的例子(实际上我面对的问题更接近)将是一个对象'矩形'具有属性' height',' width',' area','纵横比'。给定任何2个已知值,可以始终计算未知数,但我可以使用大约15种可能的输入组合来实现这一点,此时代码开始变得相当混乱,尤其是当“高度”时。也可能与其他一些变量有关......我的大脑已经融化了。

我确信这是一种更优雅的方式来处理这个问题 - 我很想听听一些建议吗?!

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

如果不了解域名和您正在解决的问题,很难说。有时候从头开始重新思考设计会更好。

可能的解决方案:

  • 您可以封装逻辑以计算类InputValues(或某个代理类)的默认值。 如果不经常读取属性并且性能不是首要任务,则可以将逻辑放置到属性的getter中。在这种情况下,您将始终看到如何计算默认值,一旦添加新属性,您总是会添加一个逻辑来计算默认值。
  • 将逻辑封装到从参数构造的特定类中。例如,如果您从Rectangle构造InputValues对象,那么计算逻辑默认值可以封装在那里。
  • 创建一些T4模板并使用它来生成具有默认逻辑计算的类。在这种情况下,您将拥有庞大的类,但通过模板维护它将很简单。