{"id":173,"date":"2017-02-27T12:54:02","date_gmt":"2017-02-27T12:54:02","guid":{"rendered":"http:\/\/escueladefrikis.com\/?p=173"},"modified":"2017-02-27T12:54:02","modified_gmt":"2017-02-27T12:54:02","slug":"buenas-practicas-programacion-evita-los-numeros-magicos","status":"publish","type":"post","link":"https:\/\/escueladefrikis.com\/index.php\/2017\/02\/27\/buenas-practicas-programacion-evita-los-numeros-magicos\/","title":{"rendered":"Buenas pr\u00e1cticas de programaci\u00f3n: evita los n\u00fameros m\u00e1gicos"},"content":{"rendered":"<p>Hoy comenzamos una categor\u00eda de art\u00edculos explicando buenas pr\u00e1cticas de programaci\u00f3n. Es importante tenerlas en cuenta a la hora de escribir c\u00f3digo porque ser\u00e1 mucho m\u00e1s f\u00e1cil de leer y mantener en un futuro, tanto por nosotros como por otras personas. Comenzamos con un problema t\u00edpico: los <strong>n\u00fameros m\u00e1gicos<\/strong>.<!--more--><\/p>\n<h3>\u00bfQu\u00e9 son los n\u00fameros m\u00e1gicos?<\/h3>\n<p>Los n\u00fameros m\u00e1gicos son aquellos que aparecen en medio del codigo y no se sabe muy bien por qu\u00e9 o de d\u00f3nde vienen exactamente. Pongamos un ejemplo:<\/p>\n<pre class=\"crayon-line\"><span class=\"crayon-t\">void<\/span> <span class=\"crayon-e\">setup<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">{<\/span>\n<span class=\"crayon-e\">  pinMode<\/span><span class=\"crayon-sy\">(<span style=\"color: #ff0000;\">8<\/span><\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">OUTPUT<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">; \/\/ red LED<\/span>\n<span class=\"crayon-e\">  pinMode<\/span><span class=\"crayon-sy\">(<span style=\"color: #ff0000;\">9<\/span><\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">OUTPUT<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">; \/\/ blue LED<\/span>\n<span class=\"crayon-sy\">}<\/span>\n<span class=\"crayon-t\">void<\/span> <span class=\"crayon-e\">loop<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">{\n<\/span><span class=\"crayon-e\">  digitalWrite<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\" style=\"color: #ff0000;\">8<\/span><span class=\"crayon-sy\">,<\/span>\u00a0HIGH<span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;\n<\/span>  delay(<span style=\"color: #ff0000;\">200<\/span>);\n  digitalWrite<span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\" style=\"color: #ff0000;\">8<\/span><span class=\"crayon-sy\">,<\/span>\u00a0<span class=\"crayon-v\">LOW<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;\n<\/span>  digitalWrite<span class=\"crayon-sy\">(<span style=\"color: #ff0000;\">9<\/span><\/span><span class=\"crayon-sy\">,<\/span>\u00a0HIGH<span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;\n<\/span>  delay(<span style=\"color: #ff0000;\">200<\/span>);\n  digitalWrite<span class=\"crayon-sy\">(<span style=\"color: #ff0000;\">9<\/span><\/span><span class=\"crayon-sy\">,<\/span>\u00a0LOW<span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;\n<\/span><span class=\"crayon-sy\">}<\/span><\/pre>\n<div class=\"crayon-line\">Este es un c\u00f3digo bastante corto y sencillo pero nos valdr\u00e1 como explicaci\u00f3n. Simplemente vamos encendiendo alternativamente dos salidas que encienden dos LEDs distintos, un LED rojo y un LED azul.<\/div>\n<div class=\"crayon-line\">Estamos utilizando dos pines, inicializados en el <span style=\"font-family: 'courier new', courier, monospace;\">setup()<\/span>: el pin 8 y el pin 9, y adem\u00e1s tenemos un retardo entre el encendido alternativo de 200 milisegundos.<\/div>\n<div class=\"crayon-line\">\u00bfQu\u00e9 pasar\u00eda si tuvi\u00e9ramos que modificar el c\u00f3digo porque hemos cambiado las conexiones o quisi\u00e9ramos cambiar el retardo entre el encendido? Nos tocar\u00eda buscar en todo el c\u00f3digo todos los puntos donde se utilizan esos pines o el retardo, que es todo el texto marcado en rojo.<\/div>\n<h3 class=\"crayon-line\">C\u00f3mo evitar los n\u00fameros m\u00e1gicos<\/h3>\n<div class=\"crayon-line\">En vez de poner en el c\u00f3digo directamente valores que nos va a ser dif\u00edcil recordar de d\u00f3nde vienen, es mucho m\u00e1s conveniente definir constantes al comienzo del c\u00f3digo definiendo estos valores. De esta manera, el c\u00f3digo quedar\u00eda:<\/div>\n<div class=\"crayon-line\">\n<pre class=\"crayon-line\"><span class=\"crayon-e\"><span style=\"color: #339966;\">const int PIN_LED_RED=8;<\/span>\nconst int PIN_LED_BLUE=9;\nconst int DELAY=200;\n\nvoid setup<span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">{\n<\/span><span style=\"color: #000000;\">  pinMode<span class=\"crayon-sy\">(PIN_LED_RED<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">OUTPUT<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/span>\n<span style=\"color: #000000;\">  pinMode<\/span><\/span><span style=\"color: #000000;\"><span class=\"crayon-sy\">(PIN_LED_BLUE<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">OUTPUT<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/span>\n<span class=\"crayon-sy\" style=\"color: #000000;\">}<\/span>\n\n<span style=\"color: #000000;\"><span class=\"crayon-t\">void<\/span> <span class=\"crayon-e\">loop<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">{\n<\/span><\/span><span style=\"color: #000000;\"><span class=\"crayon-e\">  digitalWrite<\/span><span class=\"crayon-sy\">(PIN_LED_RED<\/span><span class=\"crayon-sy\">,<\/span>\u00a0HIGH<span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;\n<\/span><\/span><span style=\"color: #000000;\">  delay(DELAY);\n<\/span>  digitalWrite<span class=\"crayon-sy\">(PIN_LED_RED<\/span><span class=\"crayon-sy\">,<\/span>\u00a0<span class=\"crayon-v\">LOW<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;\n<\/span>  digitalWrite<span class=\"crayon-sy\">(PIN_LED_BLUE<\/span><span class=\"crayon-sy\">,<\/span>\u00a0HIGH<span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;\n<\/span>  delay(DELAY);\n  digitalWrite<span class=\"crayon-sy\">(PIN_LED_BLUE<\/span><span class=\"crayon-sy\">,<\/span>\u00a0LOW<span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;\n<\/span><span class=\"crayon-sy\">}<\/span><\/pre>\n<div class=\"crayon-line\">Ahora cuando queremos encender el LED rojo, no escribimos:<\/div>\n<pre class=\"crayon-line\"><span class=\"crayon-e\">digitalWrite<\/span><span class=\"crayon-sy\">(8<\/span><span class=\"crayon-sy\">,<\/span>\u00a0HIGH<span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/pre>\n<div class=\"crayon-line\">Sino que escribimos:<\/div>\n<pre class=\"crayon-line\"><span class=\"crayon-e\">digitalWrite<\/span><span class=\"crayon-sy\">(PIN_LED_RED<\/span><span class=\"crayon-sy\">,<\/span>\u00a0HIGH<span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/pre>\n<div class=\"crayon-line\">Esta segunda sentencia es mucho m\u00e1s clara y no tenemos que recordar exactamente a qu\u00e9 pin corresponde cada cosa: la sentencia se explica sola.<\/div>\n<div class=\"crayon-line\">Adem\u00e1s, si en alg\u00fan momento el pin del LED rojo lo conectamos a otro pin, no tenemos que cambiar en 3 sentencias, sino que simplemente cambiamos en la constante donde hemos definido el n\u00famero de pin que utiliza el LED (marcado en verde).<\/div>\n<h3 class=\"crayon-line\">C\u00f3mo definir constantes<\/h3>\n<div class=\"crayon-line\">En casi todos los lenguajes, las constantes se definen de una manera concreta. En Java (que es el lenguaje en el que escribimos los programas de Arduino):<\/div>\n<\/div>\n<div class=\"crayon-line\">\n<pre class=\"crayon-line\"><span class=\"crayon-e\"><strong><span style=\"color: #0000ff;\">const<\/span> <\/strong>int PIN_LED_BLUE=9;\n<\/span><\/pre>\n<\/div>\n<div class=\"crayon-line\">Tenemos:<\/div>\n<ul>\n<li class=\"crayon-line\">El modificador \u00ab<span style=\"font-family: 'courier new', courier, monospace;\">const<\/span>\u00ab. \u00bfY para qu\u00e9 sirve este modificador? Para que el compilador sepa que este valor guardado en memoria es fijo y si en alguna parte del c\u00f3digo, por error, lo intentamos modificar nos dar\u00e1 un error.<\/li>\n<li class=\"crayon-line\">El tipo de dato. En este caso, es un n\u00famero entero (\u00ab<span style=\"font-family: 'courier new', courier, monospace;\">int<\/span>\u00ab).<\/li>\n<li class=\"crayon-line\">El nombre de la constante (\u00ab<span style=\"font-family: 'courier new', courier, monospace;\">PIN_LED_BLUE<\/span>\u00ab). El convenio es que los nombres de las constantes se escriben en may\u00fasculas, para distinguirlas de las variables normales.<\/li>\n<li class=\"crayon-line\">Dado que es una constante, le tenemos que dar un valor en el mismo momento en que la definimos porque luego no lo podemos modificar.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Hoy comenzamos una categor\u00eda de art\u00edculos explicando buenas pr\u00e1cticas de programaci\u00f3n. Es importante tenerlas en cuenta a la hora de escribir c\u00f3digo porque ser\u00e1 mucho m\u00e1s f\u00e1cil de leer y mantener en un futuro, tanto por nosotros como por otras personas. Comenzamos con un problema t\u00edpico: los n\u00fameros m\u00e1gicos.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[9,12],"class_list":["post-173","post","type-post","status-publish","format-standard","hentry","category-programacion","tag-aprendizaje","tag-buenas-practicas"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/posts\/173","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/comments?post=173"}],"version-history":[{"count":0,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/posts\/173\/revisions"}],"wp:attachment":[{"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/media?parent=173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/categories?post=173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/escueladefrikis.com\/index.php\/wp-json\/wp\/v2\/tags?post=173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}