2009-04-21 74 views
5

我是一个相当新的C++程序员,我希望听到在类声明中针对和反对命名参数的参数。C++风格约定:类声明中的参数名称


下面是一个例子:

Student.h

#ifndef STUDENT_H_ 
#define STUDENT_H_ 

#include <string> 

using namespace std; 

class Student 
{ 
    private: 
     string name; 
     unsigned int age; 
     float height, GPA; 

    public: 
     Student(string, unsigned int, float, float); 

     void setAge(unsigned int); 
}; 

#endif /*STUDENT_H_*/ 

#ifndef STUDENT_H_ 
#define STUDENT_H_ 

#include <string> 

class Student 
{ 
    private: 
     string name; 
     unsigned int age; 
     float height, GPA; 

    public: 
     Student(string name, unsigned int age, float height, float GPA); 

     void setAge(unsigned int age); 
}; 

#endif /*STUDENT_H_*/ 

Student.cpp

#include "Student.h" 

Student::Student( string name, 
      unsigned int age, 
      float height, 
      float GPA) : 

      name(name), 
      age(age), 
      height(height), 
      GPA(GPA) {} 

void Student::setAge(unsigned int age) { this -> age = age; } 

我不能决定。一方面,我认为在声明(.h)和定义(.cpp)中命名变量是多余的。特别是因为你必须担心在两个地方更新名称,以便它们匹配。另一方面,没有名称,通过查看声明来确定参数对应的变量通常会令人困惑。

那么,你有什么想法?

+0

只是使用`int`和`double`,而不是`unsigned int`和`float`。在`unsigned int`的情况下,你可能试图记录一个值约束,但不是C++强制执行,它提供了许多陷阱,即没有收益,但是有很多不必要的痛苦。通常只使用无符号类型来处理位级别,或者在库函数中强制使用。在`float'的情况下,你可能试图节省内存。这是错误的,除非你有数十亿的学生。 :-)干杯&hth。 – 2010-10-15 18:36:47

+0

@Alf P. Steinbach:哪些陷阱?为什么浮动足够时加倍?阐述。 – 2011-02-11 14:32:40

回答

19

在声明中使用参数名称并使用好的参数名称要好得多。这样,它们可以作为功能文档。否则,你将不得不在你的头文件中写入额外的注释,并且最好使用好的参数/变量名称而不是注释。

例外:当一个函数必须具有特定的签名以用于外部原因,但实际上并未使用这些参数。在这种情况下,你不应该在实现中命名它们。

+3

例外:当参数很明显或类型是自我记录时,例如`Point3D(T,T,T)`和`Pair(Key,Value)`都非常清晰。 – 2010-10-15 17:48:21

4

将名称放在两个地方,清晰度是您在维护两个位置的签名任务时获得的奖励。

1

即使多余,我发现最好在两个地方都有参数名称。这通常是因为,更改参数名称往往具有语义结果。在头文件中丢失它有助于搞乱文档(这是我倾向于将大部分注释(即API规范)放在其中的地方),并且在实现中忽略它可以帮助我忘记为什么特定参数具有这样一个奇怪的名称。

我放弃参数名称的唯一时间是当我必须实现第三方库回调,我没有使用其中一个参数。即使那么我会这样做:

my_callback(int idx, Context* /*ctx*/) { ... 

这样我就知道签名了。

-1

是的,没有必要命名.h文件中的参数。头文件应该表示一个接口,所以它不需要不必要的细节。

HTH

+0

看起来你所链接的问题上的共识是不对成员变量使用下划线,我不这样做。虽然有些人可能会觉得烦人的冗长,但我倾向于使用“this”关键字,就像我在上面发布的示例中那样。我不确定你试图用这个链接来说明什么。 – Scott 2009-04-21 07:58:07

3

智能感知/自动/不管是类似在开发环境中,通常只看到声明,将只显示它自动完成。因此,如果您不在声明中声明名称,用户将不会在自动完成中看到它们,除非他们去阅读源代码。这也许是可以忍受的,但不是很方便。

0

如果您曾经将代码作为librray发布,并带有关联的.h文件,您的用户将永远无法看到定义,只有声明,为您自己添加exztra文档负担。

0

,一方面,我觉得这是 冗余来命名 两个声明(.H)和​​ 定义(的.cpp)变量。特别是因为 您必须担心在两个地方更新 的名称,以便它们与 匹配。

您不需要名称匹配从字面上。指定接口的头文件有点像不完全契约(不完善,因为它不包含先决条件和后置条件,除非你在注释中写下它们)和“调用者指南”。在99%的情况下,班级的来电者想知道参数。至少让他知道发生了什么。所以你必须选择一个对调用者有意义的参数名称。这不需要与cpp中的名称相同。然而,这并不重要,因为我习惯先将.h中的函数签名复制/过滤到.cpp中。对我而言,用C++编程意味着这个手册部分。

在另一方面,没有名字,它 往往是混乱,以确定 只是通过看 声明哪些变量 对应的参数。

这就是好手。

0

我想这取决于你的变量类型是如何描述的。如果你的方法签名包含用于多种用途的类型,那么它的有用:

double calculateTax(int, string); 

如果类型是描述性的,则包括名称是多余的。

Money calculateTax(Order, State); 

我不希望保留两个文件中的名称。