Category Archives: Programacion

Principio de “Tell, Don’t ask” en Programación Orientada a Objetos

tell dont ask

El “Tell, Don’t ask” es un principio que nos indica que no tenemos que usar los objetos para pedirles cosas y según la información que nos devuelven tomar decisiones, sino que debemos decirles a los objetos que hagan cosas y estos objetos internamente tomaran sus propias decisiones según su estado.

Este principio casa perfectamente con la idea de que un objeto se define por su comportamiento; y además es fundamental para sacar partido al polimorfismo y la inversión de control. Es decir si nos dedicamos a preguntar y tomar nosotros las decisiones estaremos acoplándonos, será prácticamente imposible hacer cambios al objeto, estaremos incumpliendo el principio Open/Close, nuestro sistema será más difícil de mantener, y por lo tanto más caro.

Al exponer el estado de una clase a las demás para que pueda ser manipulada estamos violando su encapsulamiento y asumiendo riesgos, ademas de que estamos moviendo responsabilidades a las clases de mayor nivel.

El principio fundamental de la programación orientada a objetos es la unificación de métodos y datos, por lo que lo correcto es que cuando una clase requiere conocer el estado de otra, es importante evaluar que uso se le darán a esos datos, y realizar el procesamiento de esa información en la clase expuesta, evitando la dispersión y propagación de estado.

Para mas información pueden consultar los artículos de Carles Climent o Alejandro Pérez García

ParamArray: qué es y como usarlo? (Visual Basic 6)

ParamArray

ParamArray

Se refiere a la habilidad que puede tener un procedimiento o función de aceptar una lista indefinida de parámetros de un mismo tipo de datos.

Dicho parámetro siempre debe estar definido como el último argumento de la lista y siempre debe declararse como un parámetro por valor (ByVal).

Un ejemplo de una función que use ParamArray sería:

Public Function Sumar(ParamArray Elementos() As Integer) As Integer
   Dim resultado as Integer
   
   For i = 0 To UBound(Elementos) 'Hacer desde el primer valor del array Elementos hasta el ultimo valor 
      resultado = resultado + Elementos(i)
   Next

   Sumar = resultado
End Function

Para usarla basta con ejecutar lo siguiente:

MsgBox Sumar(23, 45, 233, 123, 122, 10)
MsgBox Sumar(1, 2, 3)

Dim resultadoSuma as Integer
resultadoSuma = Sumar(934, 125)
MsgBox "El resultado de la suma es " & resultadoSuma

Sin embargo si quieren ver un ejemplo más completo y utilizando una base de datos, les dejo el siguiente repositorio de Github donde pueden encontrar el código fuente de una pequeña aplicación que cree para cargar datos de alumnos utilizando ParamArray en unas funciones que construyen los Insert, Update y Delete sin necesidad de decirle los nombres de los campos. Enjoy!!!

Como ejecutar un proceso en php de manera asíncrona?

php

Si en algún momento te surge la necesidad de ejecutar un proceso de php de manera asincrono, permitiendo que tu página siga su curso normal sin necesidad de esperar por este proceso, puedes hacer uso de la función shell_exec dentro de php e invocarlo de manera paralela.

Por ejemplo puede ser usada al momento de enviar un email permitiendo que la página pueda mostrar la información sin necesidad de esperar al largo proceso que ocurren tras bastidores para enviar dicho email.

La forma de utilizar dicho comando es:

string shell_exec ( string $cmd )

Si adicionalmente quieres realizarlo en background puedes hacer uso del mismo de la siguiente manera:

shell_exec('php -q /var/www/html/background.php > /dev/null 2>&1 &');

Para mas información puedes revisar la documentación de php

Code Smells

O también conocidos como bad smells, se refiere a cualquier sintoma en el código fuente de un programa que posiblemente indica un problema mas profundo. No son bugs y en realidad no impiden que tu programa funcione correctamente, sin embargo, sugieren deficiencias que pueden generar tiempos de desarrollo mas extensos o riesgo de errores a futuro.

Determinar un code smell es con frecuencia un proceso subjetivo y puede variar según el lenguaje de programación, la metodología de desarrollo y finalmente el desarrollador.

Para simplificar la categorización de los mismos, se crearon los siguientes grandes grupos:

Bloasters

Son bloques de código, métodos y/o clases que han aumentado en tales proporciones gigantescas que son difíciles de trabajar. Por lo general, estos code smells no surgen de inmediato, sino que se acumulan con el tiempo a medida que evoluciona el programa. (sobre todo cuando nadie realiza un esfuerzo por mitigarlos)

Object-orientation Abusers

Están basados en la utilización de manera incompleta o incorrecta de los principios de la programación orientada a objetos.

Change Preventers

Se basa en el problema de que al cambiar algo en tu código, terminas haciendo muchos cambios en muchos otros lugares, por lo tanto el desarrollo de software se convierte en algo mucho mas costoso y complicado.

Dispensables

Es algo inútil e innecesario cuya ausencia haría que el código sea más limpio, eficiente y fácil de entender.

Couplers

Contribuyen al excesivo acoplamiento entre clases o muestran lo que sucede si el acoplamiento se sustituye por delegación excesiva.

Para mas información sobre este tema pueden visitar los siguientes enlaces:

Demostración de serializeArray() de JQuery

Hace poco mi amigo Gonzalo me hablo de la función serializeArray() de JQuery la cual es muy util al momento de realizar llamados de AJAX utilizando el método POST, debido a que reduces el código que tienes que escribir omitiendo el tener que crear un array donde vayas guardando todos los valores de tus etiquetas input, select y textarea; utilizando en su lugar la serialización del contenido del form.

Es decir en lugar de hacer esto (por ejemplo):

arrayDeValores = Array();
arrayDeValores.push($('#first_name');
arrayDeValores.push($('#last_name');
arrayDeValores.push($('#description');
$.post('pagina.php', arrayDeValores, function(r){
   // tu codigo aqui
});

Puedes hacerlo de la siguiente manera:

Para mas información pueden consultar la excelente documentación de JQuery

Cifrar cadena en Base64 en Javascript

Gracias a mi amigo Gonzalo hace poco conocí las funciones atob btoa de Javascript que sirven para cifrar una cadena de caracteres de manera que podamos enviarla a través de cualquier mecanismo (post, get, ajax, restful, etc) evitando perdida de información por el tipo codificación de caracteres y/o hacer visible la información que enviamos a través de una url.

Para ver un ejemplo de la función pueden observar el siguiente bloque de código:

O hacer uso de la excelente documentación que pueden conseguir en http://www.w3schools.com/

Qué es NodeJS? y como instalarlo en MacOS

Node.js es un entorno en tiempo de ejecución multiplataforma, de código abierto, para la capa del servidor (pero no limitándose a ello) basado en el lenguaje de programación ECMAScript, asíncrono, con I/O de datos en una arquitectura orientada a eventos y basado en el motor V8 de Google.

Node.js ejecuta V8 JavaScript. Espere… ¿qué? ¿JavaScript en el servidor? Sí, leyó correctamente. El JavaScript del lado del servidor puede ser un concepto nuevo para cualquiera que haya trabajado exclusivamente con JavaScript del lado del cliente, pero la idea en sí no es tan inverosímil — ¿por qué no utilizar el mismo lenguaje de programación que usted usa en el cliente del lado del servidor?

Node.js es similar en su propósito a Twisted o Tornado de Python, Perl Object Environment de Perl, React de PHP, libevent o libev de C, EventMachine de Ruby, vibe.d de D y de Java existe Apache MINA, Netty, Akka, Vert.x, Grizzly o Xsocket. Al contrario que la mayoría del código JavaScript, no se ejecuta en un navegador, sino en el servidor. Node.js implementa algunas especificaciones de CommonJS.

Lo que Node.js definitivamente no es

Sí, Node.js es un programa de servidor. Sin embargo, el producto base de Node.js definitivamente No es como ApacheTomcat. Esos servidores básicamente son productos para servidor listos para instalar y que están listos para implementar aplicaciones instantáneamente. Usted podría tener un servidor estar listo y en operación en un minuto con estos productos. Node.js definitivamente no es esto. De forma similar a como Apache puede agregar un módulo PHP para permitir a los desarrolladores crear páginas Web dinámicas, y un módulo SSL para conexiones seguras, Node.js también tiene el concepto de módulos que se pueden agregar a su núcleo mismo. Literalmente hay cientos de módulos de los que se puede escoger con Node.js, y la comunidad es bastante activa en cuanto a producir, publicar y actualizar docenas de módulos por día. 

Dicho esto, ahora podemos entrar en los pasos para la instalación de Node.js en MacOS

Existen dos maneras fundamentales de hacer esto de forma sencilla:

La primera pasa por entrar en la página de Node.js y descargar la versión que quieras instalar (LTS o Stable), lo cual te bajara un archivo .pkg que podrás instalar mediante la interfaz gráfica.

Actualmente pueden descargar las siguientes versiones:

La segunda manera (y es la que recomiendo) es instalar a través de HomeBrew con los siguientes pasos:

  • Abrir un terminal de consola
  • Escribir el comando “brew install node”
  • Validar que se instalo correctamente con los comandos “node -v” (para ver la versión que instaló de Node.js) y “npm -v” (para ver la versión de NPM que se instaló)
  • En caso de querer actualizar la versión que tienes instalada de Node.js solo debes abrir la consola y ejecutar los siguientes comandos:
    1. brew update
    2. brew upgrade node

Para mas información puedes consultar la guía de Dave McFarland

Qué es Laravel?

Laravel-5

Es un framework escrito en php que busca escribir código de manera elegante, evitando el llamado código espagueti.  Fue creado por Taylor Otwell en el año 2011 basandose en conceptos de Ruby On Rails y Asp .Net MVC.

La influencia de Laravel ha crecido rápidamente desde su lanzamiento. En la comunidad de desarrolladores es considerado como alternativa sencilla de usar pero que tiene todas las funcionalidades que debe tener un framework. Ha sido descargado más de 320.000 veces, y se espera que supere en popularidad a otros frameworks ya establecidos más antiguos.

Para ver mas sobre esta tendencia podemos visitar este articulo donde se comparan algunos de los frameworks mas importantes para PHPhttp://webrevisions.com/tutorials/php-framework-the-best-php-framework-for-2013/#.VoyPWJPhD-Z

Captura de pantalla 2016-01-05 a las 11.23.51 p.m.

Finalmente me gustaría dejarles el siguiente curso de Laravel de la mano de Raul Palacios para que no tengan excusas para dar el primero paso.

El mejor comentario es un buen nombre para tus métodos

Code comments best practices

Los comentarios son usualmente creados con la mejor intención, cuando el programador realiza esto es debido a que su código no es obvio o intuitivo. En tales casos, los comentarios son como un desodorante enmascarando el olor de un pescado.

La mejor forma de comentar tu código es elegir buenos nombres para tus métodos o clases.

Si sientes que un fragmento de código no puede ser entendido sin comentarios, entonces intenta cambiar la estructura del código de manera que los comentarios no sean necesarios.

Fuente: https://refactoring.guru

Visión para programar

windowslivewritervisinparaprogramar-c787programacion-2

CÓMO NO HAY QUE ACTUAR:

– Me siento delante del ordenador, cargo los programas que necesito, defino tablas según se me ocurra (nombre, apellidos, dirección, teléfono) [10 minutos], me pongo a picar código, diseño las pantallas de la aplicación para que maneje altas, bajas, modificaciones y consultas [30′], engancho con la BBDD, hago las consultas, pruebo, corrijo, vuelvo a probar, veo que todo va bien [1h] y me tomo una cervecita y me digo que soy un monstruo…

TIEMPO = 2h
Aún me falta meter los datos de la gente para que me sea útil.

– Pero luego se me ocurre que, además del teléfono quisiera tener el móvil, así que me meto en la BBDD, toco la tabla para incluir un nuevo campo “movil” [5′], toco el código para que tenga en cuenta ese campo, lo que requiere redefinir las estructuras internas [10′], controles de diseño para albergar ese nuevo dato en altas, bajas, modificaciones y consultas [20′], meterle mano a las consultas a la BBDD [20′], probar, corregir, volver a probar [20′], ponerle comentarios al código [20′] y tomarme otra cervecita y decir… ahhh, ahora está como yo quiero.

TIEMPO: 2h, aproximadas.

– Voy a empezar a meter los datos de la gente que tengo, porque para probar sólo he metido algunos… y resulta que mi amigo Fulanito tiene dos teléfonos fijos y tres móviles. Joder, esto no lo soporta mi aplicación, me cago en la leche. Bueno, tampoco es tan difícil… Retoco la BBDD para tener en cuenta este cambio, por lo que ya no será una tabla, sino más… una para nombres, apellidos, dirección, código postal, provincia y lo que se me ocurra; otra para tener teléfonos (fijo, móvil) y una tercera que relaciones a estas dos (supongamos que es Access)… [30 minutos], retoco el diseño de la app. [40′], retoco las consultas y el código para que muestre lo que yo quiero [1h], pongo más comentarios [30′], pruebo, corrijo y vuelvo a probar [30′]… y me voy dando cuenta que el código ya no es tan “perfecto” como la “primera versión”, pero me digo que ya lo haré mejor, lo modularizaré y eso… Bueno, me tomo una cocacola, me fumo un pitillo y suspiro de orgullo pq ya tengo lo que quiero. Ya meteré al día siguiente todos los datos.

TIEMPO: 3h30′, más o menos

– Hablando con Mengano por el MSN me dice que sería mejor si incluyera el correo electrónico de cada uno para tener la agenda más completa. Joder, el puto email, pero mira que no ocurrírseme antes… mierda… Me pongo… [20′] para meter una tabla de emails y adaptar la BBDD, ya sabéis, relaciones y demás, [40′] para ajustar el diseño de las altas, bajas, modificaciones y consultas, [50′] para tocar el código y que haga bien las cosas, [40′] para reajustar, de nuevo, los accesos por código a la BBDD, [50′] para pruebas, puesto que ahora, casualmente, hay más “errorcillos” que tengo que corregir, [30′] para los comentarios al código… [50′] para meter los datos de la gente que tengo, para dejarlo todo fetén.

Nuevas pruebas para corregir los errores tras introducir nuevos datos [30′]. Entonces me digo que el código está un tanto desordenado, que los comentarios no son todo lo buenos que quiero, que el diseño podría mejorarlo mucho, pero que ya lo haré, que lo principal funciona. Jeje, soy el puto amo…

TIEMPO: 5h, aproximadamente.

– Ahora quiero meter a Sutanito, que es un colega del MSN, pero que no tengo su teléfono. Cuando voy a meterlo con mi superchachiprograma, resulta que la BBDD me obliga a introducir un teléfono, al menos, puesto que si no se descojona la integridad referencial.

Joder… eso no lo había tenido en cuenta. No es mucho… Retoco la BBDD, me saltan advertencias de relaciones, pruebo el código, veo que algo no anda bien, hago pruebas, sigo probando… Tras 2 horas, lo dejo todo, más o menos.
Al meter a Beatriz, que está como un queso, resulta que su teléfono es el mismo que Julia, puesto que son primas, pero la jodida base de datos no me deja meter un mismo teléfono para dos personas… vaya… una metedura de pata… Bueno… Arreglarlo me va a costar un tiempo, así que paso de hacerlo porque estoy hasta los huevos y decido poner en el nombre “Beatriz y Julia”.

Ya lo cambiaré. Además, me sale que Paco tiene un número de 8 cifras, en lugar de 9… joderrr… tenía que haber comprobado por código que tenían que ser 9 números, ni más ni menos, además de darme cuenta de que si meto una letra en el campo del teléfono, se me descojona la aplicación con un error fatal.

Vaya, otra comprobación que no hago. Y si Juan tiene 5 correos electrónicos, sólo he tenido en cuenta que pueda tener uno… Además, James Bond, un colega de USA, tiene un código postal distinto al de España y mi programa no lo acepta… vaya… otro fiasco… Y encima, Pepe que cumple 30 tacos, me dice que tiene una página web cojonuda y pienso que sería bueno tener una tabla o un campo más para albergar las páginas webs de mis colegas… bueno…mmm… un campo más en la tabla email… no es mucho… Joder… 30 tacos ya… ¿Y si pusiera la fecha de nacimiento de la gente? son sólo 3 nuevos campos… claro, y tocar el diseño de altas, bajas, modificaciones y suputamadre… digooo, consultas, consultas… y ya la repera sería que además, me avisara de los cumpleaños de la peña con la fecha del sistema.

Sí, todo es muy sencillo, pero meterme otra vez con este código, joer, la verdad es que no apetece nada… buf… lidiar otra vez con el procedimiento de altas… que se las trae… me da pereza solo pensarlo… bueno, voy a echar una partidita al counter y mañana me pondré…

Me voy apuntando las cosas en una libreta y me digo, ya lo haré, no es mucho, un par de horas a lo sumo… Otro día… En verano, que tendré tiempo. Mientras tiraré de la agenda de papel, que es super útil, joder, mejor que este follón.

Y en verano, cuando le echas un vistazo al código, te das cuenta que los comentarios no son buenos, que apenas te acuerdas de lo que hacía cada función o procedimiento, que la BBDD es una mierda y retocarla es peor que hacerla de nuevo… y que deberías haber estructurado mejor el código, porque un procedimiento con 280 líneas es demasiado grande y podrías subdividirlo… así no hay quien se entere. Te vas a la librería a comprarte una agenda de piel de puta madre, super nueva, cojonuda…

Continue reading