Dal momento che si dice che si conosce la teoria, e altre risposte hanno scavato nel significato di pubblico/privato, getter e setter, vorrei concentrarmi sul perché di utilizzare funzioni di accesso invece di creare attributi pubblici (dati dei membri in C++).
Immaginate di avere un camion di classe in un progetto logistico:
class Truck {
public:
double capacity;
// lots of more things...
};
a condizione che siano nordamericano, probabilmente utilizzare galloni al fine di rappresentare la capacità dei camion. Immagina che il tuo progetto sia finito, funziona perfettamente, anche se molti usi diretti di Truck::capacity
sono fatti. In realtà, il tuo progetto diventa un successo, quindi alcuni studi europei ti chiedono di adattare il tuo progetto a loro; sfortunatamente, il progetto dovrebbe utilizzare ora il sistema metrico, quindi per la capacità dovrebbero essere utilizzati litri anziché litri.
Ora, questo potrebbe essere un disastro. Naturalmente, una possibilità sarebbe quella di preparare una base di codici solo per il Nord America e una base di codici solo per l'Europa. Ma questo significa che le correzioni dei bug dovrebbero essere applicate in due diverse fonti di codice, e questo è deciso per essere irrealizzabile.
La soluzione è creare una possibilità di configurazione nel progetto. L'utente dovrebbe essere in grado di impostare galloni o litri, invece di essere una scelta fissa fissa di galloni.
Con l'approccio visto sopra, questo significherà molto lavoro, dovrete rintracciare tutti gli usi di Truck::capacity
e decidere cosa fare con loro. Ciò probabilmente significherà modificare i file lungo l'intera base di codice. Supponiamo, in alternativa, di aver deciso un approccio più theoretic
.
class Truck {
public:
double getCapacity() const
{ return capacity; }
// lots of more things...
private:
double capacity;
};
Una possibile, il cambiamento alternativa comporta alcuna modifica all'interfaccia della classe:
class Truck {
public:
double getCapacity() const
{ if (Configuration::Measure == Gallons) {
return capacity;
} else {
return (capacity * 3.78);
}
}
// lots of more things...
private:
double capacity;
};
(Si prega di tenere conto int che ci sono molti modi per fare questo, quello è solo una possibilità , e questo è solo un esempio)
Dovrai creare la configurazione della classe di utilità globale (ma dovresti farlo comunque) e aggiungere un include in truck.h
per configuration.h
, ma queste sono tutte modifiche locali, il rimanere l'inserimento della tua base di codice rimane invariato, evitando così potenziali bug.
Infine, dichiari anche che stai lavorando ora in un grande progetto, che penso sia il tipo di campo in cui queste ragioni in realtà hanno più senso. Ricorda che l'obiettivo da tenere presente mentre lavori su grandi progetti è creare codice gestibile, cioè codice che puoi correggere ed estendere con nuove funzionalità. Puoi dimenticarti di getter e setter in piccoli progetti personali, anche se proverei a rendermi abituato a loro.
Spero che questo aiuti.
La risposta OO sarebbe quella di utilizzare variabili private. Ma il modello di visibilità in C++ è abbastanza rotto (un po 'meno in C++ 11) e i membri privati possono causare problemi molto sorprendenti se non si danno loro nomi uguali. –
@MarcGlisse Wut? – Collin
Quasi una vittima precisa: http://stackoverflow.com/questions/1596432/getter-and-setter-pointers-or-references-and-good-syntax-to-use-in-c –