函数声明应该包括参数名吗?
Should function declarations include parameter names?
你会考虑哪种更好的编码风格:在头文件中声明函数/方法的参数名,还是只在源文件中声明,因为两者都可以做到?如果您实际上考虑仅在源文件中声明函数/方法的参数名,那么如何声明默认值呢?
外标题:
//One.hpp
#ifndef ONE_HPP
#define ONE_HPP
namespace eins {
/** brief description
*
* param one represents ....
* param two represents ....
*/
void function(int,int);
}
#endif
// One.cpp
#include "One.hpp"
eins::function(int one,int two) {
//Do stuff//
}
里面的标题:
//One.hpp
#ifndef ONE_HPP
#define ONE_HPP
namespace eins {
/** brief description
*
* param one represents ....
* param two represents ....
*/
void function(int one,int two);
}
#endif
// One.cpp
#include "One.hpp"
eins::function(int one,int two) {
//Do stuff//
}
我个人的观点是第一种方式更好,因为用户实际上被迫阅读注释/API,而不能被误导到只阅读参数名。但是我不确定这一点,实际上声明默认值会打破我的风格,因为你必须在函数/方法的头声明中这样做。
虽然两者都可以,而且使用得很多,但是在头文件的声明中使用参数名有一个明显的优势。
大多数文档系统(比如,氧)会解析你的头文件并生成文档。例如:http://libface.sourceforge.net/doc/html/classlibface_1_1_face.html
查看构造函数文档
做比较Parameters:
x1 X coordinate of the top left corner of the face.
y1 Y coordinate of the top left corner of the face.
x2 X coordinate of the bottom right corner of the face.
y2 Y coordinate of the bottom right corner of the face.
id ID of the face. -1 not not known.
face A pointer to the IplImage with the image data.
和
Parameters:
param1 X coordinate of the top left corner of the face.
param2 Y coordinate of the top left corner of the face.
param3 X coordinate of the bottom right corner of the face.
param4 Y coordinate of the bottom right corner of the face.
param5 ID of the face. -1 not not known.
param6 A pointer to the IplImage with the image data.
你明白了。:)
在声明中包含参数名。
最好以尽可能紧凑的格式向其他开发人员提供尽可能多的信息。强迫他们查找注释来确定一些简单的东西,比如参数是什么,可能会使他们脱离流程,降低他们的工作效率,并惹恼他们。
您应该努力为您的函数命名得足够好,以至于它们不需要包含参数名来清楚地说明它们的作用。如果你看到一个方法原型:
void save(const std::string&);
它在做什么?它保存了那个字符串吗?还是保存到字符串表示的文件路径?或者…?
你可以这样写:
void save(const std::string& filepath);
澄清。但这只澄清了当有人看着头。如果你这样做:
void saveToFilepath(const std::string&);
应该到处都很清楚。当然,随着您添加更多参数,这将变得更加麻烦(但这是不添加太多参数的另一个原因;参见Bob Martin的Clean Code;
他推崇一元和一元函数,对二元函数犹豫不决,对三元函数相当缄默,除此之外不愿再做任何事。所以我的建议是尽量不要有理由在函数头文件中包含参数名,这本身并不是一个目的(尽管我完全赞成减少重复和增加简洁),而是作为一种对函数命名的启发。(注意,如果您使用的是遗留代码,您可能想让自己放松下来,但要牢记最终目标。)
这种方法意味着每次键入函数头文件时都必须停下来仔细考虑是否要包含参数名,而不是遵循非黑即白的规则。程序员倾向于向前推进,而不是停下来思考诸如命名之类的事情,但是停下来反思在许多不同的层面上都是有价值的。
总而言之,尽量避免需要在头文件中包含参数名;当你不需要它们的时候,为了简洁和减少重复,就不要把它们包括进去了。我的经验法则是给所有东西命名。并不是每个头文件在每个函数之前都有很好的注释,因此,当缺乏像样的文档时,参数名是用来解释函数的全部。
在最坏的情况下,它代表程序员进行了一些额外的输入。除了已提供的任何评论之外,它还显示了意图。我从来没有提倡一种似乎纯粹是为了节省打字而存在的做法。在这些自动完成的ide中,没有比这更容易的了。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 包括一个类来定义全局变量参数 c++ :(
- 如何查看完整的CMD执行命令,包括参数和标志?
- 使用模板参数还包括 constexpr 成员函数enable_if单独定义和声明模板成员函数
- 包括一个大标头以使用对象作为默认参数
- CreateProcess正在调用cmd.exe,包括没有显示(闪烁)窗口的参数
- 不完整的参数错误,包括其他.cpp文件中的postgres.cpp工作文件
- 如何从C++调用Delphi DLL WideString参数(包括var参数)
- 函数类型和参数,包括它们作为参数的类型
- 在c++ 11中,是否有一种方法可以在调用以任何可调用对象(包括绑定方法)作为参数的函数时不需要模板参数
- 函数声明应该包括参数名吗?
- 试图编译一个c++代码与根(Cern)参数包括