Encapsulación de datos Objective-C

Todos los programas de Objective-C se componen de los siguientes dos elementos fundamentales:

  • Program statements (code) - Esta es la parte de un programa que realiza acciones y se llaman métodos.

  • Program data - Los datos son la información del programa que se ve afectada por las funciones del programa.

La encapsulación es un concepto de programación orientada a objetos que une los datos y las funciones que manipulan los datos y que los mantiene a salvo de interferencias externas y uso indebido. La encapsulación de datos llevó al importante concepto de programación orientada a objetos dedata hiding.

Data encapsulation es un mecanismo para agrupar los datos y las funciones que los utilizan, y data abstraction es un mecanismo para exponer solo las interfaces y ocultar los detalles de implementación al usuario.

Objective-C admite las propiedades de encapsulación y ocultación de datos mediante la creación de tipos definidos por el usuario, denominados classes. Por ejemplo

@interface Adder : NSObject {
   NSInteger total;
}

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

@end

La variable total es privada y no podemos acceder desde fuera de la clase. Esto significa que solo pueden acceder a ellos otros miembros de la clase Adder y no cualquier otra parte de su programa. Esta es una forma de lograr la encapsulación.

Los métodos dentro del archivo de interfaz son accesibles y tienen un alcance público.

Hay métodos privados, que se escriben con la ayuda de extensions, que aprenderemos en los próximos capítulos.

Ejemplo de encapsulación de datos

Cualquier programa Objective-C en el que implemente una clase con variables de miembros públicos y privados es un ejemplo de encapsulación y abstracción de datos. Considere el siguiente ejemplo:

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

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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

La clase anterior suma números y devuelve la suma. Los miembros públicosaddNum y getTotal son las interfaces con el mundo exterior y un usuario debe conocerlas para usar la clase. El miembro privadototal es algo que está oculto al mundo exterior, pero es necesario para que la clase funcione correctamente.

Estrategia de diseño

La mayoría de nosotros hemos aprendido a través de una amarga experiencia a hacer que los miembros de la clase sean privados de forma predeterminada a menos que realmente necesitemos exponerlos. Eso es simplemente buenoencapsulation.

Es importante comprender la encapsulación de datos, ya que es una de las características principales de todos los lenguajes de programación orientada a objetos (OOP), incluido Objective-C.