2009-04-21 15 views
5

Sono abbastanza nuovo programmatore C++ e mi piacerebbe sentire le argomentazioni a favore e contro la denominazione parametri all'interno della dichiarazione della classe.C++ Stile Convenzione: Nomi dei parametri all'interno Dichiarazione Classe


Ecco un esempio:

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_*/ 

vs.

#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; } 

Non riesco a decidere. Da un lato, mi sento che è superfluo dare un nome alle variabili sia la dichiarazione (.h) e la definizione (cpp). Soprattutto perché devi preoccuparti di aggiornare i nomi in entrambi i posti in modo che corrispondano. D'altra parte, senza nomi, spesso può essere fonte di confusione determinare quali variabili i parametri corrispondono semplicemente osservando la dichiarazione.

Quindi, quali sono i tuoi pensieri?

+0

basta usare 'int' e' double', non 'int' senza segno e' float'. Nel caso di 'unsigned int' probabilmente stai tentando di documentare un vincolo di valore, ma invece di C++ che impone che fornisce una serie di insidie, cioè, nessun guadagno, ma molto dolore non necessario. Generalmente si utilizzano solo tipi non firmati in cui si ha a che fare con il livello di bit o dove sono forzati dalle funzioni di libreria. Nel caso di 'float' stai forse tentando di risparmiare memoria. Questo è fuorviante a meno che tu non abbia miliardi di studenti. :-) Saluti e hth. –

+0

@Alf P. Steinbach: quali insidie? Perché raddoppiare quando è sufficiente il float? Elaborare. –

risposta

19

È molto meglio utilizzare i nomi dei parametri nella dichiarazione e utilizzare nomi di parametri validi. In questo modo, servono come documentazione della funzione. Altrimenti, dovrai scrivere commenti addizionali nella tua intestazione, ed è sempre meglio usare buoni parametri/nomi di variabili che usare i commenti.

eccezione: quando una funzione deve avere un certo firma per motivi esterni, ma i parametri non sono effettivamente utilizzati. In questo caso, non dovresti nominarli nemmeno nell'implementazione.

+3

Eccezione: quando i parametri sono evidenti oi tipi sono auto-documentazione, per esempio, 'Point3D (T, T, T)' e 'coppia (chiave, valore)' sono entrambi abbondantemente chiaro. –

4

inserire i nomi in entrambi i luoghi, la chiarezza è la ricompensa che si ottiene per il compito di mantenere le firme in due punti.

1

Anche se ridondante, trovo che è meglio avere i nomi dei parametri in entrambi i luoghi. Questo in genere è dovuto al fatto che, cambiando il nome di un parametro, spesso ha conseguenze semantiche. La mancanza nell'intestazione aiuta a rovinare la documentazione (che è dove tendo a inserire la maggior parte dei commenti, ad esempio le specifiche API) e mancherà nell'implementazione mi aiuta a dimenticare il motivo per cui quel particolare parametro ha un nome così strano.

L'unica volta che rinuncio nome di un parametro è quando devo implementare una terza richiamata libreria di partito e non sto usando uno dei parametri. Anche allora vorrei:

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

in modo che conosca bene la firma.

-1

Sì, non è necessario assegnare un nome ai parametri nel file .h. Si suppone che un file di intestazione rappresenti un'interfaccia, quindi non è necessario avere dettagli non necessari.

HTH

+0

Sembra che il consenso sulla domanda che hai collegato sia di non usare un carattere di sottolineatura per le variabili membro, cosa che non lo faccio. Mentre alcune persone potrebbero trovarlo fastidiosamente prolisso, tendo ad usare la parola chiave "this" come nell'esempio che ho postato sopra. Non sono sicuro di cosa stavi cercando di illustrare con quel link. – Scott

+0

Vero - e "float, float" NON è l'interfaccia. "float height, float GPA" è la vera interfaccia. – MSalters

+0

Spiacente, ho rimosso il collegamento di sottolineatura.Era pensato per qualcun altro :-) @MSalters: Sono d'accordo che i nomi dei parametri aggiungano al significato che fornisce un'interfaccia, ma IMHO fare affidamento su questo non è il modo ideale. Cosa succede se qualcuno li rinomina in modo diverso nell'intestazione e poi nell'imp. file. Sarà più confuso. Dal punto di vista della manutenzione, sento che lasciare i nomi fuori dall'intestazione sia utile. – Abhay

3

Intellisense/completamento automatico/qualunque cosa simile è in ambienti di sviluppo di solito vede solo la dichiarazione e mostrerà solo come completamento automatico. Quindi se non si dichiarano i nomi nella dichiarazione gli utenti non li vedranno in completamento automatico a meno che non vadano a leggere la fonte.Forse è tollerabile, ma non molto conveniente.

+0

Oh, con tutti i mezzi, ho messo i nomi nella dichiarazione. Forse il mio post non era abbastanza chiaro, ma stavo cercando di ottenere ragioni a favore o contro * in aggiunta * mettendo nomi nell'intestazione. – Scott

+0

Oops! Grattalo. Ho letto "definizione" invece di "dichiarazione" nella tua risposta. Grazie per l'informazione. – Scott

0

Se mai rilascia il codice come librray, con file h associato, gli utenti non vedrà mai la definizione, solo la dichiarazione, aggiungendo un onere di documentazione exztra su te stesso.

0

Da un lato, sento che è superfluo dare un nome alle variabili in sia la dichiarazione (h) e la definizione (cpp). Soprattutto perché si deve preoccuparsi di aggiornare i nomi in entrambi i posti in modo che essi partita.

Non è necessario i nomi in modo che corrisponda letteralmente. Il file di intestazione, che specifica l'interfaccia, funziona un po 'come un contratto imperfetto (imperfetto perché non contiene precondizioni e postcondizioni, a meno che non lo si scriva nei commenti) e una "guida per il chiamante". Il chiamante della classe vorrà sapere quali sono i parametri sono, nel 99% dei casi. Almeno perché sappia cosa sta succedendo. Quindi è necessario scegliere un nome parametro che abbia senso per il chiamante. Questo non ha bisogno di essere identico al nome nel cpp. Tuttavia questo non importa molto, perché sono abituato a copiare/incollare le firme delle funzioni da .h a .cpp in primo luogo. Per me, la programmazione in C++ implica questa parte manuale.

D'altra parte, senza nomi, si spesso può essere fonte di confusione per determinare quali variabili i parametri corrispondono a solo guardando la dichiarazione .

Questa è la buona mano.

0

Suppongo che dipende da come descrittivo i tipi di variabili sono. Se la firma del metodo contiene tipi utilizzati per molteplici scopi, allora è utile:

double calculateTax(int, string); 

Se i tipi sono descrittivi, quindi compresi i nomi è ridondante.

Money calculateTax(Order, State); 

Preferirei non mantenere i nomi in due file.

Problemi correlati