6

假设我希望有 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 );

第一个选项的好处是用户不必担心他们正在呼叫哪个。他们可以使用整数或双精度数调用 GetRandomNumber 并获得结果。

第二个选项在名称中更明确,但它向调用者显示了不需要的信息。

我知道这是小事,但我关心小事。

编辑:C++ 在隐式转换方面的表现如何。

例子:

GetRandomNumber( 1, 1 ); 

这可以为双版本的 GetRandomNumber 函数隐式转换。显然我不希望这种情况发生。C++会在double版本之前使用int版本吗?

4

8 回答 8

3

我更喜欢你的第二个例子,它是明确的,并且在解释上没有歧义。最好不要在方法名称中明确说明以清楚地阐明该成员的目的和功能。

您的方法的唯一缺点是您已将方法名称与返回类型耦合,如果您想更改其中一种方法的返回类型,这并不理想。但是,在这种情况下,我最好添加一个新方法,并且无论如何都不要破坏 API 的兼容性。

于 2009-12-17T21:30:41.083 回答
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() 方法。它有 11 个重载:int、double、byte 等。

于 2009-12-17T21:35:18.097 回答
1

我通常更喜欢第一个示例,因为它不会污染命名空间。例如,在调用它时,如果我传递整数,我希望得到一个整数。如果我通过双打,我可能希望得到双打。如果你这样写,编译器会给你一个错误:

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

所以这不是一个大问题。如果你需要一个 int 但有双打输入,你总是可以转换参数......

于 2009-12-17T21:36:32.910 回答
0

在某些语言中,您不能改变重载函数的返回类型,这需要第二个示例。

于 2009-12-17T21:33:14.900 回答
0

假设 C++,第二个也避免了歧义的问题。如果你说:

GetRandomNumber( 1, 5.0 );

应该使用哪一个?事实上,这是一个编译错误。

于 2009-12-17T21:34:14.080 回答
0

我认为理想的解决方案是

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

但是,唉,静态扩展方法是不可能的(还没有?)。

.net 框架似乎倾向于第一个选项(System.Math 类):

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

像 Andrew 一样,我个人倾向于第二种选择以避免歧义,尽管我确实认为这是一个品味问题。

于 2009-12-17T21:40:02.813 回答