Perché non dovrei rendere pubbliche le variabili, ma dovrei usare getter / setter pubblici? [duplicare]

8

Sto guardando un video tutorial in C ++. Sta parlando di variabili all'interno delle classi e asserisce che le variabili dovrebbero essere contrassegnate come private. Spiega che se voglio usarli pubblicamente, dovrei farlo indirettamente attraverso le funzioni.

Perché? Qual è la differenza? Sembra che il risultato sia lo stesso, tranne che invece di avere una riga di codice, ora ho 9 o 10 LOC in più per fare la stessa cosa.

Qualcuno può spiegare perché convertire una variabile privata in una classe in pubblico all'interno della classe piuttosto che renderla pubblica in modo semplice è diversa e più efficiente?

    
posta Kendra Kaye Coffey 13.07.2014 - 00:51
fonte

2 risposte

10

Ci sono alcuni motivi per usare setter e accessor anziché semplicemente rendere pubbliche le variabili.

1. Separazione delle preoccupazioni - I consumatori di una classe non dovrebbero sapere, o addirittura preoccuparsi, se ciò che stanno accedendo è una variabile primitiva o qualcosa di più complesso. Ad esempio, diciamo che ho avuto una lezione di auto, e quella macchina ha una potenza. Puoi ottenere la potenza chiamando il metodo getHorsepower () e puoi impostarla con setHorsepower (int power).

Ora, un consumatore di questa classe non si cura davvero di quello che succede sotto il cofano, solo che c'è un metodo di potenza. Ma cosa succede se, sul backend, impostare la potenza del motore significava cambiare il motore? Quando chiami setHorsepower, troverà un motore che può fornirlo e chiama il metodo privato setEngine (Engine newEngine) per assicurarti che il comportamento dell'auto sia coerente!

2. Manutenibilità del codice : quando si imposta la classe, può essere ragionevole disporre solo di una variabile pubblica, ma si scopre rapidamente che è necessario eseguire il controllo degli errori sulla variabile oppure è necessario apportare una modifica a tale variabile aggiorna un altro oggetto. Se hai fornito la variabile pubblica, dovresti modificare tutte le classi che la usano e poi averle entrambe A) Implementare tutte le funzionalità che ti servono per il controllo degli errori, oppure B) Cambiarle per utilizzare una funzione di accesso. Facendo in modo che utilizzino la funzione di accesso, puoi modificare tutto ciò in un unico posto invece di dover tenere traccia di tutti i luoghi che utilizzano tale variabile.

    
risposta data 13.07.2014 - 00:56
fonte
5

Getter e setter sono anch'essi di design scadente. Sono migliori delle variabili pubbliche perché consentono alla classe di applicare gli invarianti. Prendere in prestito l'esempio di Ampt setHorsepower è migliore di una variabile di potenza pubblica perché la classe di auto può garantire che la potenza non è mai negativa con il setter, ma non può garantire nulla su una variabile pubblica. Mentre quello è meglio di niente, un design migliore avrebbe istanze di macchina in carica della propria potenza. Qualunque codice che manda in giro con lo stato interno dell'auto dovrebbe essere al di fuori della classe dell'auto. Non dovrebbe essersi meravigliato e perso da qualche altra parte.

    
risposta data 13.07.2014 - 02:48
fonte

Leggi altre domande sui tag