2016-07-05 1 views
0

同じタイプの複数のオプションの入力パラメータを受け入れるメソッドをコード化UIで作成しています。私の質問は、このような方法を書くベストプラクティスです。 (インターネット上の多くの場所で提案されている)メソッドのオーバーロードや名前付き引数とオプションのパラメータの組み合わせを使用する必要があります。 方法は、実際には以下のフィールドに値を入力しようとしている:
コード化されたUI:同じデータ型の複数のオプションパラメータを持つメソッドを作成する最適な方法は何ですか?

名:文字列:必須
年齢:文字列:必須
場所:文字列:サインアップするオプション
チェックボックス:オプション
チェックボックスの場合チェックされています:下記のフィールドに詳細を入力してください。

名前付き引数とオプションのパラメータの組み合わせを使用している場合、メソッド定義のパラメータのリストは長く見えますが、読みやすく、メソッドのオーバーロードがわからない場合は、パラメータを指定すると、目的を解決します。 私はC#コーディングに新しいですので、どんなポインタでも大変感謝しています。

+0

私の提案は、さまざまなタイプの情報を包むラッパーとして機能する2つのクラスを作成することです。あなたは特に、すべてのパラメータが同じタイプを持っていると言いました - しかし、私はすべてのパラメータが異なる目的を持っていると賭けています。それに基づいてオブジェクトを構築します。たとえば 'checkbox'がチェックされている場合、その情報を保持するために' NewAccount'オブジェクトを渡すことができます。 'Name'、' age'、 'location'は全て' Person'オブジェクトの一部です。これにより、メソッドのシグネチャが簡単になり、コードをポイントまで保持します。 –

+0

リチャードに感謝します。同じ種類のフィールドのラッパーとしてクラスを作成してクラスオブジェクトを渡すことは、それを行うためのすっきりした方法だと私は同意します。しかし、私の方法はどのパラメータをどのオプションフィールドに入れるのかを知る方法はありますか?例:電子メール、性別、オーダータイプの3つのオプションフィールドがあり、電子メール、オーダータイプのみを渡したい場合は、どうすればこの方法を理解できますか? – user5252179

+0

ラッパーオブジェクトにフィールドがある場合、電子メールと言うことができ、そのフィールドがヌルである場合(あなたに与えられていないため設定していないため)、メソッドはそれを心配していません。要は、オブジェクトは必要な値の単なるコンテナーです。値が設定されていなければ、それは存在せず、気にする必要はありません。必要な変数でないかぎり、例外がスローされ、フィールドが必要であることをユーザーに伝える必要があります。 –

答えて

0

あなたのケースでメソッドオーバーロードができると思います。私たちは、この種の問題のために、このクラスのメソッドを常にオーバーロードしていました。誰かが場所に入れることを望んでいないが、登録したいと思うことを覚えておいてください。

+0

あなたの応答をありがとうので、メソッドのオーバーロードで私は一意の署名で複数のメソッドを作成する必要があります。しかし問題は、同じデータ(文字列)型の複数のオプションフィールドがあることです(私は上の例に含まれていません)。その場合、私のメソッドはどのようなオプションフィールドを使うべきかを知っていますか? – user5252179

+0

私は最高のC++ではありませんが、私はいつも何かをする最も簡単な方法を試しています。 ' 空人(文字列名、文字列の年齢) 空人(文字列名、文字列の年齢、文字列の場所) 空人(文字列名、文字列の年齢、文字列の場所、ブールチェックボックス) :私は、それは次のようになりますだと思います空白の人(文字列の名前、文字列の年齢、boolのチェックボックス) ' 私は間違っている場合、誰かが私を修正する必要がありますが、それは私がそれをやる方法です。 –

+0

パラメータオブジェクトを渡すことは、おそらくすべての組み合わせをオーバーロードするよりも優れています。 – MPavlak

1

あなたのフィールドを含むようにラッパーオブジェクトを使用します。

class Person{ 
    string name location; 
    Gender gender; 
    int age; 
    public Person(string name, int age, string location = null, Gender gender = null){ 
     // set fields 
     // location is optional so it might be null. 
     // Gender can be an object or an enum type. 
    } 
} 
class NewAccount{ 
    String email, password; 
} 
class Order{ 
    String OrderType = null; 
} 

、あなたのメソッドのシグネチャは次のようになります。

public void myMethod(Person person, Order order, NewAccount newAccountInfo = null){ 
    //Do whatever here 
} 

点でこれらのオブジェクトは、あなたの方法のために明確に定義されたインタフェースを提供することをそこに存在するかもしれないし、存在しないかもしれない一連のパラメータを使用する代わりに使用することができます。

+0

リチャードにこのような詳細で有益な回答をいただきました。私が持っているもう1つの質問は、もしPerson.genderがnullを渡され、次にmyMethodに渡されると、上のコードで言うことができるのですが、ジェンダー!= nullのときにジェンダーを入力するロジックを定義する必要があります。 – user5252179

+0

はい、nullをチェックする必要があります。あなたがmyMethodでその情報を取得する必要があるからではなく、それを保存するか、そうでなければそれを使用する場合に知る必要があるからです。 –

+1

あなたのmyMethodが性別を絶対に使用しなければならない場合は、それが必要です。あなたがここでやろうとしていることについての完全なストーリーはありませんが、myMethodを呼び出す前に、必要に応じて必要なすべての情報を保持する必要があります(その場合はnullです)。それを使用する前にヌルかどうかにかかわらずそれを持ってください。それがnullで、それを使用しようとすると例外が発生します。値がnullであり、与えられたタスクを完了するために値が必要な場合は、問題があり、例外をスローする必要があります。これが検証です。 –

関連する問題