【问题标题】:Ambiguity of function overloading - Integers vs. Doubles函数重载的歧义 - 整数与双精度
【发布时间】:2015-04-24 06:03:37
【问题描述】:

假设我希望有 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版本吗?

【问题讨论】:

  • 第二个选项揭示了哪些“不需要的信息”?
  • 一件小事是您使用的是哪种编程语言?
  • +1 关心小事。
  • C++。 Doh,C++ 中甚至不允许重载返回类型。
  • C++ 允许您在更改参数类型时更改返回类型。

标签: ambiguity


【解决方案1】:

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

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

【讨论】:

  • .NET 也充满了使用第一种方法的示例。就像在 Console.WriteLine() 和 System.Math 中的所有内容一样... ;)
【解决方案2】:

我更喜欢第二个版本。当两个函数最终做同样的事情时,我喜欢重载一个函数;在这种情况下,它们返回不同的类型,因此它们并不完全相同。如果您的语言支持,另一种可能性是将其定义为通用/模板方法,例如:

T GetRandom<T>(T min, T max);

【讨论】:

  • Ew,你如何限制数字类型?
【解决方案3】:

函数名应该说明函数的作用;我认为将类型塞入名称中没有意义。所以绝对要超载 - 这就是它的目的。

【讨论】:

    【解决方案4】:

    我更喜欢重载的方法。查看 .NET 中的 Math.Min() 方法。它有 11 个重载:int、double、byte 等。

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • 你指的是什么语言,这在 C 和 C++ 中完全没问题。
      • 哎呀,我指的是c#。我认为 java 也会给出一个错误。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        GetRandomNumber( 1, 5.0 );
        

        应该使用哪一个?其实是编译错误。

        【讨论】:

          【解决方案8】:

          我认为理想的解决方案是

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

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

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

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

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

          【讨论】:

          • 对于像Abs 这样的东西,在传递int 时没有自然理由返回double,使用相同的名称是有意义的。不过,在GetRandom 的情况下,我倾向于使用不同的名称,因为人们很可能想要一个由整数描述的范围内的随机双精度数。顺便说一句,vb.net 将这一理念扩展到除法运算符(对整数和浮点除法使用单独的运算符),因为在对整数操作数进行除法时,有时需要浮点结果,有时需要整数结果。
          猜你喜欢
          • 1970-01-01
          • 2016-11-06
          • 1970-01-01
          • 1970-01-01
          • 2017-06-21
          • 2012-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多