¿Qué es la POO?
Según Lopez, M. (2023, 19 diciembre), "es un paradigma orientado a objetos que organiza el código en entidades llamadas "objetos", que pueden contener datos en forma de atributos y funciones" (p. 1).
Ahora bien, puede surgir la duda de ¿qué es un paradigma? son enfoques que guían la estructuración y el diseño de los programas, es decir, como un "manual" . Van más allá de simples reglas, representando conjuntos de conceptos y técnicas que definen cómo se abordan los problemas. Además de la POO, existen otros paradigmas como la programación estructurada, la programación funcional y la programación lógica, cada uno con sus propias características y metodologías.
¿Para qué sirve?
Para visualizarlo de forma más simple, recordemos los tipos primitivos en las variables
int, double, char, string, bool, etc. Estos nos permiten crear variables de tipos primitivos ya disponibles en el lenguaje. Sin embargo, la POO nos permite crear nuestros propios "tipos de datos", donde creamos objetos según las necesidades de la funcionalidad del programa. Podremos reutilizar esos tipos cuantas veces sean necesarios en nuestro programa, lo que reduce la redundancia de código, permite la
escalabilidad y facilidad de comprensión del código.
Principios importantes de la POO
Visibilidad
Se refiere a los niveles de acceso que se asignan a los miembros de una clase. Los principales niveles de visibilidad son:
- Private: para atributos y métodos que son visibles únicamente para miembros de la clase.
- Protected: para atributos y métodos que son visibles para miembros de la clase y clases derivadas.
- Public: para atributos y métodos de libre acceso fuera de la clase.
Encapsulamiento
Consiste en controlar el acceso a los miembros de una clase. Esto significa que los atributos de la clase solo pueden ser accedidos mediante los métodos públicos de esa misma clase. Los niveles de acceso se definen mediante los niveles de visibilidad private, public y protected. Una forma común de controlar estos accesos es a través de los métodos gets (accesores) y sets (modificadores).
AbstracciónEste principio permite distinguir entre lo relevante e irrelevante al crear los miembros de una clase, es decir, un objeto puede tener muchas características, pero es importante abstraer únicamente aquellas que sean de importancia en la solución que se este desarrollando.
Ejemplo: se desea guardar la información de un estudiante
Un estudiante tiene color de cabello, de piel, peso, altura, etc. Pero esta información no es relevante al proporcionar datos de un estudiante. Quizás si se necesitara guardar los datos de un paciente, el peso, la altura, etc., serían relevantes. Es aquí donde el principio de abstracción se convierte en algo esencial.
Clases en POO
Las clases permiten crear "moldes" para los objetos, en los cuales se definen las características relevantes (atributos) al problema a resolver y las funciones (tareas que puede realizar el objeto). En la imagen anterior, se muestran diversos objetos, cada uno con sus propios atributos. Sin embargo, al crear una clase y asignar sus atributos, es necesario seleccionar solo aquellos relevantes para el propósito del objeto.
Respecto a las funciones que se le asignan al objeto en la clase, puede resultar un concepto abstracto al inicio de adentrarse en el mundo de la POO. Para comprenderlo mejor, veamos algunos ejemplos concretos con los objetos de la imagen:
- Lápiz: Escribir y borrar.
- Cámara: Tomar fotos.
- Laptop: Programar, estudiar, trabajar, etc.
- Libro: Enseñar.
- Empleado: Realizar tareas según su puesto de trabajo.
- Bus: Trasladar personas.
Es evidente que cualquier entidad del mundo real puede ser representada como un objeto en la programación orientada a objetos. Además, es importante tener en cuenta que no todos los objetos necesariamente tienen funcionalidades asociadas. En algunos casos, lo relevante son únicamente sus atributos, mientras que en otros, lo crucial son sus funcionalidades específicas.
Tomemos como ejemplo un objeto calculadora. En este caso, las funcionalidades de la calculadora, como sumar, restar, multiplicar y dividir, son más importantes que sus atributos físicos como el color o el tamaño. Esto ilustra cómo en ciertos objetos, las funcionalidades definidas en la clase pueden ser más cruciales que sus atributos, ya que son las tareas que el objeto puede realizar lo que realmente lo define y diferencia.
¿Cómo está conformada una clase?
Dado lo anterior, los métodos "básicos" de una clase son fundamentales para administrar los objetos creados a partir de ella. Estos métodos tienen una estructura estándar que se utiliza en cualquier clase que se desee crear. A continuación, una explicación detallada de estos:
Constructor
Es el encargado de construir el objeto con los atributos y métodos de la clase y siempre se le otorga el mismo nombre de la clase. Existen diferentes tipos de constructor, es decir, diferentes formas de crear los objetos que derivan de la clase.
Constructor por defecto:
- No recibe parámetros
- Es generado automáticamente si no se define ningún otro constructor en la clase.
- Inicializa los atributos de la clase con valores predeterminados (como se inicializan las variables cuando no sabemos su valor aún).
Estructura del constructor por defecto
Constructor parametrizado:- Se utiliza para crear un objeto con valores que se envían como parámetros. Estos valores se utilizan para inicializar los atributos de la clase con valores específicos al momento de crear una instancia del objeto.
- En algunas situaciones, es necesario inicializar algunos atributos por defecto y otros con valores enviados por parámetro, mientras que en otras, todos los atributos se inicializan con parámetros.
- Es importante mencionar que los parámetros de los constructores deben ser del mismo tipo que los atributos que se inicializarán con esos valores.
Estructura del constructor por defecto
Se utiliza "this" para diferenciar entre el atributo de la clase y el parámetro del constructor o método, especialmente cuando tienen el mismo nombre. Esto es importante porque si no especificamos cuál es el atributo de la clase utilizando "this", podrían ocurrir resultados inesperados, como asignar el valor del parámetro al atributo en lugar de al revés, lo cual podría generar errores lógicos en el programa.
Una forma más clara y común es el estilo de inicialización de miembros en el constructor. Esto se logra al definir los atributos de la clase y asignarles valores dentro de la lista de inicialización del constructor, en lugar de hacerlo dentro del cuerpo del constructor.
Constructor copia:
Este constructor se utiliza para inicializar un objeto a partir de otro objeto del mismo tipo. Su función es copiar los valores de los atributos de un objeto existente al crear una nueva instancia.
Estructura del constructor copia
Destructor
Su propósito es liberar la memoria utilizada por el objeto cuando ya no se necesita. No en todos los lenguajes se utiliza, pero en C++ sí. Al igual que el constructor debe tener el nombre de la clase, el destructor no recibe parámetros y va precedido por ~ . A continuación, se muestra su estructura:
Este método será relevante más adelante cuando veamos objetos de memoria dinámica. Por ahora con saber su utilidad es suficiente.
Modificadores
Son los métodos que nos permiten modificar el valor actual de un atributo del objeto, en el que se envía como parámetro el nuevo valor y se le asigna al valor actual del atributo. Este es de tipo void ya que su único propósito es realizar la modificación no debe retornar nada. Este método es conocido como set.
Estructura del set
El tipo del parámetro debe ser equivalente al atributo a modificar.
Ejemplo de uso:
Si el objeto Empleado creado tenía una edad de 22 años y cumplió hoy esa edad, pasa a ser 23. Este sería un ejemplo de uso de los modificadores. La estructura sería la misma para modificar el nombre, etc. Solo cambiará el tipo del parámetro y el atributo a modificar.
Accesores
son métodos en una clase que se utilizan para acceder a los atributos privados de la clase desde fuera de la misma. Ya que estos son creados con "visibilidad" pública. Son conocidos como get y su tipo depende del tipo del atributo que se desea acceder.
Estructura del get
Estructura básica de una clase en C++
Se utiliza la palabra reservada "class" seguida del nombre que se le dará a la clase, y se definen los atributos y métodos dentro de la visibilidad correspondiente: private, public o protected. La forma básica es:
Ejemplos de clases en C++
- Clase Estudiante en la que es relevante el nombre, id, correo y edad. Se hará únicamente el set y get de un atributo para mostrarlo como ejemplo. Es importante comprender que los modificadores y accesores se realizan solo cuando se necesitan, y el destructor por ahora se usará solo para mostrar su estructura. Además se incluye un método que muestra todos los atributos del estudiante.
2. Clase Calculadora, es una clase donde solo interesa que se reciban parámetros en distintos métodos para realizar operaciones básicas de matemática.
¿Cómo instanciar objetos de las clases?
Una vez se haya comprendido los principios básicos de la POO, las clases y sus partes, la instanciación de objetos se vuelve más comprensible y sencilla de manejar. Es como crear variables con tipos primitivos, pero en lugar de eso, se crean objetos utilizando constructores, ya sea el constructor por defecto, constructor parametrizado o constructor de copia, según sea necesario.
Objetos automáticos
Son objetos que se crean en el "stack" (pila) de memoria durante la ejecución de un programa. Su ciclo de vida está determinado por el bloque de código en el que fueron declarados, es decir, una vez salen de las llaves {} del bloque donde se crearon, automáticamente se destruyen.
Estructura para crear el objeto automático con el constructor por defecto
¿Cómo usar los métodos del objeto automático?
Podemos acceder a las propiedades públicas del objeto mediante el operador punto (.)
Ejemplo 1:
Si se usa el método "toString" de la clase Estudiante anterior para mostrar los valores por defecto de los atributos de este objeto, se realizaría de la siguiente manera:
Bastaría con colocar el nombre del objeto anteriormente creado, seguido del operador punto y seleccionando el método que se desea invocar. El objeto es quien permite el acceso a estos métodos dentro de la clase. En caso de que el método recibiera parámetros, estos deberían enviarse al igual que la lógica de las funciones.
Ejemplo 2:
Para instanciar un objeto de la Calculadora donde no tenemos constructores, ya que no se necesitaban atributos, se hace de la misma manera, ya que el objeto se construye por defecto al no indicar otro constructor en específico.
Observa que los métodos de la clase Calculadora sí esperaban parámetros, por lo que estos se envían al método, accediéndolo mediante la instancia "calc".
Excelente post, muy útil, tanto para personas que recién van a aprender sobre este tema, como para estudiantes más avanzados que necesiten un repaso. En lo personal, Karla fue mi tutora en la universidad y la recomiendo muchísimo, está muy bien capacitada para enseñar y explicar con ejemplos creativos, además de ofrecer mucho de su tiempo a los estudiantes para resolver dudas.
ResponderEliminarKarla te agradezco por este material, estudié programación con anterioridad y siempre es complicado encontrar un material tan completo. Creo que esto va ser de ayuda para todos los que esten iniciando y tamvién para todas las personas que siempre queremos un repaso comoleto y acertado.
ResponderEliminarInteresante Información, es de mucha utilidad aprender bien estos conceptos desde un principio ya que en un futuro facilitara la comprensión de otros principios y conceptos de programación. Haber llevado tutorías con Quirós me ayudo mucho a entender los tipos de relaciones en la POO y sus principios, así como la implementación y manejo de listas enlazadas, matrices y vectores dinámicos en C++, que a día de hoy me ha seguido siendo de mucha utilidad lo aprendido.
ResponderEliminarMuy util todos los recursos que brinda Karla, es bastante sencillo aprender mediante este blog. 100% recomendado, Karla hizo que mi paso por los cursos de fundamentos de informatica y progra I hayan sido mas amenos.
ResponderEliminarQue útil es encontrar blogs que tengan justo la información que uno necesita, desde como se explica el contenido hasta los ejemplos que aclaran y agregan mucho, lo cual facilita el aprendizaje y motiva a seguir estudiando programación
ResponderEliminar