2017-07-10 8 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"の2番目のパラメータを省略し、単に "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"がfalseまたは "IsWithinRange"がfalseの場合でも、コードは実行され続けます。これは、上記のバージョンまたはあなた自身のバージョンに当てはまります。はい、あなたのユーザにメッセージが届きますが、彼が「大丈夫」をクリックすると、チェックが失敗しても残りのコードが実行されます。

また、「IsWithinRange」は、チームメイトによって、または将来自分で誤って解釈される可能性があります。これはtrue/falseを返すだけではなく、falseの場合にメッセージを送信するためです。これはcommand-query separationの原則に違反します。

これらの問題へのアプローチは、簡潔さを無視しています。これは、望ましいものですが決して最も高い目標ではありません。クラスかどうかを決定するために

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. 

を私はあなたにそれを残しておきます:あなたはこのように使用する

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

} 

:何ができることは、その方法の作業を分ける検証クラスを作成することですベースのアプローチはあなたの時間の価値があります。しかし、私はそれをあなたと異なる考え方で提示します。

+0

ありがとうございました!これは本当に役に立ちました。 – Yahtzee

関連する問題