2011-10-25 79 views
16

你会怎么考虑一个更好的编码风格:在头文件中声明函数/方法的参数名称,或者只在源文件中声明函数/方法的参数名称,因为它可以同时执行这两个操作?如果您实际上只考虑在源文件中声明函数/方法的参数名称,那么您将如何声明默认值?函数声明应该包含参数名称吗?

外标题:

//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和不能误导读取参数名称。但我不确定这一点,实际声明默认值会破坏我的风格,因为您必须在函数/方法的头声明中这样做。

+4

你错误地认为你需要包含一个参数名来声明一个参数的默认值。这非常好:'void function(int,int = 0)'。这是一个默认值的未命名参数。 –

+1

为了对付您关于消费者的评论被参数的正式名称误导,我认为这是参数名称不佳的指标。对于在代码中无法轻易描述的内容,例如特定代码段的“为什么”,文档是最好的*。 –

回答

23

尽管两者都是好的并且用得相当多,但在头文件的声明中使用参数名称有明显的优势。

大多数文档系统(比如doxygen)会解析你的头文件并生成文档。 作为一个例子,请看这里: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. 

你明白了吧。 :)

+0

+1,它甚至使自动文档引擎更加冗长。 –

+0

当参数被声明时,第一个列表是否总是按顺序排列?因为当你实际使用一个函数/方法时,你不知道参数的名称,而是头中的位置。 – Sim

+0

@Sim在doxygen,是的。 –

3

我的经验法则是命名一切。并非每个头文件在每个函数之前都有很好的注释,因此参数名称只有在缺乏体面的文档时才能解释该函数。

在最坏的情况下,代表程序员进行一些额外的输入。它显示了意图,除了已提供的任何意见。我从来没有人主张纯粹为了节省打字而存在的练习。在自动完成iDE的这些日子里,从未如此简单。

10

在声明中包含参数名称。

最好尽可能以紧凑的格式为其他开发者提供尽可能多的信息。强迫他们查看评论以确定简单的参数,这些参数很可能会使他们脱离流程,使他们的生产效率降低,并使他们失望。

3

你应该尽力为你的函数命名,以便它们不需要包含参数名称,以明确它们的功能。如果您看到方法原型:

void save(const std::string&); 

它在干什么?它保存了那个字符串吗?或者它保存到由字符串表示的文件路径?要么...?

所以,你可以这样做:

void save(const std::string& filepath); 

澄清。但是这只有在有人正在看标题时才会澄清。如果你这样做:

void saveToFilepath(const std::string&); 

它应该是很清楚的地方。当然,随着添加更多参数,这变得更加麻烦(但是更多的原因是不要添加太多参数;请参阅Bob Martin的Clean代码;他赞扬无限和单值函数,对二元函数犹豫不决,对三项功能漠不关心,除此之外不愿意)。

所以我的建议是努力没有理由在你的函数头文件中包含你的参数名称,而不是本身的目标(虽然我全部都是为了减少重复和增加简洁性)但是作为启发式为你如何命名你的功能。 (请注意,如果您使用的是旧版代码,则可能需要削减自己的余额—,但考虑到最终目标。)

此方法意味着您必须停下来思考每次键入函数头部来检查自己,而不是遵循关于是否包含参数名称的黑白规则。程序员倾向于提前收费,而不是停下来思考命名等事情,但停下来反思在很多不同层面上都是有价值的。

总之,力求不要需要将参数名称包含在头文件中;当你不需要它们时,为了简洁和减少重复,不要费心去包括它们。

相关问题