Conceptos básicos de Programación Orientada a Objetos

Programación Estructurada vs Programación Orientada a Objetos.

Programación Orientada a Objetos

Es un conjunto de técnicas de programación que sirve para desarrollar una aplicación de computadora de forma más cercana a cómo interactuamos los seres humanos con las cosas en la vida real. En otras palabras, esta forma de “organizar o mirar la realidad”, se apega a la premisa de que nos encontramos en un mundo rodeados de objetos y la interacción con éstos nos permite resolver diversos problemas. Por lo que podemos decir que es o se trata, de un paradigma de programación que se basa en la creación de objetos y la interacción con éstos, para el diseño y desarrollo de aplicaciones de computadora en la que los datos y los procedimientos para la manipulación de éstos están estrechamente ligados.   

Objeto

De acuerdo con (Booch et al., 2007, revisado en Díaz G. y Montesano B., S.F.), “un objeto es una entidad tangible que exhibe algún comportamiento bien definido”, y que en ese mismo sentido Díaz y Montesano (S.F.) complementan: “Los objetos son abstracciones que forman parte del problema (…) por ser un ente de la vida real tienen estado y comportamiento, que se toman a partir de la definición de la clase” (p. 36).

Por consiguiente, podríamos afirmar que un objeto es la estructura o entidad abstracta que se crea a partir de la definición de una clase, de tal manera, que ésta permite organizar y relacionar los datos de un programa o problema (atributos) con sus respectivos métodos (conjunto de procedimientos o funciones para la manipulación o interacción con los datos de un objeto).

De las definiciones anteriores podemos apreciar que estas entidades tienen una identidad, un estado y un comportamiento bien definidos; por lo que ahora analizaremos por separado cada uno de estos conceptos.

Identidad

La identidad de un objeto según Quiroz J., et al. (2019) es el conjunto de características que permiten diferenciar un objeto de otro. En palabras simples, es el nombre o identificador que le da el programador a un objeto para identificarlo frente a otros elementos de su misma u otras clases. Por ejemplo: alumno1, alumno2, carro1, cliente1, etc.

Atributos

Los atributos son el conjunto de rasgos o características que posee un objeto, que de cierta manera o hasta cierto punto se puede decir que lo definen. De nuevo, en palabras simples, es lo que tiene o posee un objeto que lo hace ser lo que es. Por ejemplo, si queremos modelar a un objeto llamado estudiante1, las propiedades, rasgos o características que son relevantes para el desarrollo de una aplicación, nos indicarían los atributos de este objeto, como lo pueden ser: el nombre completo, número de cuenta, promedio de secundaria, promedio de bachillerato, etc.    

Estado

El estado de un objeto es el valor o los valores que toman los atributos de un objeto en un determinado momento. Debido a que los valores en los atributos de un objeto pueden cambiar a lo largo de la ejecución de un programa, el estado se refiere a esos valores que posee un objeto en un cierto momento o tiempo de ejecución.

Comportamiento

El comportamiento de una clase de objetos está determinado por el conjunto de acciones asociadas (métodos) que, en un determinado momento, cualquier objeto que se instancie a partir de dicha clase podría ejecutar; se refiere a todas esas funciones o procedimientos que relacionan los datos de un objeto (atributos) con las acciones que se podrían utilizar para interactuar con éstos. Por ejemplo, siguiendo el caso del objeto estudiante1, su comportamiento estará definido por las acciones que se asocian con cualquier estudiante (clase Estudiante), y que, en consecuencia, podría llegar a ejecutar o hacer uso el objeto estudiante1, como lo puede ser la acción de inscribirse a un curso, darse de baja, hacer cambio de grupo, imprimir en pantalla el nombre completo del alumno, etc. 

Ilustración 1. Ejemplo de la declaración de la clase Estudiante.

Ilustración 2. Pilares de la Programación Orientada a Objetos.

El paradigma de la Programación Orientada a Objetos se basa en cuatro principales conceptos, razón por la cual se les conoce como los pilares de la POO, estos son:

Abstracción

Según Díaz y Montesano (S.F.) la abstracción es “la capacidad humana de identificar los objetos y clases de objetos que conforman el sistema” (p. 24). La abstracción entonces es la fase en la que el programador analiza un problema y construye una propuesta de solución basada en los datos proporcionados y la finalidad del sistema en sí. En el diseño de una aplicación orientada a objetos, la propuesta del programador parte precisamente del modelado de los objetos, delimitando de alguna manera, todos los aspectos o funciones que son relevantes para la solución del problema inicial.

De esta forma, se puede plasmar en una aplicación todas las características esenciales y acciones de un objeto, al mismo tiempo que no se considera o se deja de lado todos aquellos aspectos o datos que no contribuyen a la resolución del problema. Por ejemplo, en el caso del estudiante1, no tiene ningún sentido definir un atributo para almacenar el color del cabello de un alumno, si este dato no nos va a contribuir en algo a la solución del problema de partida.

Diversos expertos en programación nos indican que para que realices una buena abstracción debes de preguntarte: ¿qué objetos o entes están involucrados en el problema? ¿Qué características comunes poseen los objetos antes mencionados? ¿Qué acciones pueden o deben de realizar dichos objetos? Con las respuestas a estas preguntas, tendrías la definición de tu clase de objetos y habrás completado la fase de abstracción. 

Encapsulamiento

El encapsulamiento en la POO se refiere a la facultad que se tiene para ocultar el estado de un objeto (valores de sus atributos), de tal manera que solo sus métodos (operaciones o acciones definidas para éste en la clase de objetos) puedan extraer o modificar los valores de sus atributos (cambiar su estado).

Ilustración 3. Representación gráfica de la instanciación de un objeto con atributos públicos

Básicamente, lo que ocurre es que cuando se instancia un objeto a partir de una clase previamente definida, se crea una estructura similar a ésta, que bien puede ser representada de forma gráfica con una tabla (ilustración 3). Sin embargo, cuando se realiza el encapsulamiento de un objeto, esta estructura se asemeja más a la de un círculo (ilustración 4), ya que el estado del objeto (valores de sus atributos) se empaqueta formando un núcleo y solo los métodos declarados en la clase de objetos pueden cambiar su estado (acceder o modificar el valor de sus atributos). Típicamente esto se implementa en Java con el uso de los modificadores de estado (public, private o protected) que limitan el acceso a la información de los objetos.

Ilustración 4. Representación gráfica de un objeto con encapsulamiento.

Polimorfismo 

El polimorfismo en la POO se refiere a la cualidad que poseen los objetos para modificar de cierta manera su comportamiento en función de un contexto dado. Se puede realizar en dos niveles o sentidos: el primero ocurre cuando se sobrecarga una función, por ejemplo, cuando se manda llamar al constructor de un objeto para que éste se construya a partir de la cantidad y tipo de datos que se tienen para su materialización, en este caso se puede tener más de un método constructor con el mismo nombre pero diferente cantidad de parámetros, lo que le ayudará al programa a identificar qué método deberá ejecutarse de todos los que tienen el mismo nombre, tan sólo guiándose por la cantidad de parámetros que se tenga en la llamada al constructor; el segundo nivel se da cuando existen relaciones de herencia entre dos o más clases, y es que esto faculta a los objetos de una subclase o clase hija a comportarse (adquirir o usar métodos de otra clase) como si fuese una instancia de una superclase o clase padre, sin que ello implique la pérdida de la identidad del objeto. 

Herencia

La herencia es la facultad que se tiene en la POO para estructurar de forma jerárquica a las clases de un programa. Cuando se realiza dicha organización e implementación, se definen las relaciones de herencia (lo que se puede compartir) entre una superclase o clase padre y una(s) subclase(s) hija(s). 

En términos de la programación de sistemas de cómputo, se dice que esta técnica permite reutilizar, extender o especializar el código de una superclase, en o por, las subclases o clases hijas.  Autores como Díaz y Montesano (S.F.) nos señalan que dependiendo de lo que se hereda o se comparte entre clases, se puede hablar de una herencia simple (una subclase hereda de una superclase) o de una herencia múltiple (una subclase hereda de varias superclases), que dicho sea de paso, esta última no está soportada en Java.

Actividad H5P

Instrucción para el alumno: ¡Es el momento de revisar lo aprendido!