Encapsulamiento

Publicado en Conceptos el 9 de December, 2009 por Lek.

Hoy toca otro post de teoría de la programación para hablar de uno de esos conceptos que muchas veces es difícil llevar a la práctica.

En algunos paradigmas de programación (como la programación orientada a objetos) se nos dice que desde fuera de una clase sólo necesitamos saber qué se hace, no el cómo. Si la clase se encarga de interaccionar con una base de datos no necesita saber cuál es la base de datos ya que de eso se encargaría el driver (lo cual sería cierto si el estándar SQL fuera más… estándar… pero eso es otro tema). Y al resto de clases del proyecto no les importa tampoco cómo realiza esa interacción, sino que sólo deben preocuparse de que tal método devuelve los datos de la tabla cual.

¿Cómo se hace esto? Definiendo muy bien la visibilidad de la clase. Esto es, qué métodos se van a llamar desde el resto de clases (métodos públicos), cuáles están restringidos a clases “amigas” (del mismo paquete o que hereden de la nuestra, son los métodos protegidos) y cuáles no son accesibles en absoluto fuera de nuestra clase (métodos privados).

Por definición, es recomendable que todas las variables sean definidas como privadas, de forma que la única manera de manipularlas sea a través de los métodos públicos definidos por la clase y que sean éstos los que se encarguen de hacer todas las comprobaciones que sean necesarias.

Imaginemos la siguiente clase muy básica:

public class Persona {

  private String nombre;
  private int edad;

  public Persona () {
    inicializar ();
  }

  public void setNombre (String nombre2) {
    nombre = nombre2;
  }

  public void setEdad (int edad2) {
    if (edad2 > 0) {
      edad = edad2;
    }
  }

  public boolean validaVariables () {
    return edad > 0 && ! "".equals(nombre);
  }

  private void inicializar () {
    nombre = "";
    edad = 0;
  }
}

En este caso, lo que vemos desde fuera es que para la clase Persona podemos asignar una variable nombre y una variable edad. Podría haber más, pero no nos interesan puesto que no podemos interaccionar con ellas.

Además disponemos de una función para validar que los datos son correctos, pero nunca sabremos desde otra clase que existe un método inicializar.

4 comentarios

  1. Celebro tu post de vuelta, pero para mi gusto es un poco superficial.

    #  Fran 10 de December, 2009

  2. La verdad es que no me ha terminado de dejar satisfecho, aunque mejoré bastante el boceto que tenía. Soy un mal teórico :-/

    #  Lek 10 de December, 2009

  3. Me gusto el post, quizas no es todo lo profundo que deberia, pero por lo menos es claro en lo que es el concepto basico de Encapsulamiento.

    #  darkested 13 de December, 2009

  4. Es una pena que ni C++ ni Java incorporen el encapsulamiento por defecto (como si lo hace Eiffel, por ejemplo).

    #  kurt 1 de January, 2010

Escribe un comentario