Objective-C Data Encapsulation

Tutti i programmi Objective-C sono composti dai seguenti due elementi fondamentali:

  • Program statements (code) - Questa è la parte di un programma che esegue le azioni e sono chiamate metodi.

  • Program data - I dati sono le informazioni del programma che sono influenzate dalle funzioni del programma.

L'incapsulamento è un concetto di programmazione orientata agli oggetti che unisce i dati e le funzioni che manipolano i dati e che li protegge da interferenze esterne e usi impropri. L'incapsulamento dei dati ha portato all'importante concetto di OOP didata hiding.

Data encapsulation è un meccanismo per raggruppare i dati e le funzioni che li utilizzano, e data abstraction è un meccanismo per esporre solo le interfacce e nascondere i dettagli di implementazione all'utente.

Objective-C supporta le proprietà di incapsulamento e occultamento dei dati attraverso la creazione di tipi definiti dall'utente, chiamati classes. Ad esempio:

@interface Adder : NSObject {
   NSInteger total;
}

- (id)initWithInitialNumber:(NSInteger)initialNumber;
- (void)addNumber:(NSInteger)newNumber;
- (NSInteger)getTotal;

@end

La variabile totale è privata e non possiamo accedere dall'esterno della classe. Ciò significa che possono essere acceduti solo da altri membri della classe Adder e non da qualsiasi altra parte del programma. Questo è un modo in cui si ottiene l'incapsulamento.

I metodi all'interno del file di interfaccia sono accessibili e sono di ambito pubblico.

Esistono metodi privati, scritti con l'aiuto di extensions, che impareremo nei prossimi capitoli.

Esempio di incapsulamento dei dati

Qualsiasi programma Objective-C in cui si implementa una classe con variabili membri pubbliche e private è un esempio di incapsulamento e astrazione dei dati. Considera il seguente esempio:

#import <Foundation/Foundation.h>

@interface Adder : NSObject {
   NSInteger total;
}

- (id)initWithInitialNumber:(NSInteger)initialNumber;
- (void)addNumber:(NSInteger)newNumber;
- (NSInteger)getTotal;

@end

@implementation Adder
-(id)initWithInitialNumber:(NSInteger)initialNumber {
   total = initialNumber;
   return self;
}

- (void)addNumber:(NSInteger)newNumber {
   total = total + newNumber;
}

- (NSInteger)getTotal {
   return total;
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];        
   Adder *adder = [[Adder alloc]initWithInitialNumber:10];
   [adder addNumber:5];
   [adder addNumber:4];
   
   NSLog(@"The total is %ld",[adder getTotal]);
   [pool drain];
   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

2013-09-22 21:17:30.485 DataEncapsulation[317:303] The total is 19

La classe sopra somma i numeri e restituisce la somma. I membri pubbliciaddNum e getTotal sono le interfacce con il mondo esterno e un utente deve conoscerle per usare la classe. Il membro privatototal è qualcosa che è nascosto al mondo esterno, ma è necessario affinché la classe funzioni correttamente.

Strategia di progettazione

La maggior parte di noi ha imparato attraverso l'amara esperienza a rendere privati ​​i membri della classe per impostazione predefinita, a meno che non sia davvero necessario esporli. È solo un beneencapsulation.

È importante comprendere l'incapsulamento dei dati poiché è una delle caratteristiche principali di tutti i linguaggi di programmazione orientata agli oggetti (OOP), incluso Objective-C.