0

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

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

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

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

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

有两种方法:1)和2)是个好主意吗?

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

4

3 回答 3

5

通常,您希望通过查看方法签名来明确用户的期望。您的代码应该为使用它的人提供有用的信息(即让您的代码在做什么以及对它们的期望更加明显)。

让我们从最糟糕的开始:

void add(std::string type, std::string q)
  • 没有什么可以明确说明q应该是一个数字。
  • q不是一个描述性很强的名字。

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

稍微好一些:

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

我会推荐:

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

现在用户不能调用参数乱序的方法,即add(5.0123, "someType"),因为它会导致编译器错误。如果不是很明显:最好得到一个编译器错误,因为它可以立即修复。这样,您就可以从头开始编写更安全的代码。

当然,这意味着您必须将 a 转换double为 a string,但在大多数情况下,鉴于上述所有好处,这是一个很小的代价。

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

于 2012-11-11T17:41:11.893 回答
2

想想该方法应该做什么以及用户将如何调用它。如果第二个参数是数字,那么您应该使用适当的数字类型。一般来说,您应该以任何看起来更“自然”的方式编写代码。Link 的上述帖子很棒,并且对此进行了更多详细说明。

至于您对什么是“更快”的担忧,您需要停止考虑这一点。这类微优化不太可能对性能产生可衡量的影响,并且作为新程序员,您不应该担心它们。专注于正确的代码。

于 2012-11-11T17:50:05.817 回答
1

这里有两个交错问题:

  1. 浮点类型floatdoublelong double不能准确表示十进制数,即使十进制数只有几位数字。例如,当表示0.1为其中一种类型时,您将得到一个四舍五入的值。标准库确保当您读取该值并再次写入时,您会取回原始值(尾随零除外:0.1000可能会被格式化为0.1)。对于格式化舍入误差不是什么大问题,但是当你开始做算术时,小误差可能会导致有趣的问题。传递一个精确的表示,例如 a std::string,具有处理这些值的函数可以做正确的事情的优点。
  2. 使用std::string而不是数值的问题是接口没有指示参数代表什么,编译器无法帮助直接使用类型检查来获取参数:实际类型隐藏在std::string. 理想情况下,您将使用一个参数,该参数准确地保留了该值,同时还表明了它的语义。

根据您的需要,使用浮点类型或 astd::string可能是正确的选择:如果您想通过函数传递数值并且可以接受松散尾随小数位,则最好使用浮点类型。如果您需要精确算术并需要保留尾随的派系零,astd::string可能是更好的选择。不过,您最好使用一种专用于正确表示十进制值的类型(希望将来您可以使用std::decimal64,但它还不是标准的一部分)。

于 2012-11-11T17:58:06.357 回答