2009-06-08 20 views
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コードを行う方法を尋ねていません:)私は、私が言ったときの意味を具体的に説明したいと思います:オブジェクトデータ型をパラメータとして受け入れることができますか、 ?

答えて

7

オブジェクトを受け入れる必要がある場合は、強く型付けされたパラメータを受け取るメソッドのオーバーロードが少なくともあります。次に、これらのメソッドにオブジェクトバリアントを供給させます。

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

public bool IsValidSSN(int ssn) { 
    ... 
} 
2

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

0

上記の例では、型付きIsValidSSNを作成する方がはるかに簡単です。一般的に、タイピングはバグや柔軟性を低下させることが分かっています。

パラメタの場合はオブジェクトを使用するのがおそらく最良の選択ですが、ログにキャスト・クラッシュの例外がいくつか現れることが予想されます。

その他の場合は、入力に厳密にするか、pythonで記述してください。

0

個人的には、SSNクラスを作成し、そのSSNが有効かどうかを尋ねることができます。ビジネスロジックのプリンシパルを表すクラスを持つことは重要です。これは、例えば、クレジットカードのような検証を必要とするものではどういうことでしょうか? (ビジネスロジックでもSSN1 + SSN2 = SSN3が完全に有効になるようにしているため、プリミティブが悪いので、ビジネスロジックの主体であるものを回避して渡すことができれば、オブジェクトを扱うのは最善ではありません。 )。

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

私はあなたがこのような何かを計画していると思います時間をコンパイルする。

+0

SSNコード全体は単なる作成例ですが、私は自分の質問を通して考えました。作業コードではなく、私の思考のイラストを提供することが多くなりました。 ありがとうございます – CasperT

0

この例では、私は受け入れられないと言います。入力にダッシュやその他の区切り文字がある場合(例:### - ## - ####)?明らかに、値を整数として解析することはできませんが、値はまだ有効です。代わりに正規表現を使用して、値があなたの望むものであることを確認してください。パラメータとしてタイプ「オブジェクト」を使用しての面では

が、これは多くの場合、完全に有効です。実際には、(イベントデリゲートを見て)の.NET Framework全体で使用されています

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

これは本当に変数に「ジェネリック」操作を実行する唯一の方法だったボクシング/アンボクシング、の単純なケースだろう.NET 2.0まで。

ジェネリックスを使用して、キャストの必要なしにこの問題を解決することもできます。 INUMeric(実際のインターフェイスかどうかわかりません)やIComparableなどのインターフェイスを作成すると、より洗練された操作を行うことができます。

public bool IsValidSNN(INUMeric SSN) {}

関連する問題