我正在为http客户端编写C ++库。我对编程没有太多经验,所以请帮助我。
我的方法名为add
。它有两个参数。第一个是类型名称,第二个是参数q。它是介于0和1之间的数字。点后应该有0到4位数。
我可以写它,但我不知道什么是更好的:
void add(std::string type, double q)
- >我必须在这个方法的主体中将q转换为std :: string。
void add(std::string type, std::string q)
- >没关系,它更快但可能对用户不太直观,因为它是一个数字(?)....
这是一个好主意,有两种方法:1)和2)?
请帮帮我。我没有经验......我知道这两种方法有效,但更好,更受欢迎。你怎么看?你会怎么写这个?
答案 0 :(得分: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)
value
(比q
描述性更强)。现在用户无法使用参数乱序调用方法,即add(5.0123, "someType")
,因为这会导致编译器错误。如果不明显:获得编译器错误会更好,因为它可以立即修复。通过这种方式,您可以从头开始制作更安全的代码。
这当然意味着您必须将double
转换为string
,但大部分这是一个很小的代价上面列出的好处。
我不知道该值代表什么,但您可以越接近地将参数命名为它所代表的“真实世界”实体,它就越好。
答案 1 :(得分:2)
考虑该方法应该做什么以及用户如何调用它。如果第二个参数是数字,那么您应该使用适当的数字类型。一般来说,你应该以任何看起来更“自然”的方式编写代码。链接的上述帖子非常棒,并且详细介绍了这一点。
至于你对“更快”的关注,你需要停止思考这个问题。这些微优化不太可能对性能产生可测量的影响,并且它们不应该作为新程序员担心。专注于正确的代码。
答案 2 :(得分:1)
这里有两个交错问题:
float
,double
和long double
无法准确表示十进制数,即使十进制数只有几位数。例如,将0.1
表示为这些类型之一时,您将获得舍入值。标准库确保当您读取此值并再次写入时,您将返回原始值(尾随零除外:0.1000
可能格式化为0.1
)。对于格式化舍入错误并不是一个大问题,但是当你开始算术时,小错误会导致有趣的问题。绕过精确的表示,例如a std::string
的优点是处理这些值的函数可以做正确的事。std::string
而不是数值的问题有一个问题,即接口没有指出参数代表什么,编译器无法帮助直接使用类型检查获取参数:实际类型隐藏在std::string
内。理想情况下,您将使用一个完全保留值的参数,同时也指示其语义。根据您的需要,使用浮点类型或std::string
可能是正确的选择:如果您想通过函数传递数值,并且可以使用松散的尾随小数位数,则可能是最好使用浮点类型。如果你需要精确算术并且需要保留尾随派系零,std::string
可能是更好的选择。优选地,您可以使用专用于十进制值的正确表示的类型(将来您希望能够使用std::decimal64
,但它不是标准的一部分)。