{"id":244,"date":"2017-12-27T12:59:08","date_gmt":"2017-12-27T11:59:08","guid":{"rendered":"http:\/\/pepechorva.com\/myblog\/?p=244"},"modified":"2022-09-11T00:16:44","modified_gmt":"2022-09-10T23:16:44","slug":"aprendiendo-a-programar-2","status":"publish","type":"post","link":"https:\/\/pepechorva.com\/myblog\/aprendiendo-a-programar-2\/","title":{"rendered":"Aprendiendo a programar II"},"content":{"rendered":"<p style=\"text-align: left;\">La Programaci\u00f3n Orientada a Objetos (POO) es un tipo de programaci\u00f3n que requiere saber abstraer propiedades de un elemento para facilitar su programaci\u00f3n. Voy a ver si lo explico, aunque de forma un poco vasta y usando el c\u00f3digo C\/C++ de Arduino.<\/p>\n<p><!--more--><br \/>\nParto con la idea de que tu tienes nociones de programaci\u00f3n (s\u00ed, t\u00fa), si no intentar\u00e9 en comentarios echarte un cable en esto.<\/p>\n<p>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.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\">\/\/declarar variables globales\nvoid setup(){\n\/\/aqu\u00ed van la definicion de las entradas\/salidas de datos (pinmode\u2026)\n\/\/esta parte solo se ejecuta una vez, cuando el Arduino empieza a funcionar (o reseteas).\n}\nvoid loop(){\n\/\/esta parte se repetir\u00e1 una y otra vez, aqu\u00ed es donde se suele meter el c\u00f3digo de los proyectos\n}<\/pre>\n<p>Si tienes el IDE, m\u00edrate los ejemplos (el blink, el ASCIITable\u2026) y ver\u00e1s esta estructura en todas partes.<\/p>\n<p>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.<\/p>\n<p>En programaci\u00f3n puedes definir una variable de varios tipos (int, char, string\u2026) pero no puedes otorgarle atributos, es decir, otras propiedades. Vamos al ejemplo tipico;<\/p>\n<p>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);<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\">int x = 5;\nint y = 7;<\/pre>\n<p>\u00bfQu\u00e9 pasa si ahora quiero poner un segundo punto? no puedo reutilizar x ni y, porque perderia el valor que tienen almacenado. Una soluci\u00f3n CHAPUCERA ser\u00eda crear otras 2 variables:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\">int x = 5;\nint y = 7;\nint x1 = 4;\nint y1 = 6;<\/pre>\n<p>\u00bfimaginas crear 5 puntos as\u00ed?<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\">int x1 = 1;\nint y1 = 1;\nint x2 = 2;\nint y2 = 2;\nint x3 = 3;\nint y3 = 3;\nint x4 = 4;\nint y4 = 4;\nint x5 = 5;\nint y5 = 5;<\/pre>\n<p>\u00bfy si quiero 50 puntos?<\/p>\n<div style=\"width: 100%; height: 0; padding-bottom: 56%; position: relative;\"><iframe class=\"giphy-embed\" style=\"position: absolute;\" src=\"https:\/\/giphy.com\/embed\/c6DIpCp1922KQ\" width=\"100%\" height=\"100%\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/div>\n<p><a href=\"https:\/\/giphy.com\/gifs\/monday-the-it-crowd-workplace-c6DIpCp1922KQ\">via GIPHY<\/a><\/p>\n<p>Para eso esta la POO, creamos un OBJETO (o clase) punto, que tiene unas propiedades, coordenada x y coordenada y.<\/p>\n<p>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\u00e9todos). Luego el compilador se las apa\u00f1a y genera el c\u00f3digo que se tiene que ejecutar.<br \/>\nLas propiedades de la clase se ponen en un apartado llamado private, el cual significa que para modificar estos valores, necesitas que haya una funci\u00f3n (en POO se llaman m\u00e9todos) que est\u00e9 en el apartado public que los modifique. Lo voy a ir comentando sobre el c\u00f3digo de ejemplo que pondr\u00e9 al final, porque hay m\u00e1s cosas que pueden ser liantes, pero en realidad facilitan bastante la vida, as\u00ed hago el tocho de una tirada, porque a estas alturas igual ya nadie esta ley\u00e9ndolo.<\/p>\n<p>El .h se compone pues de la definici\u00f3n de la clase y de sus atributos y los m\u00e9todos de los que se compone. Vamos a ver c\u00f3mo se implementar\u00eda:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\">#ifndef Punto_H \/\/Esto es largo de explicar y no viene al caso del post, resumen: se pone y punto\n#define Punto_H\n\nclass Punto { \/\/empieza el objeto punto\nprivate: \/\/atributos del punto P(x,y)\n  int x;\n  int y;\npublic: \/\/\u00bfc\u00f3mo vamos a usar el punto?\n\/\/constructores, se les llama as\u00ed, porque son los que otorgan el tipo de variable que definen (luego lo entender\u00e9is mejor)\n  Punto(); \/\/constructor por defecto, sin par\u00e1metros, se los pondremos fijos\n  Punto(int tmpX); \/\/constructor incompleto, definimos solo uno de los par\u00e1metros\n  Punto(int tmpX, int tmpY); \/\/constructor, definimos tanto X como Y\n\n\/\/setters Esto significa que estas funciones (m\u00e9todos) son las que hacen variar el valor de x e y\n  void setX(int tmpX);\n  void setY(int tmpY);\n  void setPunto(int tmpX, int tmpY);\n\n\/\/getters Estos nos devuelven el valor de x e Y\n  int getX();\n  int getY();\n};\n#endif<\/pre>\n<p>El .cpp es el que contiene la definici\u00f3n de los constructores y los m\u00e9todos descritos en el .h, el Punto:: es una definici\u00f3n de la clase a la que pertenece el m\u00e9todo (otro ladrillo para explicar, se pone y punto).<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\">#include \"punto.h\"\nPunto::Punto(){ \/\/definimos el constructor por defecto:\n  x = 0;\n  y = 0;\n}\n\nPunto::Punto(int tmpX){ \/\/definimos el constructor, con y el valor que queramos (siempre ser\u00e1 fijo aqu\u00ed)\n  x = tmpX;\n  y = 0;\n}\n\nPunto::Punto(int tmpX, int tmpY){ \/\/definimos el constructor\n  x = tmpX;\n  y = tmpY;\n}\n\n\/\/setters\nvoid Punto::setX(int tmpX){ \/\/aqui damos el valor de X\n  x = tmpX;\n}\n\nvoid Punto::setY(int tmpY){\/\/aqui damos el valor de Y\n  y = tmpY;\n}\n\nvoid Punto::setPunto(int tmpX, int tmpY){\n  x = tmpX;\n  y = tmpY;\n}\n\n\/\/getters\nint Punto::getX(){\/\/aqui obtenemos el valor de X\n  return x;\n}\n\nint Punto::getY(){\/\/aqui obtenemos el valor de Y\n  return y;\n}\n<\/pre>\n<p>Bueno, y ahora falta el c\u00f3digo para programar el punto\u2026 Ahora es cuando uno piensa \u00abEspera, \u00bfme est\u00e1s diciendo que con todo ese tocho a\u00fan no has empezado a programar puntos?\u00bb<br \/>\nPues s\u00ed y no, hemos definido qu\u00e9 es un punto y qu\u00e9 propiedades tiene, ahora falta usarlo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\">#include \"Punto.h\"\n\n\/\/vamos a crear un punto con valores por defecto:\nPunto p;\n\n\/\/ahora vamos crear otro y a darle valores:\nPunto p1(5,7);\n\n\/\/y ahora, voy a crear un vector de 100 puntos de un plumazo:\nPunto punto[100];\n\/\/y a darle valores\nfor(int i = 0; i &lt; 100; i++){\n  punto[i].setX(random(1000);\n  punto[i].setY(random(1000);\n}\n\nvoid setup(){\n  Serial.begin(9600);\n}\n\nvoid loop(){\n  Serial.print(\"Valor de p = \");\n  Serial.println(p);\n  Serial.print(\"valor de p1 = \");\n  Serial.println(p);\n\n  for(int i = 0; i &lt; 100; i++){\n    Serial.print(\"Valor del punto[\");\n    Serial.print(i);\n    Serial.print(\"] = (\");\n    Serial.print(punto[i].getX());\n    Serial.print(\", \"\n    Serial.print(punto[i].getY());\n    Serial.println(\")\");\n  }\n}<\/pre>\n<p>La POO requiere pensar de forma un poco m\u00e1s abstracta con los objetos a programar, pero por otro lado, facilita las cosas una vez le pillas el truco<\/p>\n<p>Un consejo personal es que, si no tienes experiencia, no te lances de cabeza a programar sin m\u00e1s, te dar\u00e1s una <del>host<\/del>&#8230; torta y abandonar\u00e1s el proyecto. Docum\u00e9ntate, experimenta con pasos sencillos (<a href=\"https:\/\/es.wikipedia.org\/wiki\/Algoritmo_divide_y_vencer\u00e1s\">principio de divide y vencer\u00e1s<\/a>) y luego ir\u00e1s juntando piezas de este rompecabezas . Y, sobre todo, <strong><span style=\"text-decoration: underline;\">pregunta<\/span><\/strong>, en foros, grupos de telegram, aqu\u00ed&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La Programaci\u00f3n Orientada a Objetos (POO) es un tipo de programaci\u00f3n que requiere saber abstraer propiedades de un elemento para facilitar su programaci\u00f3n. Voy a ver si lo explico, aunque de forma un poco vasta y usando el c\u00f3digo C\/C++ de Arduino.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,18,8,40],"tags":[],"class_list":["post-244","post","type-post","status-publish","format-standard","hentry","category-cat-arduino","category-cat-codigoc","category-cat-codigo","category-cat-tutoriales"],"_links":{"self":[{"href":"https:\/\/pepechorva.com\/myblog\/wp-json\/wp\/v2\/posts\/244","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pepechorva.com\/myblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pepechorva.com\/myblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pepechorva.com\/myblog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/pepechorva.com\/myblog\/wp-json\/wp\/v2\/comments?post=244"}],"version-history":[{"count":13,"href":"https:\/\/pepechorva.com\/myblog\/wp-json\/wp\/v2\/posts\/244\/revisions"}],"predecessor-version":[{"id":456,"href":"https:\/\/pepechorva.com\/myblog\/wp-json\/wp\/v2\/posts\/244\/revisions\/456"}],"wp:attachment":[{"href":"https:\/\/pepechorva.com\/myblog\/wp-json\/wp\/v2\/media?parent=244"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pepechorva.com\/myblog\/wp-json\/wp\/v2\/categories?post=244"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pepechorva.com\/myblog\/wp-json\/wp\/v2\/tags?post=244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}