Enkapsulacja danych Objective-C

Wszystkie programy w ramach celu C składają się z następujących dwóch podstawowych elementów -

  • Program statements (code) - To jest część programu, która wykonuje akcje i nazywa się je metodami.

  • Program data - Dane to informacje o programie, na które mają wpływ funkcje programu.

Hermetyzacja to koncepcja programowania zorientowanego obiektowo, która wiąże ze sobą dane i funkcje, które manipulują danymi i która chroni zarówno przed zewnętrznymi zakłóceniami, jak i nadużyciami. Enkapsulacja danych doprowadziła do powstania ważnej koncepcji OOPdata hiding.

Data encapsulation jest mechanizmem łączenia danych i funkcji, które z nich korzystają, oraz data abstraction to mechanizm ujawniania tylko interfejsów i ukrywania szczegółów implementacji przed użytkownikiem.

Objective-C obsługuje właściwości hermetyzacji i ukrywania danych poprzez tworzenie typów zdefiniowanych przez użytkownika, tzw classes. Na przykład -

@interface Adder : NSObject {
   NSInteger total;
}

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

@end

Zmienna total jest prywatna i nie możemy uzyskać do niej dostępu spoza klasy. Oznacza to, że mogą być dostępne tylko dla innych członków klasy Adder, a nie przez żadną inną część twojego programu. Jest to jeden ze sposobów osiągnięcia hermetyzacji.

Metody wewnątrz pliku interfejsu są dostępne i mają zasięg publiczny.

Istnieją metody prywatne, które są napisane przy pomocy extensions, o czym dowiemy się w kolejnych rozdziałach.

Przykład enkapsulacji danych

Każdy program Objective-C, w którym zaimplementowano klasę ze zmiennymi publicznymi i prywatnymi składowymi, jest przykładem enkapsulacji i abstrakcji danych. Rozważmy następujący przykład -

#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;
}

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

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

Powyższa klasa dodaje liczby do siebie i zwraca sumę. Członkowie publiczniaddNum i getTotal to interfejsy do świata zewnętrznego i użytkownik musi je znać, aby korzystać z tej klasy. Członek prywatnytotal jest czymś, co jest ukryte przed światem zewnętrznym, ale jest potrzebne klasie do prawidłowego działania.

Projektowanie strategii

Większość z nas nauczyła się poprzez gorzkie doświadczenie, aby domyślnie uczynić członków klasy prywatnymi, chyba że naprawdę musimy ich ujawniać. Po prostu dobrzeencapsulation.

Ważne jest, aby zrozumieć hermetyzację danych, ponieważ jest to jedna z podstawowych funkcji wszystkich języków programowania obiektowego (OOP), w tym Objective-C.