Archivo de la etiqueta: programación

Strategy

Hoy voy a hablaros del patrón Strategy, un patrón de comportamiento que permite definir un algoritmo pero delegar la implementación de algunas partes de dicho algoritmo a otras clases. De esta forma se consigue mucha portabilidad, ya que permite adaptar el algoritmo al entorno en el que se ejecuta en tiempo de ejecución. Por ejemplo, si el algoritmo muestra información por pantalla, es interesante que esa parte del algoritmo pueda disponer de diferentes implementaciones, para poder imprimir tanto por consola como en un dispositivo Android.

Diagrama UML

El diagrama UML del patrón Strategy es el siguiente:

strategy

Como ejemplo podríamos definir en la clase Strategy una interfaz para algoritmos de ordenación, y en las clases concretas se implementaría con distintos métodos como QuickSort o MergeSort. El contexto sería la interfaz del programa principal que contendría una lista a ordenar y la referencia a la clase Strategy.

Ejemplo en Java

Supongamos que estamos diseñando una tienda online y queremos que acepte distintos medios de pago (tarjeta de crédito, Paypal, Bitcoin, etc). Un ejemplo de arquitectura con Strategy sería el siguiente:

Strategy-Pattern

En la interfaz se define el método y las subclases que implementan la interfaz definen los distintos métodos de pago. esto permite que en tiempo de ejecución se pueda elegir la clase que se ejecuta. El contexto es la clase ShoppingCart que contiene la referencia al Strategy.

El código completo en Java se encuentra en el siguiente enlace: http://www.journaldev.com/1754/strategy-design-pattern-in-java-example-tutorial

Deja un comentario

Archivado bajo Tutoriales

Singleton

Lo prometido es deuda queridos lectores, aquí tenéis el primer artículo de patrones de diseño UML. En el voy a hablar del singleton, un patrón de creación sencillo y muy utilizado, tanto que se llega a abusar de él y eso a menudo acaba generando errores de diseño en la arquitectura del software.

Si es único, es Singleton

Un singleton es una clase que se instancia exactamente una vez y sólo una. Eso no quiere decir que no se pueda usar esa instancia más veces(se puede usar todas las que se quiera como cualquier otra) pero siempre será la misma. Este patrón se suele utilizar para representar objetos que son intrínsecamente únicos, como el sistema de ficheros o el gestor de ventanas.

Una forma de implementación típica es la siguiente: se pone el constructor como privado y final

// Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}[

Esta implementación es cómoda y proporciona la funcionalidad que necesitamos, sólo existirá una instancia de la clase. Sin embargo, de esta manera es difícil hacer que el singleton sea serializable, pueden existir problemas de concurrencia y es vulnerable a ataques de reflexión. A partir de la versión 1.5 de Java , existe una implementación todavía mejor, usando los siempre poco valorados tipos enumerados:

// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}

Esta implementación es más segura frente a ataques y problemas de concurrencia y es más fácil de serializar, por lo que es la mejor forma de implementar un Singleton.

Singletonitis

Esta peligrosa enfermedad 😛 consiste en el abuso indiscriminado del patrón Singleton, porque como ofrece muchas ventajas y es sencillo de implementar, pues lo utilizamos para todo ¿verdad? y así nos quitamos de problemas. Esto provoca el antipatrón de diseño llamado singletonitis.

El patrón Singleton también tiene sus inconvenientes, aquí expongo algunos:

  • Crea problemas con las pruebas y su automatización, especialmente por la alta dependencia del código al tratar de hacer pruebas unitarias.
  • Problemas con el threading y concurrencia , aunque se pueden evitar si se implementan usando el tipo enumerado como hemos visto anteriormente.
  • Crea una alta dependencia en el código, un alto acoplamiento que es origen de problemas.
  • Los factores anteriores pueden llevar a la generación de código ilegible (spaguetti code) y problemas de reusabilidad.

Para prevenir estos problemas es necesario usar el Singleton en su contexto adecuado de representar un objeto único en el modelo de datos, y no usarlo como si fuera la panacea….

Deja un comentario

Archivado bajo Metodologías

Patrones de diseño UML

Queridos lectores, esta semana voy a hablaros de los patrones de diseño UML. Sí, eso de lo que tanto habéis oído hablar pero no tenéis muy claro si merece la pena perder horas en aprender, porque a tu querido jefe sólo le interesa que el código funcione lo antes posible y no si está bien programado, ¿verdad?

Así que antes de poner código para que hagáis copy-paste en vuestro proyecto (que os veo venir) os contaré que son los patrones de diseño, y porque se deben conocer y utilizar.

Conceptos básicos

Según el libro de Erich Gamma, Design Patterns: Elements of Reusable Object-Oriented Software, un Patrón de Diseño es «una solución simple y elegante a un problema específico y común del Diseño Orientado a Objetos (DOO)». El origen de este paradigma es dar solución a los problemas que constantemente se repiten en distintos escenarios de programación, proporcionando una solución común, que resuelva el problema con éxito. Esto no significa que los patrones intenten imponer ciertas formas de diseño frente a otras o reducir la creatividad del proceso de programación, simplemente son un recurso para solucionar problemas comunes del desarrollo de software.

No es obligatorio es uso de patrones a la hora de programar, pero si es muy recomendable, ya que son soluciones contrastadas a problemas conocidos de programación, que evitarán que perdáis tiempo reinventando la rueda en vuestro código.

Los patrones se dividen en tres grupos generales:

  1. Patrones de estructura: Se centran en la forma de estructurar las clases
  2. Patrones de creación: Resuelven problemas relacionados con la creación de objetos.
  3. Patrones de comportamiento: definen soluciones para mejorar el comportamiento de la aplicación, sobre todo en tiempo de ejecución.

Y los patrones que engloban son:

Patrones de estructura

  1. Adapter
  2. Bridge
  3. Composite
  4. Decorator
  5. Facade
  6. Flyweight
  7. Proxy

Patrones de creación

  1. Abstract factory
  2. Factory method
  3. Singleton
  4. Builder
  5. Prototype

Patrones de comportamiento

  1. Chain of responsability
  2. Command
  3. Interpreter
  4. Iterator
  5. Mediator
  6. Memento
  7. Observer
  8. State
  9. Strategy
  10. Template method
  11. Visitor

En esta imagen podéis ver como se relacionan los distintos patrones entre sí:
patrones_uml
¿ Agobiados ? No os preocupéis, en próximas entregas os iré explicando en que consiste cada uno de ellos y expondré ejemplos de implementación.

Antipatrones de diseño

Por último , debéis saber que al igual que existen soluciones contrastadas y buenas prácticas, también existen malas prácticas y métodos que llevan a soluciones incorrectas, conocidas como antipatrones de diseño. La lista de antipatrones es mucho más larga que la de patrones de diseño, y también más divertida.  En éste enlace de la Wikipedia aparecen bastantes muy bien detallados.

Deja un comentario

Archivado bajo Metodologías

Programación para niños

El avance de la tecnología en nuestros días es exponencial y nuestra sociedad cada día depende más de las máquinas, pudiéndose programar cada una de ellas utilizando uno o varios lenguajes apropiados según el sistema (incluyendo tu smartphone). Este hecho puede implicar que, en un futuro no muy lejano, el no tener unas mínimas nociones de programación pueda ser tan grave como no saber leer o escribir, por lo que sería beneficioso empezar a enseñar nociones básicas desde niños.

Hace unos años si queríamos introducir a un niño en el mundo del desarrollo era una tarea difícil, incluso lenguajes de alto nivel que facilitan la comprensión de un programa necesitan de un esfuerzo y una tenacidad considerable para asimilar su funcionamiento y utilizarlo posteriormente para crear o mantener un programa mínimamente útil.

La situación actual es mucho mejor, tenemos varios lenguajes que permiten que los niños aprendan como se puede programar de forma amigable para ellos, y dado que a su edad son muy curiosos, esta es una de las mejores edades para que empiecen a comprender como funciona este mundo. El lenguaje de referencia para este fin es Scratch, que con su facilidad de manejo , su cantidad de recursos y la comunidad que lo respalda lo han situado en ese merecido puesto.

Scratch

Es un lenguaje desarrollado por el MIT que está pensado para que los niños puedan iniciarse en el desarrollo jugando. Está dirigido a un rango de edad entre 8-16 años, aunque lo pueden usar perfectamente niños más pequeños con ayuda de un adulto que les guíe, en cualquier caso la manera de programar es muy intuitiva por lo que cualquier persona podría aprender a manejarlo en muy poco tiempo aunque no tenga formación relacionada.

La manera de programar es utilizando bloques de varios tipos y comportamientos personalizables, con ellos se pueden crear historias, juegos y animaciones de forma gratuita desde su sitio web (también se puede descargar). No se necesita aprender la sintaxis propia como en otros lenguajes (JavaScript,C++,etc), sino que toda la programación se hace de manera gráfica, y como consecuencia se evita la frustración propia de que no funcione el programa a la primera (si un desarrollador te dice que siempre le funcionan sus programas sin fallos te está mintiendo como un bellaco), además se anima a que se prueben comportamientos más complejos al poderse comprobar rápidamente el resultado del programa.

Hay que tener en cuenta que este lenguaje está pensado únicamente como entrada al mundo de la programación, en ningún caso se puede usar para aplicaciones serias porque no tiene forma de interactuar con base de datos, sólo permite programar comportamientos muy simples,etc.

Para empezar a programar la comunidad de Scratch dispone de una guía rápida en la que se muestra con dibujos y muy pocas palabras (al estilo de un cuento infantil) como son los bloques básicos, como se configuran y como combinarlos. Una vez aprendido el manejo básico podemos aprender más a fondo las posibilidades de cada bloque echando un vistazo a las cartas Scratch. Esto es equivalente a una API convencional, con la diferencia de que se elimina toda la abstracción usando dibujos que muestran cómo funciona, además el hecho de que se puedan descargar, recortar y pegar las cartas lo hace aún más divertido ya que pueden intercambiarse, compartirse, etc (¿quien no ha trapicheado con cromos cuando era pequeño?). Por último dispone de tutoriales en vídeo donde se pueden ver ejemplos de cómo se hacen programas Scratch paso a paso (explicado en inglés claro).

Para que veáis que no es de boquilla voy a hacer un proyecto que en otros lenguajes conlleva una cierta complejidad, veréis lo sencillo que se hace con Scratch. Nuestro protagonista es Codillo, la mascota de Bonus4Code, que ya era hora de que fuera protagonista de una entrada.

La vida de Codillo

Codillo nació en navidad, todos los miembros del blog pusimos nuestra semillita aunque quien realmente lo parió fue Javi, pero bueno fue un parto natural y ahora estamos muy contentos con la criatura. Durante todo el invierno se ha dedicado a estar de nini en el blog, pero como este jueves empieza la primavera ha decidido moverse un poco para tener un tipín este verano.

Normalmente el comportamiento de Codillo es muy sencillo, primero se levanta por la mañana de buen humor, eso significa que se olvida de todo lo que le haya molestado en el pasado (se inicializa a su tamaño estándar, pone a 0 la variable que indica cuanto se le ha molestado, dice su sonido característico de buenos días y piensa que va a  hacer hoy).

Esta semana tiene intención de hacer algo que no suele hacer y que puede que a otros amigos suyos les apetezca imitarle, por lo que colocamos este comportamiento, recorrer el campo, en una función y la llamamos desde el bloque principal, así podrá reutilizarlo cualquier otro ser fácilmente y Codillo podrá dejarlo cuando quiera sin complicaciones. Este bloque está compuesto por el sonido característico que se hace al empezar a trotar, un mensaje, y un bucle infinito donde el animal irá recorriendo el campo sin salirse de él.

Ahora Codillo tiene su comportamiento fijado, pero aún queda su personalidad, que aunque tiene un gran corazón también tiene prontos si le dan la lata cuando está dando su paseo. Al pinchar con el ratón encima de él disparamos el evento que hará que reaccione, concretamente se quejara, y se acordará cada vez que le molestes incrementando la variable correspondiente en una unidad, lo siguiente que hará será revolverse 10 veces mostrando que no le ha sentado bien, pero como es muy paciente sigue su camino sin más consecuencias. Si sigues metiéndote con él, a la cuarta vez que cuente que se le molesta salta su mal genio (gracias a la estructura de control de Scratch) cambiando su aspecto y diciéndote que piensa de ti, si sigues insistiendo sigue cambiando por eso harías mejor no tentando a la suerte.

Esto es todo, ahora para que empiece el programa ,lo que equivaldría a un main(), begin, etc (según el lenguaje), en Scratch simplemente pincha en la bandera verde. Si quieres parar basta con pinchar el círculo rojo situado al lado. Como puedes comprobar se han utilizado elementos característicos de los lenguajes de programación (variables, bucles, funciones, etc) y ha sido muy sencillo e intuitivo crear el programa. Podéis ver a Codillo en todo su esplendor aquí.

Si te interesa profundizar puedes echar un vistazo a la comunidad ScratchED, donde podrás encontrar otras personas con las que compartir experiencias, preguntar dudas y participar en discusiones, así conseguirás que mejore tu forma de desenvolverte con Scratch.

Existen otras alternativas a Scratch, algunas de ellas son Logo, Crunchzilla Code Monster, Toontalk,etc, pero aunque muchas de ellas tienen un nivel muy bueno, creo que Scratch es la mejor, ya que es una plataforma muy madura que tiene todo lo necesario para enseñar de forma simple, amena y suficiente los conceptos básicos de programación

En resumen, mi generación se crió con el leti-rap y las canciones de Emilio Aragón pero esto lo supera en diversión con creces (y aprenden de paso) así que ¡animaros a enseñar Scratch a los peques! (que además justo hoy es el día del padre)

1 comentario

Archivado bajo Tecnologías

¿Eres un buen programador?

En la actualidad, uno de los mayores retos para las empresas de recruiting a la hora de seleccionar candidatos válidos para ser endorsados a un cliente es la de probar la valía de los individuos en base a lo que saben de programación (o dicen saber). Es por eso que surge Codility, una empresa cuya andadura comenzó en China, cuando su director ejecutivo diseñó una herramienta para ayudar a su equipo a elegir el mejor candidato en entrevistas técnicas. La idea evolucionó para convertirse en una startup que desarrolla y paquetiza dicho software. logo2 ¿El producto? Un sistema de evaluación que consiste en plantear un problema al candidato que debe resolver en menos de un tiempo estipulado usando el lenguaje en cuyas habilidades que el examinador/recruiter quiere comprobar que el candidato pilota. La herramienta cuenta con compilador/intérprete para los lenguajes más populares como C, C++, C#, Java, JavaScript, Pascal, Perl, PHP, Ruby, Python, VB.NET, SQL y Scala. Además permite añadir casos de prueba específicos para probar la solución al problema. 60301v2 Una vez implementada la solución para el problema (ojo que en muchos casos para obtener la solución perfecta se exige que la implementación cumpla ciertas restricciones de complejidad espacio/temporales) se procede a publicar la respuesta, la cual llega directamente al recruiter que solicitó la prueba, generando un informe del siguiente estilo: KNjj3 Actualmente Codility es muy habitual en empresas de recruiting de UK y US; y puede probarse para testar tus habilidades mediante la demo o en la sección «Challenge yourself».

Y si el tener en cuenta el tiempo te parece mucha presión …

Para los pacientes, los que no tengan prisa y que simplemente quieran un desafío está el Proyecto Euler. Si bien no sirve para medir la calidad de tus toneladas de líneas, este proyecto sirve para ejercitar tus habilidades de programación y consta de una serie de problemas matemáticos y/o programación que suponen un reto, ya que requieren algo más que nociones matemáticas para ser resueltos. pe_banner_light La motivación del Proyecto Euler es la de proveer de una plataforma para introducir a aquellas personas que así lo deseen en áreas poco familiares y el aprendizaje de nuevos conceptos de una manera divertida. La plataforma permite registrarse de manera gratuita e ir publicando las soluciones a los, hasta ahora publicados, 455 problemas; de manera que siguiendo un sistema de logros se busca mantener el interés del usuario en la resolución de los citados problemas matemáticos.

En resumidas cuentas …

Mientra que Codility te permite tener una visión más detallada sobre el grado cualitativo de las soluciones que aportas a determinados problemas, ProjectEuler te permite ejercitar poco a poco tus habilidades como programador, mantenerlas al día y libre de oxidación. ¡Happy coding!

Deja un comentario

Archivado bajo Herramientas

Sublime Text

sublime-text-logoi bien es cierto que todo el mundo tiene un IDE preferido para programar en cualquier lenguaje, los hay que son más osados y que viven al límite. Y es por eso que deciden echarse al monte con un editor de texto y el compilador de turno (he visto rayos-C y programadores tirando de vi y javac más allá de la puerta de Tannhauser). Muchas veces es por friquismo, por minimalismo y otras es porque simplemente el IDE se queda corto cuando quieres exprimir el lenguaje sin necesidad de florituras. En este post me gustaría hablar de Sublime Text, un editor de texto en toda regla, esencial cuando aprendes a usarlo.

La criatura en cuestión ve su primera versión en enero de 2008 de la mano de su creador Jon Skinner y desde entonces viene distribuyéndose de manera gratuita, aunque para evitar un molesto aviso de que no has pagado la licencia (¡cómo se te ocurre!) es preciso aportar una pequeña cantidad que ronda actualmente los 70 dólares americanos. Con esa salvedad, la funcionalidad es completa desde el primer momento.

Características principales

En realidad enumerarlas todas sería para escribir un blog entero (mmm espera …) pero entre las más usadas  y más destacadas, se encuentran las siguientes:

  • Multicursor (Ctrl + clic)  permite seleccionar múltiples cursores a lo largo del texto y poder escribir, borrar o seleccionar sobre todos ellos simultáneamente
  • Multiselección (Ctrl + D) cada vez que se presiona, se selecciona la siguiente coincidencia del texto seleccionado.
  • Resaltado de sintaxis configurable
  • Minimapa del documento (muestra en miniatura el documento actual para desplazarse por él más rápidamente).
  • Keybindings configurable
  • Búsqueda de símbolos (Ctrl + P) permite buscar símbolos/ficheros dado el conjunto de proyectos disponibles

    sublime-text

    Búsqueda de símbolo

  • Resaltado de indentación (Ctrl + Shift + M) selecciona el contenido que se encuentra encerrado entre dos llaves, paréntesis, corchetes.
  • Build systems (Da soporte nativo a la compilación de proyectos Java, Python, C++,Haskell,Ruby, …) que permite configurar la compilación de los ficheros que creemos/editemos con Sublime Text

Plugins

Ni que decir tiene, que Sublime cuenta además con una API basada en Python, que permite la implementación de plugins. A través del Package Control se pueden instalar plugins disponibles a través de repositorios Github o BitBucket.

Instalación paquete Sublime

Ejemplo de instalación de paquete desde Package Control

En resumidas cuentas …

Por todo lo antes mencionado, y dado que es multi-plataforma y que se puede combinar su uso con el de cualquier compilador (a veces sin que esto sea realmente necesario); considero esta como una de las herramientas indispensables para el desarrollo de software en la era actual. ¡El editor suizo de todo buen programador! Preparado para recibir escarnio público por parte de la gente UNIX que programa con consola. En 3 … 2 … 1 …

1 comentario

Archivado bajo Herramientas