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.

//declarar variables globales
void setup(){
//aquí van la definicion de las entradas/salidas de datos (pinmode…)
//esta parte solo se ejecuta una vez, cuando el Arduino empieza a funcionar (o reseteas).
}
void loop(){
//esta parte se repetirá una y otra vez, aquí es donde se suele meter el código de los proyectos
}
ejemplo de sketch vacío

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);

int x = 5;
int y = 7;

¿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:

int x = 5;
int y = 7;
int x1 = 4;
int y1 = 6;

¿imaginas crear 5 puntos así?

int x1 = 1;
int y1 = 1;
int x2 = 2;
int y2 = 2;
int x3 = 3;
int y3 = 3;
int x4 = 4;
int y4 = 4;
int x5 = 5;
int y5 = 5;
Esto se ensucia...

¿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:

#ifndef Punto_H //Esto es largo de explicar y, sinceramente, un poco coñazo, resumen: se pone y punto
#define Punto_H

class Punto { //empieza el objeto punto
private: //atributos del punto P(x,y)
	int x;
	int y;
public: //¿cómo vamos a usar el punto?
//constructores, se les llama así, porque son los que otorgan el tipo de variable que definen (luego lo entenderéis mejor)
	Punto(); //constructor por defecto, sin parámetros, se los pondremos fijos
	Punto(int tmpX); //constructor incompleto, definimos solo uno de los parámetros
	Punto(int tmpX, int tmpY); //constructor, definimos tanto X como Y

//setters Esto significa que estas funciones (métodos) son las que hacen variar el valor de x e y
	void setX(int tmpX);
	void setY(int tmpY);
	void setPunto(int tmpX, int tmpY);

//getters Estos nos devuelven el valor de x e Y
	int getX();
	int getY();
};
#endif
Ejemplo de archivo de librería

 

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).

#include "punto.h"
Punto::Punto(){ //definimos el constructor por defecto:
	x = 0;
	y = 0;
}

Punto::Punto(int tmpX){ //definimos el constructor, con y el valor que queramos (siempre será fijo aquí)
	x = tmpX;
	y = 0;
}

Punto::Punto(int tmpX, int tmpY){ //definimos el constructor
	x = tmpX;
	y = tmpY;
}

//setters
void Punto::setX(int tmpX){ //aqui damos el valor de X
	x = tmpX;
}

void Punto::setY(int tmpY){//aqui damos el valor de Y
	y = tmpY;
}

void Punto::setPunto(int tmpX, int tmpY){
	x = tmpX;
	y = tmpY;
}

//getters
int Punto::getX(){//aqui obtenemos el valor de X
	return x;
}

int Punto::getY(){//aqui obtenemos el valor de Y
	return y;
}
Definición de la clase Punto

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:

#include "Punto.h"

//vamos a crear un punto con valores por defecto:
Punto p;

//ahora vamos crear otro y a darle valores:
Punto p1(5,7);

//y ahora, voy a crear un vector de 100 puntos de un plumazo:
Punto punto[100];
//y a darle valores
for(int i = 0; i < 100; i++){
	punto[i].setX(random(1000);
	punto[i].setY(random(1000);
}

void setup(){
	Serial.begin(9600);
}

void loop(){
	Serial.print("Valor de p = ");
	Serial.println(p);
	Serial.print("valor de p1 = ");
	Serial.println(p);

	for(int i = 0; i < 100; i++){
		Serial.print("Valor del punto[");
		Serial.print(i);
		Serial.print("] = (");
		Serial.print(punto[i].getX());
		Serial.print(", "
		Serial.print(punto[i].getY());
		Serial.println(")");
	}
}
Ejemplos de uso de la clase Punto

 

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