Mostrando entradas con la etiqueta Desarrollador. Mostrar todas las entradas
Mostrando entradas con la etiqueta Desarrollador. Mostrar todas las entradas

domingo, 10 de julio de 2016

Patrones de diseño: herramientas fundamentales para el programador



Ya sea que seas un desarrollador de software experimentado o que a penas comiences tus primeros pasos en este apasionante mundo, seguramente en más de una ocasión te toparás con el término "patrones de diseño". O si no lo has escuchado como tal, seguramente ya estás usando alguno sin darte cuenta.

Los patrones de diseño son una de las herramientas más útiles que deben encontrarse en el arsenal de todo programador. Y si bien hay bastantes patrones distintos, no está de más que todo desarrollador conozca, al menos, los más utilizados.


¿Qué son los patrones de diseño?


Los patrones de diseño fueron definidos por primera vez por Christopher Alexander en 1977 de la siguiente forma:

Un patrón describe un problema que ocurre una y otra vez en nuestro entorno, y luego procede a describir la esencia de la solución a dicho problema de un modo tal que uno puede utilizar la solución un millón de veces, pero sin aplicarla dos veces de la misma manera.

Lo interesante de la definición anterior es que Alexander no está hablando sobre diseño de software sino sobre arquitectura (como en la construcción de edificios, casas, puentes, etc.). Tomemos un momento para analizar la definición a fin de comprender su significado.

Un patrón describe un problema que ocurre una y otra vez en nuestro entorno...

En el desarrollo de software, sin importar la aplicación que estemos desarrollando, siempre nos encontramos con la misma clase de problemas: tal vez necesitamos recibir una notificación cuando un proceso termine (como cuando se completa una llamada asíncrona), o tal vez necesitemos ser notificados cuando el estado de una propiedad particular cambie. Tal vez tenemos una API compleja que queremos compartir con otros desarrolladores, pero deseamos que sea fácil interactuar con ella, de modo que no se necesiten comprender los detalles complejos de dicha API. Tal vez queremos añadir funcionalidades aun objeto existente aún cuando no tenemos el código fuente de dicho objeto o somos incapaces de heredarlo (como en el caso de las clases selladas en C#). Tal vez queramos recorrer los elementos de una colección de modo que podamos mostrarlos o realizar alguna otra acción sobre ellos. Estos son sólo algunos de los problemas comunes con los que nos encontramos al desarrollar software, pero puede haber muchísimos más.

...y luego procede a describir la esencia de la solución a dicho problema...

Los patrones de diseño no nos dan una implementación específica, sino que nos describen simplemente las partes que debe incluir una solución y la interacción entre ellas. En otras palabras, son sólo el esqueleto de la solución a problemas comunes en el desarrollo de software. Los patrones de diseño, pues, brindan una solución ya probada y documentada a problemas de desarrollo de software que están sujetos a contextos similares.

...de un modo tal que uno puede utilizar la solución un millón de veces, pero sin aplicarla dos veces de la misma manera.

Este es un aspecto importante de los patrones de diseño: nosotros elegimos cómo implementarlos. Los patrones son conceptuales en naturaleza, por lo que su implementación concreta depende de la necesidad particular que queramos resolver. Por ejemplo, en el mundo de la arquitectura podemos tener un problema común: la necesidad de colocar un techo sobre un espacio abierto. Para resolverlo, podemos contar con diferentes patrones de techo: abovedado, con arcos, plano, de dos aguas, etc. Y cuando vamos a cada uno de estos patrones, podemos encontrarnos con aplicaciones más especificas para cada uno; por ejemplo, si elegimos el techo de dos aguas, este puede ser piramidal, en forma de cruz, con capo, etc. Y aún cuando seleccionemos uno de estos patrones, no tenemos todavía una implementación particular del mismo, como las consideraciones sobre la superficie a cubrir, los materiales a usar, los ángulos en los que se levantarán los techos, etc. Dada su naturaleza conceptual, los patrones de diseño serán interpretados e implementados de manera diferente por personas diferentes. No hay ningún problema en ello, pues los patrones sólo nos muestran la esencia de la solución y no sus detalles particulares.





Partes de un patrón de diseño.


Los patrones de diseño se encuentran descritos usualmente en catálogos, libros y artículos especiales sobre el tema y siempre poseen varios elementos en comun:


  • Nombre del patrón. Este es el nombre particular con el cual se identifica al patrón en las conversaciones entre desarrolladores. Algunos ejemplos de nombres de patrones de diseño son: Fábrica abstracta (Abstract Factory), Método de Fabricación (Factory Method), Fachada (Facade), Observador (Observer), Singleton, Cadena de Responsabilidad (Chain of Responsibility) entre muchos otros.
  • Descripción del problema. Como descubrimos en la definición de Alexander, existen problemas comunes en el desarrollo de software con los que nos toparemos en más de una ocasión, y en esta parte del patrón se define dicho problema a detalle.
  • Solución al problema. Consiste en la descripción de los elementos que conforman el diseño de la solución incluyendo las relaciones entre ellos, sus responsabilidades y la forma en que colaboran entre si para resolver el problema. Recordemos que esta es sólo la esencia de la solución y no una implementación concreta. Le toca al desarrollador determinar qué implementación es la más apropiada para un problema específico.
  • Consecuencias. Cada patrón tiene un costo, el cual es frecuentemente ignorado. Como desarrolladores acostumbramos hablar de las ventajas de un patrón en particular y de cómo representa la solución perfecta a un problema. Pero la realidad es que cada beneficio tiene un costo asociado. Cuando se trata de patrones de diseño, el costo suele ser un incremento en la complejidad de nuestro código. Debemos conocer bien las consecuencias de un patrón para sopesarlas cuidadosamente contra los beneficios de su implementación.



Clasificación de los patrones de diseño

Dado que el desarrollo de software es una disciplina que se encuentra en constante evolución, existen muchos patrones de diseño distintos que se aplican a distintos problemas comunes. Sin embargo y a pesar de su diversidad, los patrones de diseño pueden clasificarse en tres grandes grupos:

  • Patrones creacionales: Tratan sobre la mejor forma de instanciar, inicializar y configurar objetos en una aplicación.
  • Patrones estructurales: Se utilizan para separar la interfaz de la implementación. Se ocupan de cómo las clases y objetos se agrupan, para formar estructuras más grandes.
  • Patrones de comportamiento: Se usan para definir cómo las clases y los objetos interactúan entre ellos.



Esta clasificación aparece por primera vez en el libro Design Patterns: Elements of Reusable Object-Oriented Software, escrito en 1994 por un grupo de autores conocidos como The Gang of Four: Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides. Este libro se ha convertido en el referente obligado sobre el tema y permanece vigente hasta hoy, por lo que debería formar parte de la biblioteca personal de cualquier desarrollador de software.

¿Por qué usar patrones de diseño?

Existen varias razones por las cuales un desarrollador debe aprender, comprender e implementar el uso de los patrones de diseño en su práctica diaria de escritura de código:


  • Los patrones de diseño son soluciones probadas. Alguien más listo que nosotros ya analizó el problema y desarrolló una solución. No hay necesidad de que reinventemos la rueda. Lo mejor que podemos hacer es comenzar con la solución de alguien más y ajustarla a las necesidades específicas de nuestra aplicación.
  • Los patrones de diseño nos proveen un vocabulario común. Todas las profesiones poseen términos especializados que emplean para comunicar conceptos específicos entre especialistas. Los patrones de diseño le dan a los desarrolladores de software esa misma clase de lenguaje especializado. Un vocabulario común nos permite usar lenguaje preciso cuando nos comunicamos con otros desarrolladores.
  • Hablar de patrones de diseño anima a otros desarrolladores a investigar y aprender sobre el tema. Después de todo, si un desarrollador escucha a otros hablando sobre el patrón de fachada y cómo resultó ser una buena solución para una aplicación particular, entonces dicho desarrollador probablemente será lo suficientemente curioso como para averiguar qué es ese patrón y por qué es tan bueno. Esto ayuda a difundir el uso de los patrones de diseño en nuestra industria y, por lo tanto, a mejorar la calidad del software que construimos.


En conclusión

El uso de patrones de diseño nos ayudará a estandarizar nuestro código de modo que sea más entendible para otros programadores (y aún para nosotros mismos). Si nunca has usado patrones de diseño, es hora de comenzar a hacerlo.


Enlaces




viernes, 8 de abril de 2016

Bing añade una fabulosa herramienta para desarrolladores



Sin duda alguna Bing, el buscador de Microsoft, está lejos de ser un rival digno para el aparentemente omnipotente Google. Sin embargo, de vez en cuando a los de Redmond se les ocurren muy buenas ideas y esta es una de ellas.

Se trata de una interesante característica del buscador que será de bastante utilidad a quienes nos dedicamos al desarrollo de software. Y es que en más de una ocasión acudimos a los todopoderosos motores de búsqueda buscando algún snippet para alguna tarea simple y repetitiva que podamos implementar sin mayores complicaciones. La mayoría de las veces, nuestra búsqueda nos lleva a foros de ayuda como Stack Overflow en los cuales solemos encontrar lo que buscamos.

Pero ahora Bing, en colaboración con HackerRank, ha incluido en los resultados de búsqueda un editor de código interactivo cuyo resultado puede ejecutarse directamente desde esa página para entender cómo funciona. Si, por ejemplo, busco "array C#" en Bing, obtengo algo como esto:



Cabe mencionar que por ahora la funcionalidad regresa resultados para los lenguajes C, C++, C#, Python, PHP y Java (aunque incluirán más en el futuro) y que para que podamos ver estos resultados debemos especificar nuestra ubicación como EU y el lenguaje inglés en las preferencias del sitio, a las cuales accedemos mediante el ícono de un engrane ubicado en la esquina superior derecha.

Dudo mucho que alguien cambie de Google a Bing por esto, pero no deja de ser una herramienta bastante útil a tener en cuenta.






miércoles, 26 de agosto de 2015

Lógica de Programación (30) - Arrays unidimensionales: los vectores

Todos hemos sido parte de un array en algún momento...

Un array o arreglo se define formalmente como un conjunto finito y ordenado de elementos homogéneos. Cuando decimos "ordenado" nos referimos al hecho de que cada uno de los elementos puede ser identificado por un índice numérico; por otro lado, decimos que el conjunto es "homogéneo" porque todos los elementos son del mismo tipo de dato, es decir, todos son cadenas o enteros o booleanos, etcétera. El tipo más simple de array es el array unidimensional, también conocido como vector

En un vector, cada uno de sus elementos puede ser identificado mediante el uso de un índice numérico que nos indica su posición dentro del mismo, mientras que sólo el vector completo tiene un nombre propio. En la siguiente figura se representa un vector llamado "Calificaciones" que contiene 5 elementos, numerados del 0 al 4 *.


Para referirnos a cada uno de los elementos del vector, usamos la siguiente notación:

VECTOR[índice]

Por ejemplo:

Calificaciones[1] tiene un valor de 10
Calificaciones[4] tiene un valor de 7

Además, cada elemento del vector puede ser tratado como si fuera una variable independiente. Por ejemplo, podemos tener una variable Suma cuyo valor sea la suma de dos o más elementos del vector:

Suma <- Calificaciones[2] + Calificaciones[4]

En este ejemplo, la variable Suma tendría un valor de 15.

Si deseamos asignar un valor a uno de los elementos del vector, basta con referirnos al elemento por su índice y asignarle el valor deseado. Así, la expresión Calificaciones[3] <- 8 asigna el valor de 8  a la posición 3 del vector, sustituyendo cualquier valor que haya estado almacenado previamente.

Por otro lado, los índices de un vector pueden ser enteros, variables o expresiones enteras. Por ejemplo, si tenemos una variable i <- 1

Calificaciones[i] representa el elemento Calificaciones[1] cuyo valor es 10
Calificaciones[i+3] representa el elemento Calificaciones[4] cuyo valor es 7

El hecho de que podamos acceder individualmente a cada uno de los elementos del array representa una de sus ventajas más importantes: el almacenamiento de información.

NOTAS

* La mayoría de los lenguajes de programación comienzan en 0 la numeración de las posiciones de los elementos de un array. Así, un vector de 10 elementos los verá numerados del 0 al 9. A esta práctica se le conoce como indexación base cero.

ACTIVIDADES DE APRENDIZAJE

Considera el siguiente vector:



Escribe el resultado de cada una de las siguientes operaciones realizadas con los elementos de dicho vector:
  • escribir(Números[1])
  • Números[4] <- 32.5
  • Suma <- Números[1] + Números[5] + Números[6]
  • Suma <- Suma + Números[5]
  • Números[i+2] = Números[i] + Números[i+1] (suponiendo que i<-0)

Certificaciones gratis en Brainbench



Brainbench es un sitio web que se especializa en otorgar certificaciones en diversas áreas a sus usuarios a través de una cuenta gratuita, aunque no todas las certificaciones ofrecidas son sin costo. 

El sitio ofrece certificaciones en temas tan variados como Tecnologías de la Información (Desarrollo de software, Bases de Datos, Soporte Técnico, entre muchos otros), Administración, Idiomas, Finanzas, Salud, Servicio al cliente y muchos más.



Muchos de los exámenes de certificación de Brainbench son de paga (aprox. 50 usd cada uno), pero existen muchos que son totalmente gratuitos. Si bien el costo de los exámenes es elevado, la plataforma ofrece un sistema de suscripción con pago mensual que nos da acceso a su catálogo completo de las de 600 exámenes sin restricciones, lo cual es bastante atractivo.


Ahora bien, las certificaciones de Brainbench sólo son avaladas por ellos mismos y no por los fabricantes, pero nunca está de mas tener nuestros conocimientos y habilidades respaldadas por una entidad evaluadora externa. Además, tomar estos exámenes bien puede servirnos de entrenamiento para cuando decidamos tomar una certificación directa con algún fabricante de tecnología o de algún otra área de conocimientos.



Enlace: Brainbench



jueves, 9 de julio de 2015

Lógica de Programación (29) - Introducción a las estructuras de datos

¿Estructuras complejas formadas por muchas unidades pequeñas? Existen, y un edificio de departamentos es un buen ejemplo de ello.


En las lecciones anteriores se ha introducido el concepto de datos de tipo simple que representan valores de tipo simple, como un número entero, real o un carácter. En muchas situaciones se necesita, sin embargo, procesar una colección de valores que están relacionados entre sí por algún método, por ejemplo, una lista de calificaciones, una serie de temperaturas medidas a lo largo de un mes, etc. El procesamiento de tales conjuntos de datos, utilizando datos simples, puede ser extremadamente difícil y por ello la mayoría de los lenguajes de programación incluyen características de estructuras de datos. Las estructuras de datos básicas que soportan la mayoría de los lenguajes de programación son los «arrays» —concepto matemático de «vector» y «matriz»—. Un array o arreglo en Latinoamérica es una secuencia de posiciones de la memoria central a las que se puede acceder directamente, que contiene datos del mismo tipo y pueden ser seleccionados individualmente mediante el uso de subíndices. A partir de esta lección estudiaremos el concepto de arrays unidimensionales y multidimensionales, así como el procesamiento de los mismos. 

La importancia de las computadoras radica fundamentalmente en su capacidad para procesar información. Esta característica les permite realizar actividades que antes sólo las realizaban los humanos. Con el propósito de que la información sea procesada, se requiere que ésta se almacene en la memoria de la computadora. 

De acuerdo con la forma en que los datos se organizan, se clasifican en: 

  • Tipos de datos simples. 
  • Tipos de datos estructurados. 


La principal característica de los tipos de datos simples consiste en que ocupan sólo una casilla de memoria; por tanto, una variable simple hace referencia a un único valor a la vez. En este grupo de datos se encuentran: números enteros y reales, caracteres, booleanos, enumerados y subrangos. Cabe señalar que los dos últimos no existen en algunos lenguajes de programación. 

Por otra parte, los tipos de datos estructurados se caracterizan por el hecho de que con un nombre -identificador de variable estructurada- se hace referencia a un grupo de casillas de memoria. Es decir, un tipo de dato estructurado tiene varios componentes. Cada uno de éstos puede ser un tipo de dato simple o estructurado. Sin embargo, los componentes básicos, los del nivel más bajo, de cualquier tipo de datos estructurado son siempre tipos de datos simples. 

O, para representarlo de un modo más gráfico:


En la siguiente lección vamos a conocer la estructura de datos más simple: el arreglo unidimensional. ¡Hasta la próxima!



Enlace: Índice del curso




¿Cuánto gana un desarrollador de software en el mundo?



La demanda por desarrolladores de software ha ido creciendo en los últimos años alrededor del mundo y esa tendencia parece seguir creciendo día a día. Es posible que incluso el mundo se encuentre con un déficit de desarrolladores, por lo que gobiernos, empresas y universidades ya han echado a andar diversas iniciativas para lograr interesar a cada vez más personas en esta apasionante actividad.

Y para motivar aún más, nada mejor que analizar los ingresos que percibe un desarrollador alrededor del mundo según la tecnología que domina, su ubicación, el tipo de empresa en el que trabaja, etc. Esta interesante infografía del sitio Funders and Founders nos revela en cuánto andan los ingresos de un desarrollador de software según diversos criterios.




¿Les interesa entrarle al mundo del desarrollo de software pero no saben ni por dónde empezar? Bueno, en este blog comparto un curso de Lógica de Programación destinado a principiantes absolutos. Puede que sea un buen lugar para empezar :) 








domingo, 21 de junio de 2015

Lógica de Programación (26) - Ámbito de las variables

En esta lección vamos a aprender una de las más útiles características de la programación modular: el uso de variables locales y globales en nuestros programas.

Se dice que una variable es local cuando está declarada y definida dentro de algún subprograma (ya sea una función o un procedimiento). El significado y la utilidad de una variable local están limitados únicamente al subprograma donde fue definida, es decir, el valor que tenga almacenado no será accesible para ningún otro subprograma. Ahora bien, pueden definirse variables locales con el mismo nombre en distintos subprogramas, pero eso no quiere decir que se refieran a la misma posición de memoria o al mismo valor.

Por otro lado, una variable global es la que se declara en el programa o algoritmo principal, del cual dependen todos los demás subprogramas. A diferencia de las variables locales, las globales tienen la ventaja de compartir información entre subprogramas. Una variable global es útil y accesible tanto en el programa principal como en todos los subprogramas que dependan de él. Cualquier subprograma puede acceder y modificar el valor de una variable global.

El ámbito o alcance (scope, en inglés) de una variable es la parte del programa o algoritmo en el que una variable definida, conocida y acesible. En la siguiente figura podemos ver una descripción conceptual del ámbito de diferentes variables:

Ámbito de identificadores
En esta figura, podemos observar que:
  • Las variables X1 y X2 son globales por estar definidas en el algoritmo principal y serán accesibles desde cualquier parte del programa, incluidos todos los subprogramas que dependan de él. 
  • Las variables Y1 y Y2 son locales al procedimiento A y serán accesibles únicamente dentro de ese procedimiento y también por los subrogramas que dependan de él (como el procedimiento B). 
  • Las variables Z1 y Z2 son locales al procedimiento B y son accesibles única y exclusivamente por él.
  • Las variables W1 y W2 son locales al procedimiento C y son accesibles única y exclusivamente por él.
Para explicarlo aún mejor, mira este otro esquema donde podemos observar la accesibilidad que tienen las variables definidas en distintos niveles de un programa con subprogramas anidados:


En el siguiente ejemplo definimos la función signo que realiza la siguiente tarea: si el número dado es 0, entonces devuelve un 0, si es positivo, devuelve un 1 y si es negativo devuelve un -1.


algoritmo Signos
var
   entero: a, b, c
   real: x, y, z
inicio
   x <- 5.4
   a <- signo(x)
   y <- 0
   b <- signo(y)
   z <- 7.89
   c <- signo (z - 9)
   escribir ("Las respuestas son " + a +" " + b + " " + c)
fin

entero función signo (real x)
var
   entero: s
inicio
   si x = 0 entonces s <- 0
   si x > 0 entonces s <- 1
   si x < 0 entonces s <- -1
   devolver (s)
fin_función


En este ejemplo, la variable s, declarada dentro de la función signo, es local y accesible únicamente dentro de ese procedimiento.

Es importante comprender el concepto de ámbito de variables dado que muchos de los errores de programación se dan por no considerar correctamente la accesibilidad que tendrá una variable en un determinado programa. En la próxima lección aprenderemos cómo podemos aprovechar las variables locales y globales para pasar parámetros a nuestros procedimientos y funciones. ¡Hasta la próxima!


Enlace: Índice del curso



viernes, 12 de junio de 2015

Lógica de Programación (25) - Procedimientos


En la lección anterior aprendimos que las funciones reciben una serie de parámetros que luego son procesados para devolver un resultado. Dado que las funciones regresan un valor, es necesario que cada función tenga un tipo de retorno asignado, el cual se especifica cuando se declara la función.

Un procedimiento es similar a una función, pero con notables diferencias:

  • Una función devuelve sólo un valor, mientras que un procedimiento puede regresar cero, uno o muchos valores a la vez.
  • Los procedimientos se declaran de manera similar a las funciones, excepto que no se necesita especificar ningún tipo de retorno.


Los procedimientos se declaran con esta sintaxis:

procedimiento nombre [(lista de parámetros)]
   <acciones>
fin_procedimiento

En este ejemplo pedimos al usuario que nos proporcione dos números enteros para calcular su suma y su producto usando procedimientos.

algoritmo Calcular_operaciones
var
   entero: a, b
inicio
   escribir ("Escribe el primer número: ")
   leer(a)
   escribir ("Escribe el segundo número: ")
   leer (b)
   suma(a,b)
   producto(a,b)
fin

procedimiento suma(entero a, entero b)
var
   entero: sum
inicio
   sum <- a + b
   escribir ("La suma de ambos números es: ", sum)
fin_procedimiento

procedimiento producto(entero a, entero b)
var
   entero: prod
inicio
   prod <- a * b
   escribir ("El producto de ambos números es: ", prod)
fin_procedimiento


Como podemos observar, cada uno de los procedimientos recibe como parámetros los dos números leídos en el programa principal. Con esos argumentos, cada procedimiento hace las operaciones solicitadas y muestra el resultado. Observa que el procedimiento no regresa ningún valor al programa principal, sino que la salida se muestra directamente dentro del cuerpo del procedimiento. Cuando el procedimiento suma(a,b) termina su labor, regresa el control al programa principal que, a su vez, llama al procedimiento producto(a,b) para que ejecute sus tareas. Cuando este termina regresa el flujo al cuerpo del programa principal para entonces terminar la ejecución.

En el ámbito de los lenguajes de programación actuales, tanto las funciones como los procedimientos son bastante utilizados en la forma de métodos dentro de clases, uno de los elementos de la programación orientada a objetos más utilizados en la actualidad. No vamos a profundizar mucho en este concepto, pero vale la pena mencionarlo para futuras referencias.

ACTIVIDADES DE APRENDIZAJE

  • Repite cada uno de los ejercicios de la lección anterior pero esta vez usa procedimientos en lugar de funciones para resolverlos.








martes, 9 de junio de 2015

Lógica de Programación (24) - Funciones



Ya en la lección anterior aprendimos que los subalgoritmos o subprogramas son una forma efectiva de atacar un problema complejo dividiéndolo en varios problemas más sencillos de resolver. En esta lección vamos a aprender una manera de lograr esta subdivisión a través del uso de funciones.

Si nos vamos a la definición matemática, una función es una operación que toma uno o más valores llamados argumentos y produce un valor determinado llamado resultado, que es el valor de la función para los argumentos dados. En la octava lección de este curso, aprendimos que en programación existen algunas funciones predeterminadas diseñadas para llevar a cabo cierta tarea o algún cálculo específico; para usarlas, sólo tenemos que "invocarlas" y pasarles algunos argumentos para obtener el resultado buscado. Por ejemplo, aprendimos que la función potencia(b,e) requiere de dos parámetros: base (b) y exponente (e), para regresar el resultado de elevar la base al exponente dado. Todas las funciones que aprendimos en aquella lección se llaman funciones internas porque ya están predefinidas en la mayoría de los lenguajes de programación. Sin embargo, también podemos desarrollar e invocar nuestras propias funciones, a las cuales se les conoce como funciones externas.

Cuando las funciones estándar no permiten realizar la función o cálculo deseado es necesario recurrir a las funciones externas que pueden ser definidas mediante una declaración de función, la cual tiene esta sintaxis:

<tipo_de_resultado> función <nombre_funcion> (lista de parametros o argumentos)
[declaraciones locales]
inicio
    <acciones> //cuerpo de la función
   devolver (<expresion>)
fin_función

En esta sintaxis vemos que debemos especificar varios componentes importantes:

  • El tipo de resultado que nos devuelve la función (si es entero, real, cadena, etc)
  • El nombre de la función con la que la vamos a invocar en nuestro algoritmo
  • La lista de parámetros o argumentos necesarios para la función. Esta lista debe tener un formato similar a este: (tipo_de_dato: argumento1, tipo_de_dato: argumento2...)
  • Las acciones que va a realizar la función con esos argumentos
  • La sentencia devolver, en la cual indicamos cuál es el resultado que va a entregar la función. Esta sentencia termina inmediatamente la función en la cual se ejecuta, por lo que siempre debe estar situada al final, justo antes del fin de la función. Es importante recordar también que una función sólo debe regresar un valor único.

Vamos a imaginar que la función potencia(b,e) no existe y tenemos que programarla nosotros mismos. El algoritmo completo de un programa que solicita al usuario los valores de la base y el exponente y luego muestra el resultado del cálculo, debería verse algo así:

algoritmo calcular_potencia
var
   real: base, exponente, res
inicio
   escribir("Introduce el valor de la base: ")
   leer(base)
   escribir("Introduce el exponente: ")
   leer(exponente)
   res <- potencia(base,exponente)
   escribir("El resultado calculado es: ", res)
fin

real función potencia(real b, real e)
var 
   real: resultado
   entero: i 
inicio
   resultado <- 1
   desde i<-1 hasta e hacer
      resultado <- resultado * b
   fin_desde
   devolver (resultado)
fin_función

Como puedes observar, el pseudocódigo correspondiente a la función potencia se encuentra localizado fuera del cuerpo del algoritmo principal (calcular_potencia). Sin embargo, ese código es ejecutado en el momento que se llama a la función por su nombre y se le pasan los parámetros correspondientes. Observa también que no es necesario que los nombres de las variables que se pasan como argumentos (base, exponente) sean iguales a las variables que recibirán dichos datos en la función (b,e). Cuando hagamos la invocación a la función, los valores se corresponderán en el mismo orden que los pasemos, es decir, el valor de base se asignará a b y el valor de exponente se asignará a e. Por supuesto, si queremos evitar usar tantos nombres distintos, podemos usar los mismos nombres para las variables tanto en la declaración de la función como en su llamada desde el programa principal. En ambos casos el resultado será el mismo. Finalmente, observa que una vez que se ejecuta el cuerpo de la función, se devuelve el valor almacenado en la variable resultado, el cual, al regresar al algoritmo principal, se almacena en la variable res, que es la que finalmente mostramos al usuario. En cierto sentido, para el programa principal, el funcionamiento de la función potencia es una caja negra, pues sólo le interesa que devuelva el resultado del cálculo sin importar cómo se hace.

Mira cómo se ve este ejemplo corriendo en C#:



Ahora veamos otro ejemplo. En el siguiente algoritmo, creamos un programa que utiliza una función para calcular el factorial de un número dado por el usuario. Por si no lo recuerdas, el factorial de un número n, representado como n!, es igual al producto de todos los números que están por debajo de n, incluyendo a este último. Es decir: n! = n * (n-1) * (n-2) * (n-3) ...

entero función factorial (entero n)
var
   entero: i, f
inicio
   f <- 1
   desde i<-1 hasta n hacer
      f <- f * i
   fin_desde
   devolver (f)
fin_función

algoritmo calcular_factorial
var
   entero: n
inicio
   escribir("Dame un número entero: ")
   leer(n)
   escribir("El factorial de ", n, " es igual a ", factorial(n))
fin

Si te fijas bien, en este listado el código de la función está antes del algoritmo principal. Esto también es perfectamente válido (de hecho, algunos lenguajes de programación exigen que se declaren primero las funciones, antes del programa principal). También observa que en este caso no asignamos el resultado de la invocación de la función a una variable, sino que directamente estamos escribiendo el resutlado sin usar una variable intermedia. El usuario nunca verá en pantalla el texto "factorial(n)", sino que verá el resultado del cálculo junto con el resto del mensaje que le estamos mostrando.

Mira cómo funciona este programa en C#:



En este último ejemplo creamos no una sino dos funciones que se llaman mutuamente y trabajan en conjunto para calcular el área de un polígono de n lados.

algoritmo area_poligono
var
   real: n, lado, ap, area
inicio
   escribir("¿Cuántos lados tiene el polígono? ")
   leer (n)
   escribir("¿Cuál es la medida de esos lados? ")
   leer(lado)
   escribir("¿Cuánto mide el apotema? ")
   leer(ap)
   area = area_poligono(n, lado, ap)
   escribir("El área del polígono es de ", area)
fin

real función area_poligono(real n, real lado, real ap)
var
   real: area
inicio
   area = perimetro(n, lado) * ap
   devolver (area)
fin_función

real función perimetro(real n, real lado)
inicio
   devolver n * lado
fin_función

Observa cómo funciona este código en C#:



En estos ejemplos ha quedado en evidencia la utilidad de las funciones como un medio para dividir un problema complejo en pequeños problemas más fáciles de resolver y así llegar a una solución a dicho problema. Sin embargo, las funciones tienen una limitación importante: sólo pueden devolver un valor a la vez. ¿Qué pasa si necesito devolver dos o más valores? Para eso existen los procedimientos, los cuales vamos a estudiar en la siguiente lección. ¡Hasta la próxima!

ACTIVIDADES DE APRENDIZAJE


  • Escribe un algoritmo que use una función creada por tí para encontrar el mayor de dos números enteros dados por el usuario.
  • Diseña una función booleana llamada Digito que determine si un caracter dado por el usuario es uno de los dígitos del 0 al 9
  • Escribe una función que transforme un número entero dado en su correspondiente número romano (nota: limita los números a convertir al rango de 1 a 3999 únicamente)


Enlace: Índice del curso




lunes, 8 de junio de 2015

Tutorial: Codenvy Esencial


Soy usuario de una HP Chromebook desde hace algunos meses y, aunque inicialmente la compré sólo por la curiosidad de conocer el sistema operativo de Google, Chrome OS, poco a poco se convirtió en mi laptop favorita para mis tareas cotidianas: checar Email, Facebook y Twitter, ver videos en YouTube o Netflix y hasta crear documentos usando Google Docs. Una Chromebook es, en general, una PC perfecta para cualquiera que le de un uso normal y cotidiano a una computadora(1).

Pero luego me empezó a surgir la duda sobre la posibilidad de desarrollar software en una de estas máquinas. Yo soy de esos que acostumbra instalar todo un entorno de desarrollo a penas me hago de una PC nueva, pero con una Chromebook la cosa no es tan fácil, dado que las herramientas que suelo instalar para desarrollar (servidor web, mysql, php, sublime text, visual studio, etc) no están disponibles para el sistema operativo de Google.

Así que, investigando sobre herramientas para desarrollar software directamente en la nube y sin salir del navegador, me topé con una de las más completas y potentes herramientas gratuitas disponibles en el mercado, y que además está totalmente recomendada por Google: se trata de Codenvy, un IDE con potentes funcionalidades listas para desarrollar software sin mayores complicaciones.




¿Y qué es Codenvy? Bueno, en esencia es un entorno alojado totalmente en la nube diseñado para codificar, compilar y depurar aplicaciones en distintos lenguajes de programación como Java, PHP, Ruby on Rails, JavaScript, HTML o CSS.

Codenvy cuenta con una gran cantidad de herramientas dedicadas a facilitar la vida del desarrollador de software al permitirle dedicar más de su tiempo a escribir código y menos a la configuración de un entorno de trabajo adecuado. Y es que cuando se pretende desarrollar software debe configurarse primero todo un ambiente de trabajo que, dependiendo del lenguaje y la tecnología en que se pretenda desarrollar, puede convertirse en una tarea bastante tediosa, complicada y propensa a errores.

La propuesta de Codenvy es proporcionarnos ambientes de trabajo preconfigurados de modo que sólo seleccionemos la plataforma en la que deseamos trabajar y nos dediquemos a escribir los códigos correspondientes, dejando que Codenvy se encargue de las configuraciones y las instalaciones previas por nosotros literalmente con un solo clic.

Lo mejor de todo es que Codenvy corre en cualquier navegador y cualquier sistema operativo, lo que hace que la herramienta sea más versátil aún. Con esta característica, podemos acceder a nuestros proyectos y nuestro ambiente de desarrollo completo aún cuando no nos encontremos en nuestra propia computadora. El sueño de todo desarrollador.

En este pequeño tutorial voy a demostrar cómo crear una muy pequeña aplicación con HTML/CSS/Javascript y PHP usando Codenvy .

Primer paso: crea una cuenta.

Crear una cuenta en Codenvy es totalmente gratis. Si bien la plataforma tiene algunos planes de pago, la cuenta gratuita es más que suficiente para un desarrollador que trabaja en solitario o en un equipo pequeño, pues incluye:
  • Espacios de trabajo, proyectos, desarrolladores y tiempo de uso del IDE ilimitados
  • Máquinas virtuales con hasta 4GB de RAM
  • Máquinas siempre encendidas
  • 20 GB-horas gratis por mes (2)
  • Foros de ayuda
También podemos acceder a Codenvy con nuestra cuenta de Google o Github

Registrarnos para una cuenta de Codenvy toma muy poco tiempo dado que no se requiere de un largo y tedioso proceso de registro. Basta con introducir una dirección de correo electrónico, el nombre del espacio de trabajo que queremos crear y hacer clic en Sign Up. Esto enivará un correo electrónico a nuestro buzón en el cual encontramos un enlace para activar nuestra cuenta y listo: una vez confirmada la cuenta, estamos dentro de nuestro espacio de trabajo y podemos empezar a crear proyectos.


Segundo paso: el espacio de trabajo



Una vez que hemos iniciado sesión con nuestra nueva cuenta, nos encontramos con nuestro espacio de trabajo. Su diseño es sobrio y cuenta con varias opciones para gestionar tanto los recursos que consumimos(3) como los detalles de nuestra cuenta. en la parte central encontramos dos grandes enlaces que nos permiten crear un proyecto nuevo o importar uno que ya tengamos creado y que tengamos alojado en algún servicio como Github o incluso en nuestro propio servicio de hosting.

Por ahora nos vamos a centrar en crear un proyecto nuevo desde cero, así que una vez que hacemos clic en Create New Project, podemos empezar a configurar lo que será nuestra primera aplicación web en Codenvy.

Tercer paso: crear el proyecto

Ya dentro del IDE, se nos presenta la ventana para crear un nuevo proyecto. En el lado izquierdo se nos presentan todos los distintos tipos de proyectos que podemos crear: desde un proyecto en blanco para configurar a nuestro gusto como proyectos ya preconfigurados para tecnologías como C++, Java, PHP, Python o Ruby, entre otros. También podemos elegir uno de los muchos proyectos de muestra de las distintas tecnologías para darnos una idea de cómo funciona la plataforma.

Ventana de creación de un nuevo proyecto

Para efectos de este tutorial, vamos a elegir "PHP Project" dentro del apartado de PHP. Daremos un nombre y una descripción a nuestro proyecto, así como un nivel de privacidad y daremos clic en "Next".

Configuración básica del proyecto

Ahora, toca configurar el "Runner", o el ambiente sobre la cual vamos a ejecutar nuestro proyecto. Como pueden ver, Codenvy ya seleccionó por nosotros las configuraciones disponibles para un proyecto PHP. Para este tutorial, vamos a elegir "php56_apache2", una configuración que incluye un ambiente LAMP típico: Un servidor web Apache (corriendo en Linux), PHP y MySQL configurado con una base de datos de prueba (cuyos datos de acceso también se nos proporcionan). Una vez que hagamos clic en "Create", tendremos un ambiente de trabajo listo para recibir y ejecutar nuestros códigos.

Configuración del ambiente de ejecución

Cuarto paso: ¡A codificar!

El IDE de Codenvy cuenta con una gran cantidad de opciones de configuración y herramientas de trabajo. En la parte superior nos encontramos con los menús para acceder a muchas de las opciones y funciones del IDE, aunque por ahora voy a resaltar sólo tres de ellos. En el menú File contamos con opciones para crear nuevos proyectos, archivos o carpetas, así como importar proyectos o archivos de otros sitios. El menú Code cuenta con opciones para deshacer/rehacer nuestros cambios así como una opción para dar formato a nuestro código de modo automático (es decir, agregar algunos espacios, líneas en blanco y sangrías para hacerlo más legible). Finalmente, el menú Run será el que nos permita ejecutar nuestro proyecto para probarlo. Nos vamos a ocupar de ello más adelante.

Los distintos menús del IDE de Codenvy

Vamos a comenzar, pues, creando un nuevo archivo HTML para comenzar a codificar. Para ello, podemos hacer clic en el menú File>New>HTML File, lo cual nos abre una ventana para darle nombre al nuevo archivo. Escribimos un nombre, hacemos clic en OK y listo, tenemos creado un archivo de tipo HTML con una plantilla básica para empezar a escribir nuestro código.

Nuestro IDE en Codenvy, listo para trabajar
Para comenzar a probar las bondades de Codenvy, vamos modificar nuestro código de modo que quede de la siguiente manera:


Si se dieron cuenta al escribir su código, el IDE de Codenvy nos ayuda al momento de escribir nuestro código, cerrando etiquetas por nosotros para que no olvidemos hacerlo (y para que escribamos menos y hagamos más ;) ). Con este código, estamos listos para probar. Para ello, hacemos clic en el menú Run y elegimos el comando Run. Esto va a activar una serie de procesos que veremos en la consola (en la parte inferior), pero no tenemos que preocuparnos si no comprendemos de qué se trata. Lo único que debemos esperar es a que se genere el enlace correspondiente a nuestra aplicación para que podamos verla en tiempo real. Ese enlace de nuestra aplicación aparecerá en la parte inferior del IDE y se verá algo así:


Al hacer clic en el enlace proporcionado, veremos en una pestaña separada nuestra primera página web creada en Codenvy, la cual será algo parecido a esto:

Nuestra primera página web creada en Codenvy
Ahora que ya probamos nuestra primera aplicación, y a fin de no consumir más de nuestros GB-Hora disponibles, vamos a detener la aplicación haciendo clic en el botón "Stop Run" que vamos a encontrar en la orilla izquierda de la Consola:



Quinto paso: hagámoslo más interesante.

Siguiendo el proceso descrito en el paso anterior, vamos a modificar nuestro código HTML y vamos a añadir unos cuantos archivos más para completar nuestra aplicación.

Primero, vamos a hacer que nuestro código HTML se vea algo así:

<!DOCTYPE html>
<html>
<head>
    <title>Tutorial Codenvy</title>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="estilo.css">
</head>
<body>
  <h1>
    Bienvenido al tutorial de Codenvy
  </h1>
  <hr>
<form id="saludar">
     Vamos a probar el código Javascript.<br>
     Por favor dime tu nombre:
     <input type="text" id="nombre">  
     <button type="submit" id="btnSaludar">Saludar</button>
  </form>
  <br>
  <form action="edad.php" method="POST">
    Ahora vamos a probar el código PHP.<br>
    Por favor dime tu año de nacimiento:
     <input type="text" name="nac">  
     <button type="submit" id="btnEdad">Calcular mi edad</button>
  </form>
  <script src="scripts.js"></script>
</body>
</html>


Ahora, vamos a crear algunos archivos adicionales en nuestro proyecto. Crea un archivo de tipo CSS, dale el nombre de "estilo" y captura el siguiente código en él:

body {
  background-color: #F3F3F3;
  font-family: Arial
}

form {
  border: solid silver 1px;
  border-radius: 10px;
  padding: 10px;
  width: 50%;
}

input {
  font-family: Arial;
  font-size: large;
  color: #4D7191;
  border-radius: 5px;
}

button {
  background-color: #009800;
  color: #FFFFFF;
  font-family: Arial;
  font-size: large;
  border: solid green 1px;
  border-radius: 5px;
  padding: 5px;
}

Crea ahora un archivo de tipo Javascript y dale el nombre de "scripts". Escribe este código:

document.getElementById("btnSaludar").onclick = function(){
  var nombre = document.getElementById("nombre").value;
  alert("¡¡¡Hola " + nombre + "!!! Bienvenido al tutorial de Codenvy");
}

Finalmente, crea un nuevo archivo haciendo clic en File>New>File(4) . Escribe "edad.php" como nombre del archivo y haz clic en OK. Escribe el siguiente código en el nuevo archivo:

<?php
$nac = $_POST["nac"];
$edad = 2015 - $nac;
   echo "<script> alert('Debes rondar los".$edad." años, ¿cierto?')</script>";
?>

Una vez que todos nuestros archivos están creados, vamos a tener un ambiente de trabajo que se verá más o menos así:


Este proyecto no tiene funcionalidades demasiado espectaculares. Al ejecutarlo (como ya aprendimos algunos párrafos atrás), sólo veremos una página web sencilla con un encabezado y dos formularios distintos: uno que nos pide nuestro nombre y nos saluda usando Javascript y otro que solicita nuestro año de nacimiento para luego calcular y mostrar nuestra edad mediante PHP.





Lo importante de este ejemplo es ver que todo esto funciona sin que nosotros hayamos tenido que instalar ni configurar absolutamente nada. Una vez creado nuestro proyecto, estará accesible desde cualquier computadora en la que nos conectemos, siempre y cuando tenga una conexión a internet activa y un navegador web.

Este sencillísimo ejemplo a penas roza la superficie de las potencialidades que nos ofrece Codenvy, pero creo que ya nos podemos dar una muy buena idea de la utilidad de esta fabulosa herramienta de desarrollo en la nube.

En tutoriales posteriores trataré de cubrir más a fondo otras funciones como la conexión a una base de datos o la integración con Github, pero creo que por ahora tienen lo suficiente para comenzar a involucrarse con Codenvy y poco a poco ir descubriendo sus increíbles funciones.

Como siempre, espero sus comentarios y dudas respecto a este o cualquiera otro de los posts de este blog. ¡Hasta la próxima!



NOTAS


(1) Si quieren saber más sobre las funcionalidades que ofrece una Chromebook, echen un ojo en la ayuda oficial de Google.
(2) Gigabyte-horas = GB de RAM * Tiempo de uso. Por ejemplo, una máquina que use 1 GB de RAM para correr y depurar aplicaciones durante 2 horas, consume 2GB-Hora.
(3) Para más detalles sobre los términos que se muestran en el espacio de trabajo, den un vistazo al glosario oficial de Codenvy.
(4)  También podemos crear archivos haciendo clic derecho sobre el nombre de nuestro proyecto en la sección "Project Explorer" para obtener el mismo menú que al hacer clic en el menú File>New>File

Copyright © Mi rincón del código Compartido por Gooyaabi Templates | Powered By Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com