6

特定の範囲内でランダムな整数を生成する関数と、特定の範囲内でランダムな double を生成する関数の 2 つの関数が必要だとします。

int GetRandomNumber( int min, int max );
double GetRandomNumber( double min, double max );

メソッド名が同じであることに注意してください。関数に名前を付けるかどうかを決定しようとしています...

int GetRandomInteger( int min, int max );
double GetRandomDouble( double min, double max );

最初のオプションには、ユーザーがどちらを呼び出しているかを気にする必要がないという利点があります。整数または double で GetRandomNumber を呼び出すだけで、結果を取得できます。

2 番目のオプションは名前がより明示的ですが、呼び出し元に不要な情報が表示されます。

私はこれがささいなことだと知っていますが、私はささいなことを気にします。

編集: 暗黙的な変換に関して C++ はどのように動作しますか。

例:

GetRandomNumber( 1, 1 ); 

これは、double バージョンの GetRandomNumber 関数に暗黙的に変換される可能性があります。明らかに、私はこれが発生したくありません。C++ は double バージョンの前に int バージョンを使用しますか?

4

8 に答える 8

3

私はあなたの2番目の例を好みます。それは明示的であり、解釈にあいまいさを残しません。そのメンバーの目的と機能を明確に明らかにするために、メソッド名を明示的にする側で誤りを犯すことをお勧めします。

あなたのアプローチの唯一の欠点は、メソッドの名前を戻り値の型に結合したことです。これは、これらのメソッドのいずれかの戻り値の型を変更したい場合には理想的ではありません。ただし、その場合は、API の互換性を損なわないように、新しいメソッドを追加することをお勧めします。

于 2009-12-17T21:30:41.083 に答える
2

私は 2 番目のバージョンを好みます。最終的に 2 つの関数が同じことを行う場合、関数をオーバーロードするのが好きです。この場合、それらは異なる型を返すため、まったく同じではありません。言語がサポートしている場合の別の可能性は、次のようにジェネリック/テンプレート メソッドとして定義することです。

T GetRandom<T>(T min, T max);
于 2009-12-17T21:34:05.520 に答える
2

関数名は、関数が何をするかを伝える必要があります。名前に型を詰め込む意味がわかりません。したがって、間違いなく過負荷に行きます-それが目的です。

于 2009-12-17T21:34:08.577 に答える
1

私はオーバーロードされた方法を好みます。.NET の Math.Min() メソッドを見てください。int、double、byte などの 11 のオーバーロードがあります。

于 2009-12-17T21:35:18.097 に答える
1

名前空間を汚染しないため、通常は最初の例を好みます。たとえば、呼び出し時に int を渡すと、int が返されることを期待しています。ダブルスをパスした場合、おそらくダブルスが返されることを期待しています。次のように記述すると、コンパイラはエラーを返します。

//this causes an error
double d = GetRandomNumber(1,10);

したがって、それは実際には大きな問題ではありません。intが必要であるが、入力にdoubleが必要な場合は、いつでも引数をキャストできます...

于 2009-12-17T21:36:32.910 に答える
0

一部の言語では、オーバーロードされた関数の戻り値の型を変更できないため、2 番目の例が必要になります。

于 2009-12-17T21:33:14.900 に答える
0

C++ を想定すると、2 つ目もあいまいさの問題を回避できます。あなたが言った場合:

GetRandomNumber( 1, 5.0 );

どちらを使用する必要がありますか?実際、これはコンパイル エラーです。

于 2009-12-17T21:34:14.080 に答える
0

理想的な解決策は

Int32.GetRandom(int min, int max)
Double.GetRandom(double min, double max)

しかし、残念ながら、静的拡張メソッドは使用できません (まだ?)。

.net Framwork は最初のオプション ( System.Math クラス) を好むようです:

public static decimal Abs(decimal value)
public static int Abs(int value)

アンドリューのように、個人的にはあいまいさを避けるために 2 番目のオプションを好みますが、これは好みの問題だと思います。

于 2009-12-17T21:40:02.813 に答える