6

外部 API の開発に取り組んでいます。パブリック インターフェイスにメソッドを追加しました。

public void AddMode(TypeA mode);
public void AddMode(TypeB mode); // the new method, TypeB and TypeA are not related at all

1 つのテストが失敗し、合格していたnull. これにより、コンパイラがあいまいな呼び出しと混同されました。null をキャストしてテストを修正しました。

しかし、私の質問は:

  • これだけの理由で名前を変更する必要がありますか?
  • それとも、私と同じようにクライアントにキャストを任せるべきですか? (何らかの理由で null を渡す場合)

この場合、API を設計する際に最適なものは何ですか?

編集

呼び出しは、次のようではなく、このAddMode(null)のようでした:

TypeA vl = null; 
AddMode(v1); // this doesn't cause a problem
4

5 に答える 5

6

API は、正しく使用するのが簡単で、間違って使用するのが難しいように設計する必要があります。API は簡単に正しく使用できます。

AddMode(new TypeA());

コンパイルします。

間違って使用するのは難しいです:

AddMode(null);

コンパイルしません。ユーザーは次のようなことを強制されます

AddMode((TypeA)null);

これが予想される使用法であるかどうか、彼は考えなければなりません。だからあなたのAPIはそのままでOKだと思います。

于 2012-06-26T09:43:02.430 に答える
1

nullそれは、それぞれの引数の値としてどれだけ例外的かによると思います。

たとえば、次のArgumentNullExceptionコンストラクタを比較してください。内部例外を設定する必要がある場合に最も頻繁に呼び出されます。それ以外の場合は、不正な引数の名前を除くこのコンストラクターが渡されます。奇妙な場合には、カスタムメッセージを提供する必要があるため、前者を呼び出す必要がありますが、内部例外は提供されません(通常、これは、を含むがそれ自体nullではない配列/コレクション引数の例外をスローするときに行いますnull)。したがって、この場合、明示的なキャストが必要であり、そこでは許容できると思います。

メソッドが実際に同じことを行うが、nullそれでも通常の値である場合は、nullバリアントにパラメーターなしのオーバーロードを追加することをお勧めします(つまり、明示的なキャストは引き続き可能ですが、ユーザーは代わりにパラメーターなしのオーバーロードを呼び出すこともできます)。

メソッドが多少異なることを実行し、さらに何か他のことを実行する場合は、表示したメソッドを完全にnull禁止し、ケースにパラメーターなしのオーバーロードを追加することを検討できます。nullnull

更新:とにかく受け入れられない場合null(そして例外が発生する場合)、メソッドはそのままにしておく必要があります。テスト目的以外では、リテラルnullがメソッドに渡されるような状況が発生することはありません。これにより、必ず例外が発生します。したがって、この場合はオーバーロード名を変更しないでください。

于 2012-06-26T09:29:32.013 に答える
0

とにかく、nullはこのメソッドへの有効な入力ですか?

個人的には、AddMode(X)とAddMode(Y)が互いに関連する何かをしていると予想されるので、AddModeの両方のオーバーロードが関連している限りそのままにしておきます。

それらがまったく関連していない場合は、メソッド名の変更が必要である可能性があります

于 2012-06-26T09:30:05.637 に答える
0

どちらのnull値がAPIで許容される値であるかによって異なります。

それを受け入れないだけでなく、それをサポートしないことによって。したがって、消費者がコンパイラでそれを使用しようnullとしても、あいまいさの問題が発生します。

于 2012-06-26T09:31:23.117 に答える
0

API が可能なパラメーター値として null を受け入れる場合は、ドキュメントでそれを指定し、キャストする必要があることを記述し、その方法を示すコード サンプルを記述する必要があります。

ただし、ユーザーに null 値を使用させたくない場合は、クラス設計で許可されていれば、TypeA と TypeB を astructではなくa に変更できます。class

于 2012-06-26T09:42:55.977 に答える