Aprendiendo a programar II

La Programación Orientada a Objetos (POO) es un tipo de programación que requiere saber abstraer propiedades de un elemento para facilitar su programación. Voy a ver si lo explico, aunque de forma un poco vasta y usando el código C/C++ de Arduino.


Parto con la idea de que tu tienes nociones de programación (sí, tú), si no intentaré en comentarios echarte un cable en esto.

Otro problema de Arduino que tienes que sumar es su estructura, como es un microcontrolador, tiene 2 funciones que deben estar puestas obligatoriamente, setup y loop.

[pastacode lang=”cpp” manual=”%2F%2Fdeclarar%20variables%20globales%0Avoid%20setup()%7B%0A%2F%2Faqu%C3%AD%20van%20la%20definicion%20de%20las%20entradas%2Fsalidas%20de%20datos%20(pinmode%E2%80%A6)%0A%2F%2Festa%20parte%20solo%20se%20ejecuta%20una%20vez%2C%20cuando%20el%20Arduino%20empieza%20a%20funcionar%20(o%20reseteas).%0A%7D%0Avoid%20loop()%7B%0A%2F%2Festa%20parte%20se%20repetir%C3%A1%20una%20y%20otra%20vez%2C%20aqu%C3%AD%20es%20donde%20se%20suele%20meter%20el%20c%C3%B3digo%20de%20los%20proyectos%0A%7D” message=”ejemplo de sketch vacío” highlight=”” provider=”manual”/]

Si tienes el IDE, mírate los ejemplos (el blink, el ASCIITable…) y verás esta estructura en todas partes.

Sobre la POO, uf, eso da para un libro (o varios), pero vamos a intentar un resumen de un resumen de otro resumen de un esquema.

En programación puedes definir una variable de varios tipos (int, char, string…) pero no puedes otorgarle atributos, es decir, otras propiedades. Vamos al ejemplo tipico;

Tenemos un eje de coordenadas en el que queremos definir la x e y para movernos por el plano y queremos poner este punto en P(5,7);

[pastacode lang=”cpp” manual=”int%20x%20%3D%205%3B%0Aint%20y%20%3D%207%3B%0A” message=”” highlight=”” provider=”manual”/]

¿Qué pasa si ahora quiero poner un segundo punto? no puedo reutilizar x ni y, porque perderia el valor que tienen almacenado. Una solución CHAPUCERA sería crear otras 2 variables:

[pastacode lang=”cpp” manual=”int%20x%20%3D%205%3B%0Aint%20y%20%3D%207%3B%0Aint%20×1%20%3D%204%3B%0Aint%20y1%20%3D%206%3B” message=”” highlight=”” provider=”manual”/]

¿imaginas crear 5 puntos así?

[pastacode lang=”markup” manual=”int%20×1%20%3D%201%3B%0Aint%20y1%20%3D%201%3B%0Aint%20×2%20%3D%202%3B%0Aint%20y2%20%3D%202%3B%0Aint%20×3%20%3D%203%3B%0Aint%20y3%20%3D%203%3B%0Aint%20×4%20%3D%204%3B%0Aint%20y4%20%3D%204%3B%0Aint%20×5%20%3D%205%3B%0Aint%20y5%20%3D%205%3B%0A” message=”Esto se ensucia…” highlight=”” provider=”manual”/]

¿y si quiero 50 puntos?

 

via GIPHY

Para eso esta la POO, creamos un OBJETO (o clase) punto, que tiene unas propiedades, coordenada x y coordenada y.

Al crear una clase, se necesitan 2 archivos, punto.h y punto.cpp, esto es porque en el .h se define la clase que se va a programar y sus atributos, y en el .cpp se programa el funcionamiento interno de esta (los métodos). Luego el compilador se las apaña y genera el código que se tiene que ejecutar.
Las propiedades de la clase se ponen en un apartado llamado private, el cual significa que para modificar estos valores, necesitas que haya una función (en POO se llaman métodos) que esté en el apartado public que los modifique. Lo voy a ir comentando sobre el código de ejemplo que pondré al final, porque hay más cosas que pueden ser liantes, pero en realidad facilitan bastante la vida, así hago el tocho de una tirada, porque a estas alturas igual ya nadie esta leyéndolo.

El .h se compone pues de la definición de la clase y de sus atributos y los métodos de los que se compone. Vamos a ver cómo se implementaría:

[pastacode lang=”cpp” manual=”%23ifndef%20Punto_H%20%2F%2FEsto%20es%20largo%20de%20explicar%20y%2C%20sinceramente%2C%20un%20poco%20co%C3%B1azo%2C%20resumen%3A%20se%20pone%20y%20punto%0A%23define%20Punto_H%0A%0Aclass%20Punto%20%7B%20%2F%2Fempieza%20el%20objeto%20punto%0Aprivate%3A%20%2F%2Fatributos%20del%20punto%20P(x%2Cy)%0A%09int%20x%3B%0A%09int%20y%3B%0Apublic%3A%20%2F%2F%C2%BFc%C3%B3mo%20vamos%20a%20usar%20el%20punto%3F%0A%2F%2Fconstructores%2C%20se%20les%20llama%20as%C3%AD%2C%20porque%20son%20los%20que%20otorgan%20el%20tipo%20de%20variable%20que%20definen%20(luego%20lo%20entender%C3%A9is%20mejor)%0A%09Punto()%3B%20%2F%2Fconstructor%20por%20defecto%2C%20sin%20par%C3%A1metros%2C%20se%20los%20pondremos%20fijos%0A%09Punto(int%20tmpX)%3B%20%2F%2Fconstructor%20incompleto%2C%20definimos%20solo%20uno%20de%20los%20par%C3%A1metros%0A%09Punto(int%20tmpX%2C%20int%20tmpY)%3B%20%2F%2Fconstructor%2C%20definimos%20tanto%20X%20como%20Y%0A%0A%2F%2Fsetters%20Esto%20significa%20que%20estas%20funciones%20(m%C3%A9todos)%20son%20las%20que%20hacen%20variar%20el%20valor%20de%20x%20e%20y%0A%09void%20setX(int%20tmpX)%3B%0A%09void%20setY(int%20tmpY)%3B%0A%09void%20setPunto(int%20tmpX%2C%20int%20tmpY)%3B%0A%0A%2F%2Fgetters%20Estos%20nos%20devuelven%20el%20valor%20de%20x%20e%20Y%0A%09int%20getX()%3B%0A%09int%20getY()%3B%0A%7D%3B%0A%23endif” message=”Ejemplo de archivo de librería” highlight=”” provider=”manual”/]

 

El .cpp es el que contiene la definición de los constructores y los métodos descritos en el .h, el Punto:: es una definición de la clase a la que pertenece el método (otro ladrillo para explicar, se pone y punto).

[pastacode lang=”cpp” manual=”%23include%20%22punto.h%22%0APunto%3A%3APunto()%7B%20%2F%2Fdefinimos%20el%20constructor%20por%20defecto%3A%0A%09x%20%3D%200%3B%0A%09y%20%3D%200%3B%0A%7D%0A%0APunto%3A%3APunto(int%20tmpX)%7B%20%2F%2Fdefinimos%20el%20constructor%2C%20con%20y%20el%20valor%20que%20queramos%20(siempre%20ser%C3%A1%20fijo%20aqu%C3%AD)%0A%09x%20%3D%20tmpX%3B%0A%09y%20%3D%200%3B%0A%7D%0A%0APunto%3A%3APunto(int%20tmpX%2C%20int%20tmpY)%7B%20%2F%2Fdefinimos%20el%20constructor%0A%09x%20%3D%20tmpX%3B%0A%09y%20%3D%20tmpY%3B%0A%7D%0A%0A%2F%2Fsetters%0Avoid%20Punto%3A%3AsetX(int%20tmpX)%7B%20%2F%2Faqui%20damos%20el%20valor%20de%20X%0A%09x%20%3D%20tmpX%3B%0A%7D%0A%0Avoid%20Punto%3A%3AsetY(int%20tmpY)%7B%2F%2Faqui%20damos%20el%20valor%20de%20Y%0A%09y%20%3D%20tmpY%3B%0A%7D%0A%0Avoid%20Punto%3A%3AsetPunto(int%20tmpX%2C%20int%20tmpY)%7B%0A%09x%20%3D%20tmpX%3B%0A%09y%20%3D%20tmpY%3B%0A%7D%0A%0A%2F%2Fgetters%0Aint%20Punto%3A%3AgetX()%7B%2F%2Faqui%20obtenemos%20el%20valor%20de%20X%0A%09return%20x%3B%0A%7D%0A%0Aint%20Punto%3A%3AgetY()%7B%2F%2Faqui%20obtenemos%20el%20valor%20de%20Y%0A%09return%20y%3B%0A%7D%0A” message=”Definición de la clase Punto” highlight=”” provider=”manual”/]

Bueno, y ahora falta el código para programar el punto… Ahora es cuando uno piensa “Espera, ¿me estás diciendo que con todo ese tocho aún no has empezado a programar puntos?”
Pues sí y no, hemos definido qué es un punto y qué propiedades tiene, ahora falta usarlo:

[pastacode lang=”cpp” manual=”%23include%20%22Punto.h%22%0A%0A%2F%2Fvamos%20a%20crear%20un%20punto%20con%20valores%20por%20defecto%3A%0APunto%20p%3B%0A%0A%2F%2Fahora%20vamos%20crear%20otro%20y%20a%20darle%20valores%3A%0APunto%20p1(5%2C7)%3B%0A%0A%2F%2Fy%20ahora%2C%20voy%20a%20crear%20un%20vector%20de%20100%20puntos%20de%20un%20plumazo%3A%0APunto%20punto%5B100%5D%3B%0A%2F%2Fy%20a%20darle%20valores%0Afor(int%20i%20%3D%200%3B%20i%20%3C%20100%3B%20i%2B%2B)%7B%0A%09punto%5Bi%5D.setX(random(1000)%3B%0A%09punto%5Bi%5D.setY(random(1000)%3B%0A%7D%0A%0Avoid%20setup()%7B%0A%09Serial.begin(9600)%3B%0A%7D%0A%0Avoid%20loop()%7B%0A%09Serial.print(%22Valor%20de%20p%20%3D%20%22)%3B%0A%09Serial.println(p)%3B%0A%09Serial.print(%22valor%20de%20p1%20%3D%20%22)%3B%0A%09Serial.println(p)%3B%0A%0A%09for(int%20i%20%3D%200%3B%20i%20%3C%20100%3B%20i%2B%2B)%7B%0A%09%09Serial.print(%22Valor%20del%20punto%5B%22)%3B%0A%09%09Serial.print(i)%3B%0A%09%09Serial.print(%22%5D%20%3D%20(%22)%3B%0A%09%09Serial.print(punto%5Bi%5D.getX())%3B%0A%09%09Serial.print(%22%2C%20%22%0A%09%09Serial.print(punto%5Bi%5D.getY())%3B%0A%09%09Serial.println(%22)%22)%3B%0A%09%7D%0A%7D” message=”Ejemplos de uso de la clase Punto” highlight=”” provider=”manual”/]

 

La POO requiere pensar de forma un poco más abstracta con los objetos a programar, pero por otro lado, facilita las cosas una vez le pillas el truco

Un consejo personal es que, si no tienes experiencia, no te lances de cabeza a montar un proyecto sin más, te darás una hosttorta y abandonarás el proyecto. Documéntate, experimenta con pasos sencillos y luego irás juntando piezas de este rompecabezas . Y, sobre todo, pregunta.

Creative Commons License
Aprendiendo a programar II by Pepe Chorva is licensed under a Creative Commons Attribution-ShareAlike 4.0 Internacional

Deja un comentario

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