Соглашение о стиле C ++: имена параметров в объявлении класса - PullRequest
5 голосов
/ 21 апреля 2009

Я довольно новый программист на 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 ). Тем более что вам нужно беспокоиться об обновлении имен в обоих местах, чтобы они совпадали. С другой стороны, без имен часто бывает сложно определить, каким переменным соответствуют параметры, просто взглянув на объявление.

Итак, что вы думаете?

Ответы [ 8 ]

19 голосов
/ 21 апреля 2009

Гораздо лучше использовать имена параметров в объявлении и использовать правильные имена параметров. Таким образом, они служат функциональной документацией. В противном случае вам придется писать дополнительные комментарии в заголовке, и всегда лучше использовать хорошие имена параметров / переменных, чем использовать комментарии.

Исключение: когда функция должна иметь определенную подпись по внешним причинам, но параметры фактически не используются. В этом случае вам также не следует указывать их имена в реализации.

4 голосов
/ 21 апреля 2009

Поместите имена в обоих местах, ясность - это награда, которую вы получаете за работу по поддержанию подписей в двух местах.

3 голосов
/ 21 апреля 2009

Intellisense / autocomplete / что-либо подобное в средах разработки обычно видит только объявление и будет показывать его как autocomplete. Поэтому, если вы не объявляете имена в объявлении, пользователи не увидят их в автозаполнении, если не пойдут и не прочитают источник. Это возможно терпимо, но не очень удобно.

1 голос
/ 21 апреля 2009

Даже если это избыточно, я считаю, что лучше иметь имена параметров в обоих местах. Обычно это происходит потому, что изменение имени параметра часто имеет семантические последствия. Отсутствие его в заголовке помогает испортить документацию (именно к этому я стремлюсь добавить большинство комментариев, т. Е. Спецификации API), а отсутствие его в реализации помогает мне забыть, почему этот конкретный параметр имеет такое странное имя.

Единственный раз, когда я отказываюсь от имени параметра, это когда мне нужно реализовать функцию обратного вызова сторонней библиотеки, и я не использую один из параметров. Даже тогда я бы сделал:

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

чтобы я хорошо знал подпись.

0 голосов
/ 15 октября 2010

Полагаю, это зависит от того, насколько описательны ваши типы переменных. Если ваша сигнатура метода содержит типы, используемые для нескольких целей, то это полезно:

double calculateTax(int, string);

Если типы являются описательными, то включение имен является излишним.

Money calculateTax(Order, State);

Я бы предпочел не хранить имена в двух файлах.

0 голосов
/ 21 апреля 2009

С одной стороны, я чувствую, что это избыточно называть переменные в как декларация (.h), так и определение (.cpp). Особенно с тех пор, как Вы должны беспокоиться об обновлении имена в обоих местах, чтобы они матч.

Вам не нужны имена, чтобы соответствовать буквально . Заголовочный файл, который определяет интерфейс, работает немного как несовершенный контракт (несовершенный, потому что он не содержит предварительных условий и постусловий, если вы не записываете их в комментариях) и «руководство для вызывающего». Вызывающий класс захочет узнать, какие параметры равны , в 99% случаев. По крайней мере, чтобы он знал, что происходит. Таким образом, вы должны выбрать имя параметра, которое имеет смысл для вызывающей стороны. Это не должно совпадать с именем в cpp. Однако это не имеет большого значения, потому что я привык копировать / вставлять сигнатуры функций из .h в .cpp. Для меня программирование на C ++ подразумевает эту часть руководства.

С другой стороны, без имен это часто бывает сложно определить какие переменные параметры соответствовать просто, глядя на декларация.

Это хорошая рука.

0 голосов
/ 21 апреля 2009

Если вы когда-либо выпускаете свой код в виде librray со связанным файлом .h, ваши пользователи никогда не увидят определение, только объявление, добавляя на вас бремя документации exztra.

0 голосов
/ 21 апреля 2009

Да, не обязательно указывать параметры в файле .h. Предполагается, что заголовочный файл представляет интерфейс, поэтому он не должен содержать ненужных деталей.

НТН

...