数字作为std :: string还是double?

时间:2012-11-11 17:36:21

标签: c++ string parameters

我正在为http客户端编写C ++库。我对编程没有太多经验,所以请帮助我。

我的方法名为add。它有两个参数。第一个是类型名称,第二个是参数q。它是介于0和1之间的数字。点后应该有0到4位数。

我可以写它,但我不知道什么是更好的:

  1. void add(std::string type, double q) - >我必须在这个方法的主体中将q转换为std :: string。

  2. void add(std::string type, std::string q) - >没关系,它更快但可能对用户不太直观,因为它是一个数字(?)....

  3. 这是一个好主意,有两种方法:1)和2)?

    请帮帮我。我没有经验......我知道这两种方法有效,但更好,更受欢迎。你怎么看?你会怎么写这个?

3 个答案:

答案 0 :(得分:5)

通常,您只需通过查看方法签名就可以清楚地了解用户的期望。您的代码应该为使用它的人提供有用的点击(即,使您的代码正在做什么以及对它们的期望更加明显)。

让我们从最糟糕的一个开始:

void add(std::string type, std::string q)
  • 没有任何明确表示q应该是一个数字。
  • q不是一个非常具有描述性的名称。

通过上面的例子,调用者可能会感到困惑,并使用反向参数调用该方法:add("5.0123", "someType")没有任何事情告诉用户他们做错了什么,直到必须使用参数。最糟糕的是,你现在还不知道事情会在哪里爆发。这可能导致一些非常难以追踪错误,因为没有强制执行适当的类型。

稍微好一些:

void add(std::string type, double q)
  • 现在很明显,用户正在添加某种类型和某种类型的double值。
  • q仍然不是描述性名称

我建议:

void add(std::string type, double value)
  • 现在很明显,用户正在添加某种类型和某种类型的double值。
  • 双精度版的参数名称现为value(比q描述性更强)。

现在用户无法使用参数乱序调用方法,即add(5.0123, "someType"),因为这会导致编译器错误。如果不明显:获得编译器错误会更好,因为它可以立即修复。通过这种方式,您可以从头开始制作更安全的代码。

这当然意味着您必须将double转换为string,但大部分这是一个很小的代价上面列出的好处。

我不知道该值代表什么,但您可以越接近地将参数命名为它所代表的“真实世界”实体,它就越好。

答案 1 :(得分:2)

考虑该方法应该做什么以及用户如何调用它。如果第二个参数是数字,那么您应该使用适当的数字类型。一般来说,你应该以任何看起来更“自然”的方式编写代码。链接的上述帖子非常棒,并且详细介绍了这一点。

至于你对“更快”的关注,你需要停止思考这个问题。这些微优化不太可能对性能产生可测量的影响,并且它们不应该作为新程序员担心。专注于正确的代码。

答案 2 :(得分:1)

这里有两个交错问题:

  1. 浮点类型floatdoublelong double无法准确表示十进制数,即使十进制数只有几位数。例如,将0.1表示为这些类型之一时,您将获得舍入值。标准库确保当您读取此值并再次写入时,您将返回原始值(尾随零除外:0.1000可能格式化为0.1)。对于格式化舍入错误并不是一个大问题,但是当你开始算术时,小错误会导致有趣的问题。绕过精确的表示,例如a std::string的优点是处理这些值的函数可以做正确的事。
  2. 使用std::string而不是数值的问题有一个问题,即接口没有指出参数代表什么,编译器无法帮助直接使用类型检查获取参数:实际类型隐藏在std::string内。理想情况下,您将使用一个完全保留值的参数,同时也指示其语义。
  3. 根据您的需要,使用浮点类型或std::string可能是正确的选择:如果您想通过函数传递数值,并且可以使用松散的尾随小数位数,则可能是最好使用浮点类型。如果你需要精确算术并且需要保留尾随派系零,std::string可能是更好的选择。优选地,您可以使用专用于十进制值的正确表示的类型(将来您希望能够使用std::decimal64,但它不是标准的一部分)。