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.