2017-07-10 34 views
0

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

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); } 

这种逻辑的作品,但我很好奇,看看是否有是一种更简洁,更好看的方式来编写某种形式的对变量进行系统检查的方式?

+0

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

回答

0

你可以采取的一些事情的优势:

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

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

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

总之,你的代码可以是这样的:

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”为false或任何“IsWithinRange”为假,您的代码仍会继续运行。在我上面的版本或你自己的版本中,这是真的。是的,您的用户会收到一条消息,但是当他点击“好的”后,即使检查失败,剩余的代码也会运行。

另外,“IsWithinRange”可能会被队友误解,甚至会在未来被自己误解。这是因为它不仅仅返回true/false:如果为false,它会发送一条消息。这违反了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. 

我将让你来决定是否类为基础的方法是值得你的时间。但我把它作为一种不同的思维方式呈现给你。

+0

非常感谢!这真的很有帮助。 – Yahtzee