Domanda

Ho una classe con un sacco di built-in tipo di membri con accesso in lettura/scrittura.Devo rendere pubblici i membri e fornire metodi get/set per ognuno di loro?Come circa le strutture?

È stato utile?

Soluzione

Se ci sono è necessario conservare, allora sì. In caso contrario, non si preoccupano.

Altri suggerimenti

La vera ragione per le funzioni di accesso (getter) e modificatori (setter) è quello di fornire da soli con un ulteriore livello di riferimento indiretto.

Questo ulteriore livello di riferimento indiretto consente di fornire una vista unica lettura della variabile a un'interfaccia pubblica, pur non permettendo al membro di dati da modificare. Si potrebbe ancora utilizzare un setter privato o protetto.

Setter ti permettono di fare l'errore speciale di controllo, validazione e correzioni quando un valore è impostato. Per esempio setDirectory (std :: const string & strPath), si potrebbe fare che non v'è una barra di terminazione se l'utente non ha specificato uno. Questo assicura che il vostro stato di classe sarà sempre valida.

Getters possono anche proteggere i vostri membri di averli esposti per permettere puntatori a loro. Non permettendo puntatori a loro dal di fuori, è possibile garantire che se l'oggetto va fuori del campo di applicazione non porterà ad un crash.

L'ulteriore livello di indirezione per getter / setter consentono inoltre di essere in grado di cambiare il membro di dati che incapsulano.

Con un getter è anche possibile ottenere diversi punti di vista dei dati, esempio:. GetMinutes, quando il membro di dati è effettivamente memorizzata in secondi

Non è questo il motivo per usarli, ma un piacevole effetto collaterale di utilizzare getter e setter è che è possibile impostare un punto di interruzione all'interno del vostro modificatore per esempio per vedere esattamente quando è cambiato.

Se li si dovrebbe usare o non è una chiamata in giudizio in base alle proprie esigenze. Se si dispone di così tanti membri che si tratta di un dolore enorme per fornire getter e impostazioni che si potrebbe prendere in considerazione la memorizzazione dei membri di dati in una struttura e l'utilizzo che struct all'interno della vostra classe, invece. Si potrebbe anche fornire getter / setter per un oggetto per tutta la struct in una sola volta.

In primo luogo, se la classe ha un sacco di mamebers dati probabilmente non è ben progettato. Potrebbe essere necessario prendere in considerazione dividendolo in più classi o la memorizzazione dei dati in strutture come le mappe.

Per quanto riguarda la fornitura di accesso, la domanda è: sarà mai voglia di modificare l'accesso, possibilmente prevenzione. Se la risposta è sì, allora avete bisogno di funzioni di accesso. D'altra parte, se la classe è in realtà solo un sacchetto di bit, con nessun comportamento, poi ne fanno una struttura.

Si dovrebbe usare membri dati pubblici solo

  • in strutture, che non si espongono al codice del client (ad esempio legare in stile funtori.) - è inutile proteggere le strutture che nessuno al di fuori potrà mai ottenere
  • se i loro tipi incapsulano la logica di insieme / inducendole (ad es. Se si crea un'ObservableAttribute classe)
  • se sono const membri in una struttura immutabile (non si può fare molto, tranne per leggere loro se sono immutabili)

Se si crea un membro di dati pubblici, bisogna essere sicuri che il suo valore è completamente ortogonale con gli altri membri della classe. Ad esempio., Si disattiva possibilità future di

  • osservando i cambiamenti al membro
  • rendendo il membro riprodurre qualsiasi parte della classe invariante
  • disabilitare l'accesso al membro
  • cambiarne l'implementazione dell'elemento (es. Calcolata vs vs cache memorizzato) se le prestazioni bisogno

Utilizzando i metodi get/set per privati/dati protetti membri è un cattivo design.

Essa provoca il codice client per essere dipendente i dettagli di implementazione della classe.

Cambiamenti nella vostra classe provoca cambiamenti nel codice del client.

Tuttavia i metodi get/set per il pubblico, i membri possono essere utilizzati.Ma è sempre bene evitare di loro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top