【问题标题】:Exception Handling with Multiple Variables多变量异常处理
【发布时间】:2017-07-10 15:12:19
【问题描述】:

我正在尝试在处理我的程序时了解有关异常处理的更多信息。我有多个要测试的测试变量,并确保它在以下范围内:

public bool IsWithinRange(TextBox textbox, string name, int min, int max)
    {
        double number = double.Parse(textbox.Text);

        if (number < min || number > max)
        {
            MessageBox.Show(name + " must be between " + min.ToString() + " and " + max.ToString() + ".", "Entry Error");
            textbox.Focus();
            return false;
        }
        else { return true; }
    }

并使用以下方法调用方法:

 bool condition;
        condition = CheckAll();
        if (condition == true) { condition = IsWithinRange(txtVar1, "Var1", 1, 50); }
        if (condition == true) { condition = IsWithinRange(txtVar2, "Var2", -100, 100); }
        if (condition == true) { condition = IsWithinRange(txtVar3, "Var3", 100, 200); }

这个逻辑有效,但我很好奇是否有更简洁、更好看的方式来编写某种形式的系统检查变量?

【问题讨论】:

  • 考虑将 C# 添加到您的标签中。您可能会让更多人查看您的问题。另外,我会放弃“逻辑”,因为这些问题往往将逻辑作为主要关注点,而不是编码语法。最后,虽然我没有在回复中提到它,但请考虑查看 Try/Catch 语句。

标签: if-statement exception boolean logic


【解决方案1】:

您可以利用以下几点:

  • 您能否为 TextBox.Name 属性分配有意义的名称?如果是这样,您可以省略“IsWithinRange”中的第二个参数并简单地调用“Textbox.Name”。

  • 从 C# 6.0 开始,现在有一种用于插入字符串的语法。所以传递给你的 MessageBox.Show 语法的字符串可以变得更短更漂亮。

  • 您可以立即分配给“条件”,并且可以将“if”语句转换为组合的“and”语句。

总而言之,您的代码可能如下所示:

bool condition = 
       CheckAll() 
    && IsWithinRange(txtVar1, 1, 50) 
    && IsWithinRange(txtVar2, -100, 100)
    && IsWithinRange(txtVar3, 100, 200); 

// Some other code here

你的方法看起来像这样:

public bool IsWithinRange(TextBox textbox, int min, int max) {

    double number = double.Parse(textbox.Text);

    if (number < min || number > max) {
        MessageBox.Show($"{textbox.Name} must be between {min} and {max}.", "Entry Error");
        textbox.Focus();
        return false;
    }
    else
        return true;

}

这是假设您实际使用“条件”。如果没有,您可以省略“bool condition =”,代码运行相同。

但有几点需要注意。即使“CheckAll”为假或任何“IsWithinRange”为假,您的代码仍将继续运行。在我上面的版本或您自己的版本中都是如此。是的,您的用户会收到一条消息,但是在他单击“确定”后,即使检查失败,剩余的代码也会运行。

此外,“IsWithinRange”将来可能会被队友甚至您自己误解。这是因为它不仅仅是返回真/假:如果为假,它会发送一条消息。这违反了command-query separation的原则。

解决这些问题的方法会忽略简洁性,因为这是所希望的,但绝不是最高目标。您可以做的是创建一个验证类,其方法将任务分开:

class Validator {

    public bool isValid = true;
    public List<string> messages = new List<string>();

    public Validator CheckAll() {

        // Whatever your logic is for this.

        return this; // Return the instance of "Validator" that called this method
    }

    public Validator CheckRange (TextBox textbox, int min, int max) {

        double number = double.Parse(textbox.Text);

        if (number < min || number > max) {
            messages.Add($"{textbox.Name} must be between {min} and {max}.");
            isValid = false;
        }

        return this;
    }

    public void ShowErrorsToUser () =>
        MessageBox.Show(string.Join(Environment.NewLine, messages));

}

你会这样使用:

var validator = 
    new Validator()
    .CheckAll()
    .CheckRange(txtVar1, 1, 50)
    .CheckRange(txtVar2, -100, 100)
    .CheckRange(txtVar3, 100, 200);

if (!validator.isValid) {
    validator.ShowErrorsToUser();
    txtVar1.Focus();
    return; // Stop code execution!
}

// Continue with your normal logic that utilizes your textbox values.

我会让你决定基于类的方法是否值得你花时间。但我把它作为一种不同的思考方式呈现给你。

【讨论】:

  • 非常感谢!这真的很有帮助。
猜你喜欢
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2012-10-25
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多