2

社会保障番号を要求するテキストボックスまたはその他の形式の入力があるとします。SSN は、私が現時点で単純に考えた純粋な例であることに注意してください。この入力は当然、最初は文字列として保存されます。

string s = Console.ReadLine();

SSN を検証するメソッドが必要であり、コード全体であらゆる場所で使用される可能性があるとします。一体、ユーザー入力によって決定されていない変数でメソッドを呼び出すことさえあります。

これは受け入れられますか?

public bool IsValidSSN(Object SSN)
{
int mySSN;
    if(Int.Parse(SSN == false)
    {
    mySSN = Convert.toInt32(SSN);
    }
...
}

または、特定のデータ型を要求するように主張しますか?

public bool IsValidSSN(int SSN)
{
...
}

そのため、メソッドを呼び出す前に、入力を正しいデータ型に変換する必要があります。

ところで:私は適切な IsValidSSN コードを実行する方法を尋ねているわけではありません:)私が言ったときの意味の例を挙げたかっただけです:オブジェクトデータ型をパラメーターとして受け入れることができますか、それとも回避する必要がありますか?

4

6 に答える 6

7

オブジェクトを受け入れる必要がある場合、少なくとも、厳密に型指定されたパラメーターを取るメソッドのオーバーロードが必要です。次に、オブジェクト バリアントをこれらのメソッドにフィードします。

public bool IsValidSSN(object ssn) {
  ...
  IsValidSSN(Convert.ToInt32(ssn));
  ...
}

public bool IsValidSSN(int ssn) {
  ...
}
于 2009-06-08T22:37:17.430 に答える
2

それは完全にあなたのデザインと、どこで検証を行いたいかによって異なります。それは本当に基本的に、アーキテクチャ全体とクラス階層に依存します。どちらの方法でも問題ありません。それがあなたの建築設計に適合する方法であることを確認してください.

于 2009-06-08T22:38:53.777 に答える
1

この場合、オブジェクトを受け入れる価値はありません。その機能がどのように機能すると予想されるかを考えてみてください。(投稿したコードが機能しないため、明らかにそうではありません)。次のような計画を立てていると思います。

if (SSN is string)
    SSN = Convert.toInt32(SSN);
else if (SSN is TextBox)
    SSN = Convert.toInt32(SSN.Value);
else /* etc */

それはどのように優れていますか:

 bool isValidSSN(int SSN) { /* real valuation code */ }
 bool IsValidSSN(String SSN)  { return isValidSSN(Convert.toInt32(SSN)); }
 bool IsValidSSN(TextBox SSN)  { return isValidSSN(Convert.toInt32(SSN.Value)); }

オーバーロードされたメソッドは、実行時からコンパイル時まで何をすべきかを決定するため、よりシンプルで高速です。

于 2009-06-08T22:45:35.590 に答える
0

上記の例では、型指定された IsValidSSN を作成する方がはるかに簡単です。一般的に、タイピングを行うとバグや柔軟性が低下することがわかります。

柔軟性が最も重要な場合はオブジェクトを使用するのがおそらく最良の選択ですが、ログでいくつかのキャスト衝突例外に直面することが予想されます。

他のすべてのケースでは、入力を厳密にするか、Python で記述してください。

于 2009-06-08T22:41:28.593 に答える
0

個人的には、SSN クラスを作成し、その SSN が有効かどうかを尋ねることができます。ビジネス ロジックのプリンシパルを表すクラスを用意することが重要です。これは、たとえば、クレジット カード クラスのようにより多くの検証を必要とするものに対して行うことと非常によく似ています。オブジェクトを回避できる場合は、オブジェクトを処理することは最善ではありません。また、ビジネス ロジックのプリンシパルである何かをプリミティブとして処理することも悪いことです (ビジネス ロジックではナンセンスですが、アーキテクチャによって SSN1 + SSN2 = SSN3 が完全に有効になります)。 )。

于 2009-06-08T22:44:18.087 に答える
0

この場合、私はそれが受け入れられなかったと言うでしょう。入力にダッシュやその他の区切り文字 (例: ###-##-####) が含まれている場合はどうなりますか? 明らかに、値を整数として解析することはできませんが、値は依然として有効です。代わりに正規表現を使用して、値が希望どおりであることを確認してください。

タイプ「オブジェクト」をパラメーターとして使用するという点では、これは多くの場合に完全に有効です。実際、これは .NET Framework 全体で使用されています (イベント デリゲートを見てください)。

public void Control_MouseOver(object sender, MouseEventArgs e){}

これは、ボックス化/ボックス化解除の単純なケースであり、.NET 2.0 まで変数に対して「汎用」操作を実行する唯一の方法でした。

ジェネリックを使用して、キャストを必要とせずにこの問題を解決することもできます。INumeric (それが実際のインターフェイスかどうかはわかりません) や IComparable などを実装するインターフェイスを作成すると、よりエレガントな方法で操作を実行できるはずです。

public bool IsValidSNN(INumeric SSN){}

于 2009-06-08T22:48:17.407 に答える