¿Qué es la Programación Orientada a Objetos POO?

La programación orientada a objetos es una metodología de desarrollo de software, donde las entidades de una aplicación se manejan como si fueran objetos o personas reales, esto es, tienen sus propiedades y funciones propias.

Programación orientada a objetos
Programación orientada a objetos

En este artículo vamos a hacer una breve reseña de sus principales características, considerando ejemplos con la nomenclatura POO de Java.

Haciendo una analogía con el mundo real, si tomáramos un objeto como una silla, ésta tiene unas propiedades propias como su estilo, su color, con o sin ruedas, etc. Y por otro lado, tiene unas funciones o métodos, que le permiten por ejemplo a una silla moverse de un lugar a otro o  plegarse en caso de que pueda hacerlo, etc.

Así pues en la programación orientada a objetos, las propiedades de los objetos son variables que determinan las características de un objeto, y lo que hace ese objeto son sus funciones.

De esta manera, en la programación orientada a objetos, se encapsulan de manera lógica entidades independientes, con sus propiedades y sus métodos.  Lo interesante es que se pueden crear clases «hijas» que heredan las propiedades de sus clases padres, tanto en propiedades como en métodos, y a su vez tener sus propias características y funciones.

Esta herencia en la programación orientada a objetos, es la que permite la creación de bibliotecas de clases,  donde se definen claramente los métodos con los que se puede interactuar con dicho objeto, tanto para fijar u obtener valores a sus propiedades, como también para acceder a sus funciones.

 

Clases en la Programación Orientada a Objetos

Una clase es una especie de plantilla o molde para un objeto, donde se definen sus variables (propiedades) y sus métodos o funciones.

Si por ejemplo vamos a crear una clase llamada «SeresVivos», tendría unas propiedades como tipo  y color, que se definirían en la clase como:

public class SeresVivos {
   String tipo;
   String color;
}

Las propiedades o variables de la clase por regla son privadas, es decir que sólo se pueden manipular directamente desde el interior de la clase, es decir, darles u obtener sus valores. Las variables incluso pueden hacer referencia a otras clases.

Generalmente la asignación de valores a las variables o propiedades se realiza por medio de métodos que reciben los valores, los validan, los pueden asignar a las variables internas e incluso pueden realizar más acciones internamente con el cambio de una propiedad.

public class SeresVivos { 
 String tipo; 
 String color; 
 
 public void fijarColor(String colorser){
    this.color=colorser;
  }

}

La palabra reservada this hace referencia a la misma clase para no tener que volver a nombrarla.

Así mismo para obtener el valor de una variable, no se realiza consultando directamente sobre ella, sino sobre su valor devuelto por una función.

public class SeresVivos { 
 String tipo; 
 String color; 
 
 public String ObtenerColor(){
    return this.color;
  }

}

Las funciones o métodos se definen dentro de la clase, tanto para actuar sobre sus propiedades, realizar ciertas acciones sobre datos internos o sobre otros datos externos, como por ejemplo de una base de datos.

Por ejemplo en la clase  «SeresVivos», algunas otras funciones se definirían de la siguiente forma:

public class SeresVivos {
   String tipo;
   String color;

   void beber() {
   }

   void comer() {
   }

   void correr() {
   }
}

En una clase, se usa una función llamada «constructora», en la que se asignan valores a las variables del objeto, ya sea internamente por medio de una consulta a una base de datos, o con valores predefinidos, o por medio de los valores que se entregan por parámetros en la función constructora. La función constructora tiene el mismo nombre de la clase, y se llama automáticamente durante la creación de un objeto de dicha clase.

En el ejemplo de la clase SeresVivos, podemos tener una clase constructora para recibir los datos básicos del ser vivo:

public class SeresVivos { 
 String tipo; 
 String color;

 public SeresVivos(String tiposer, int colorser ) { 
   this.tipo = tiposer;
   this.color = colorser;  
 } 

}

 

Herencia de Clases en Programación Orientada a Objetos

Como dijimos anteriormente, se pueden crear clases hijas que heredan variables y funciones de su clase padre. Las clases hijas entonces poseen tanto las características como las funciones de su clase padre como las suyas propias.

Considerando el ejemplo de la clase «SeresVivos», una clase hija llamada «Perros» se definiría con la palabra clave extends en Java, así como se muestra a continuación:

public class Perros extends SeresVivos{
   String Nombre;
   String raza;
   int edad;
   String entrenado;

   public Perros(String nombreperro, String razaperro, int edadperro){
       this.Nombre = nombreperro;
       this.raza = razaperro;
       this.edad = edadperro;
   }

   public fijarEntrenado(String entrenadoperro){
       this.entrenado = entrenadoperro;
   }
   
}

 

Donde la clase «Perros», hereda las propiedades y métodos de la clase padre «SeresVivos», y por otro lado, tiene sus propias propiedades, como son el nombre, la raza, la edad y si está entrenado no. Además su propia función constructora para asignar algunas propiedades y otras funciones como fijarEntrenado().

En todos los lenguajes de programación orientada a objetos, como Java, C++, PHP Laravel, etc., la herencia permite el uso de sus bibliotecas de clases, para crear clases hijas propias, lo que facilita la programación al reusar el código, aprender de mejores prácticas de desarrollo de software de otros programadores, y adicionalmente crear bibliotecas de clases propias para ser reusadas en futuros proyectos.

 

Objetos en Programación Orientada a Objetos

Un objeto es una instancia de una clase, haciendo una analogía con el mundo real, es como si tuviéramos un plano para la construcción de muchas viviendas, donde el plano es la clase, mientras que una de esas casas ya construida es un objeto de esa clase.

Este objeto entonces se inicializa en el momento de su creación con la función constructora, que es en donde se realiza la asignación de sus propiedades, ya sea a partir de unos datos internos propios, o desde valores que se le entregan en su creación.

Una vez este objeto ya está creado, entonces se pueden empezar a usar sus funciones y métodos, para realizar acciones sobre sus propiedades.

Siguiendo con el ejemplo de la clase «Perros», para crear un objeto de esa clase lo haríamos de la siguiente forma en Java:

public static void main(String []args) {
      
      Perros miperro = new Perros( "Timoteo","Pastor Alemán",2);
  }

De esta forma creamos un objeto llamado miperro que se inicializa con el nombre Timoteo, raza Pastor alemán y la edad en 2.

 

Asignación de valores a las propiedades de los objetos

La asignación de valores a las variables o propiedades de los objetos, sólo se realiza por medio de funciones que permiten actuar sobre ellas.

Esta asignación se puede realizar desde variables, arreglos de variables, tablas de una base de datos, o de otros objetos de la misma clase, valores booleanos del tipo «si» o «no» (verdadero o falso).

Si para el objeto «Perro» queremos cambiar su edad  deberíamos tener una función como:

public fijarEdad(int edadperro){
       this.edad = edadperro;
}

public static void main(String []args) 
{ 
    Perros miperro = new Perros( "Timoteo","Pastor Alemán",2); 
    
    miperro.fijarEdad(3);

}

Entonces con esa función fijarEdad(), se fija la variable edad del objeto en 3 para el ejemplo.

 

Obtención de los valores de las propiedades de los objetos

Para obtener los valores de las propiedades de los objetos, usamos funciones que permiten obtener valores de sus propiedades.

Se pueden devolver valores únicos de variables, arreglos de datos, tablas de bases de datos, o simplemente resultados booleanos del tipo «si» o «no».

Siguiendo con el ejemplo, si queremos obtener la edad en la clase Perro, entonces creamos una función ObtenerEdad() que devuelve el entero de la edad:

public int ObtenerEdad(){
       return this.edad;
}

public static void main(String []args) 
{ 
   int edadperro;

   Perros miperro = new Perros( "Timoteo","Pastor Alemán",2); 

   edadperro = miperro.ObtenerEdad();

}

Así la edad se retorna con la función ObtenerEdad() a una variable de tipo entero llamada edadperro.

 

Llamado de las funciones o métodos del objeto

Adicional a las funciones para asignación u obtención de propiedades, el objeto puede tener otras funciones que pueden ejecutar algunas acciones que pueden o no devolver datos.

Así entonces cualquier función se llamada haciendo referencia al objeto, y en seguida a su función, con o sin argumentos, dependiendo de su definición. La sintaxis de llamado varía de un lenguaje a otro, en Java se denota primero el objeto, seguido de un punto (.) y luego la función.

En el ejemplo que hemos estado trabajando, una función se llama así:

miperro.comer();

Cuando son funciones que no retornan valores se llaman directamente como aparece en la linea, pero cuando son funciones que devuelven valores, éstas funciones se asignan a otras variables, o se retornan desde  funciones:

String NombrePerro;
NombrePerro = miperro.ObtenerNombre();

 

Polimorfismo en POO

El polimorfismo es una característica de la programación orientada a objetos, en la que se permite recibir referencias de objetos de su misma clase, como también de objetos procedentes de clases heredadas.

Más adelante en otro artículo hablaremos en más profundidad sobre el polimorfismo.

 

Como conclusión, la programación orientada a objetos nos ofrece una serie de ventajas para el reuso de código, el manejo de los objetos de una manera más cercana a nuestra realidad, el uso de grandes bibliotecas de clases, entre otras ventajas, que nos disminuyen ostensiblemente el tiempo de desarrollo, y el entendimiento del código de una aplicación de software.

Este artículo hace parte del sistema de divulgación de conocimiento de ITSoftware SAS.

Si te gustó, por favor no olvides compartirlo en las redes sociales. 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.