Cosa definisce correttamente un incapsulamento?

5

Trovo un po 'confuso il concetto di incapsulamento. Finora ho letto che i membri della classe dovrebbero essere privati e qualsiasi accesso ai membri privati deve avvenire attraverso metodi getter e setter, che sono pubblici. Queste sono le sole proprietà che definiscono una classe correttamente incapsulata?

Se sì, che dire dei membri della classe protetti? Possiamo accedere a membri protetti nello stesso pacchetto tramite un riferimento a un oggetto: le classi contenenti membri protetti sono incapsulate in modo errato?

Fornisci chiarimenti.

    
posta trapaank 19.10.2011 - 19:20
fonte

2 risposte

6

L'incapsulamento definisce correttamente l'accesso ai membri di un oggetto e protegge lo stato interno dell'oggetto.

La prima parte, che definisce l'accesso, viene eseguita tramite gli specificatori di accesso ( public , private , protected e così via). In genere, una classe ben incapsulata limita l'accesso il più possibile. Se solo la classe corrente (o un'istanza di quella classe) ha bisogno di accedervi, renderla privata. Se anche le sottoclassi hanno bisogno di accedervi, allora è un membro protetto. Nota che questo vale anche per variabili e metodi.

La seconda parte è di proteggere lo stato interno dell'oggetto da non essere mai valido. Questo è uno dei fattori trainanti dei metodi di accesso e mutatore. È possibile utilizzare questi metodi per garantire sempre la validità dello stato dell'oggetto. Ad esempio, se si dispone di una variabile membro che può contenere solo valori specifici, è possibile convalidare prima di modificare lo stato dell'oggetto se si richiede l'uso di metodi mutator, ma non con una variabile pubblica.

    
risposta data 19.10.2011 - 19:31
fonte
2

A seconda di chi sta insegnando quel concetto, l'incapsulamento può avere così tante definizioni che è essenzialmente una parola d'ordine da definire con decine di altre parole d'ordine, a volte anche andando alla ridicola affermazione come la tua "" Ho letto che i membri della classe dovrebbero essere privati e qualsiasi accesso a questi membri privati deve avvenire attraverso metodi getter e setter che sono pubblici ".

Il bisogno di incapsulamento si verifica tipicamente quando rappresenti un oggetto aggregando un numero di componenti i cui valori sono reciprocamente correlati, e quindi non possono essere modificati l'un l'altro in modo indipendente, senza rendere l'oggetto non valido o senza tracce o senza senso o senza pantalone o come si desidera chiamarlo. In tal caso tu -an solo tu- assumi la responsabilità di gestire quei sottovalori, rendendo questi componenti nascosti (o inaccessibili ... è molto una questione su come funziona la lingua), e fornendo all'aggregato metodi pubblici che modificano i valori interiori correttamente.

operativa -Editazione- Tutto il resto è solo "costruzione eccessiva del purismo" che non implementa realmente nulla, a parte ... soddisfare i maestri zeloti dell'OOP.

operativa -Editazione- PS: Devo scusarmi con tutti gli insegnanti OOP, ma 30 anni di esperienza nel settore mi fanno davvero meravigliare dei danni di un certo modo "acritico" di insegnare " regole " piuttosto che concetti e relazioni tra di loro! Puoi downvotare, se vuoi, ma mi piacerebbe vedere una dimostrazione pratica che ho sbagliato! Il mondo è pieno di libri (davvero pessimi) che insegnano cose cattive come

class A
{
private:
   int x;
public:
   void set_x(int x_) { x=x_; }
   int get_x() const { return x; }
};

Questo non ha incapsulato nulla, poiché ti consente di fare tutto ciò che vuoi con x .

    
risposta data 19.10.2011 - 19:45
fonte

Leggi altre domande sui tag