viernes, 9 de agosto de 2013

5 cosas de JavaScript que vale la pena conocer

5 cosas de JavaScript que vale la pena conocer

 

 

5 cosas de JavaScript que vale la pena conocer
JavaScript es el lenguaje de moda. Pasó de ser un mero lenguaje de validación de formularios, a ser el lenguaje que todo diseñador y desarrollador web debe conocer. Aquí les recopilo 5 cosas interesantes para tener en cuenta a la hora de programar con él.

Funciones nativas

JavaScript posee varios objetos nativos, los cuales son accesibles desde cualquier parte del código. Es muy importante aprender cuáles son y las funciones que poseen, ya que pueden hacer la diferencia a la hora de programar. Por ejemplo, si tenemos un arreglo de números desordenados, y queremos saber cuál es el número más chico; tendríamos que hacer lo siguiente:
var numbers = [40, 100, 1, 5, 25, 10];
var minimo = numbers[0];
for (var i = 1; i < numbers.length; i++) {
    if (numbers[i] < minimo) {
        minimo = numbers[i];
    }
};
En cambio, utilizando la función sort() del objeto Array, el código cambia a sólo lo siguiente:
var numbers = [40, 100, 1, 5, 25, 10];  
minimo = numbers.sort(function(a, b) {
    return a - b
})[0];
La función sort() ordena los elementos de un arreglo. El ordenamiento puede ser alfabético o numérico, ascendente o descendente. Si a la función no le pasamos parámetros, el ordenamiento se hace alfabético; si en cambio le pasamos una función (como en este ejemplo) se hace numérico. Al indicar "a - b" como retorno, indicamos que el primer número debe ser menor que el segundo (en las comparaciones).
Los objetos más importantes son:
  • Number
  • Boolean
  • String
  • Array
  • Date
  • Math
  • RegExp

Declaraciones abreviadas

Hay dos declaraciones abreviadas que se utilizan mucho actualmente. Para los objetos y para los arreglos.
Antes los objetos se declaraban de la siguiente manera:
var auto = new Object();
auto.color = 'red';
auto.ruedas = 4;
auto.marca = 'Renault';
auto.anio = 2011;
Ahora se hace de la siguiente manera:
var auto = {
    color: 'red',
    ruedas: 4,
    marca: 'Renault',
    anio: 2011
}
De esta forma no hay que repetir el nombre del objeto cada vez que agregamos una propiedad y quedan todas las propiedades dentro de las llaves, lo cual es más fácil de interpretar visualmente.
Por el otro lado, los arreglos antes se declaraban de la siguiente forma:
var marcasDeAutos = new Array('Renault', 'Ford', 'Chevrolet', 'Fiat');
Actualmente se hace de la siguiente:
var marcasDeAutos = ['Renault', 'Ford', 'Chevrolet', 'Fiat'];
No es mucha diferencia, pero al tener los corchetes es más fácil intuir que se trata de un arreglo.

JSON

Antes de la creación de JSON, había que hacer muchas cosas raras para guardar información de modo que JavaScript pudiera leerla (arreglos, strings con caracteres de control, etc). Por suerte Douglas Crockford cambió todo eso al traer JSON.
JSON significa JavaScript Object Notation y es un formato para el intercambio de datos. Sirve para almacenar datos complejos en una forma nativa a JavaScript y no necesita una conversión extra para ser usada inmediatamente. En JSON se utiliza las declaraciones abreviadas vistas antes.
Para ejemplificar, imaginá lo siguiente:
  • Tengo un div en el cual quiero agregar una lista desordenada que muestre a cada uno de los integrantes de la banda Kiss, junto a su respectivo instrumento.
Como JSON se utiliza para intercambio de datos, en este caso los datos de los integrantes podrían estar llegando a través de una página de música que nos informa de los mismos.
Vamos por partes. Primero creamos el div.
Obtenemos el objeto JSON con los datos de los integrantes
var kiss = {
    //dentro del objeto kiss tengo un arreglo de miembros
    "miembros": [{
        //cada miembro contiene dos atributos
        "nombre": "Gene Simmons",
        "instrumento": "bajo"
    }, {
        "nombre": "Paul Stanley",
        "instrumento": "guitarra"
    }, {
        "nombre": "Ace Frehley",
        "instrumento": "guitarra"
    }, {
        "nombre": "Peter Criss",
        "instrumento": "batería"
    }]
}
Finalmente agregamos la lista
//creamos una variable donde vamos a almacenar la lista
var listaDeMiembros = '
    '; //iteramos el arreglo de miembros dentro del objeto kiss for (var i = 0; i < kiss.miembros.length; i++) { //por cada miembro creamos un item de la lista y le agregamos los datos listaDeMiembros += '
  • ' + kiss.miembros[i].nombre + ' - ' + kiss.miembros[i].instrumento + '
  • '; }; listaDeMiembros += '
'; //seleccionamos el div y le agregamos la lista que creamos $('#miembrosDeKiss').append(listaDeMiembros);

Delegación de eventos

En el manejo tradicional de eventos, agregás o quitas manejadores de eventos de cada elemento a medida que vas necesitando. Sin embargo, los manejadores pueden causar problemas con filtraciones de memoria y degradar la performance. Cuantos más tenés, más riesgo.
La delegación de eventos es una técnica en la cual añadís un sólo manejador de evento a un elemento padre para evitar tener que agregar uno para cada uno de sus hijos. Esta técnica utiliza el burbujeo de eventos y el elemento target.
Cuando un evento es lanzado sobre un elemento (por ejemplo, el click del mouse en un enlace), el mismo evento es lanzado sobre todos los elementos precedentes de su herencia. Este proceso se conoce como "burbujeo de eventos", ya que el evento va buscando hacia arriba hasta la cima del árbol del DOM. 
El elemento target de cada evento, es el elemento que originó el evento (en nuestro ejemplo, el enlace), el cual se almacena en la propiedad del objeto del evento. Entonces utilizando la delegación de eventos, se puede agregar un manejador de eventos a un elemento, esperar a que un evento burbujee desde los elementos hijos y utilizar el elemento target para identificar qué elemento lo lanzó.
Para aclarar un poco las cosas, vamos con un ejemplo. Tenemos los siguientes elementos:

Queremos agregar un evento a cada enlace para mostrar una alerta en vez de redirigir al usuario a esas páginas. Según el manejo tradicional de eventos haríamos lo siguiente:
//obtenemos el div que contiene a los enlaces
var divLinks = document.getElementById('links');
//obtenemos el arreglo de enlaces   
var links = divLinks.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
    // añadimos un listener a cada uno de los elementos a
    //indicamos que cuando ocurra el evento click se debe llamar a la función manejador
    links[i].addEventListener('click', manejador, false);
};

//el parámetro e es el evento
function manejador(e) {
    // obtenemos el link del elemento a
    var x = e.target;
    alert(x);
    //evitamos que se haga la redirección
    e.preventDefault();
}
Ahora veamos cómo se realizaría lo mismo pero con la delegación de eventos.
//obtenemos el div que contiene a los enlaces
var divLinks = document.getElementById('links');
//agregamos un listener al div en vez de a los enlaces
links.addEventListener('click', handler, false);

function handler(e) {
    //verificamos que el elemento que lanzó el evento sea un enlace
    if (e.target.tagName.toLowerCase() === 'a') {
        alert('Event delegation:' + e.target.href);
        e.preventDefault();
    }
};
Si en vez de 2 enlaces, tuviéramos 30; la performance sería realmente distinta en un caso y el otro.

Patrón módulo y las funciones anónimas

El principal atractivo del patrón módulo es que resulta extremadamente útil para conseguir código reusable y modular. Se trata de una función que actúa como contenedor para un contexto de ejecución. O sea, que en su interior, se declaran una serie de variables y funciones que sólo son visibles desde dentro de la misma (a menos que indiquemos que se pueda acceder desde el exterior).
En JavaScript, cualquier variable que no esté dentro de una función, arreglo u objeto, es global; lo que significa que se puede acceder desde cualquier script en la misma página.
Empecemos con nuestras variables y funciones sueltas.
var creador = 'Gabriel Kaplan';
var fecha = '2013';
function obtenerCopyright(){
    return creador + ' - ' + fecha;
}
Cualquier otro script en la página que contenga una variable llamada creador o fecha, va a causar problemas. Para solucionarlo, podemos meter estos datos en una función anónima (sin nombre).
(function(){
    var creador = 'Gabriel Kaplan';
    var fecha = '2013';
    function obtenerCopyright(){
        return creador + ' - ' + fecha;
    }
})();
El problema es que ahora no se pueden acceder desde fuera de esta función. 
Así que vamos a utilizar el patrón módulo para solucionarlo.
var aplicacion = ( function(){ 
    //variables privadas
    var creador = 'Gabriel Kaplan';
    var fecha = '2013';

    var obtenerCopyright = function(){
        return creador + ' - ' + fecha;
    }

    return {
        //puntero a la función, lo que hace que se pueda acceder desde afuera
        //copyright no es más que un alias que creamos para su acceso
        copyright:obtenerCopyright
    }
})();
Desde afuera podemos llamar a la funcion copyright, a través del puntero.
alert(aplicacion.copyright());
A pesar de eso, no podemos acceder a las variables, ya que no se encuentran en el block return y por ende están ocultas (son privadas).

Resumen

En este artículo pudimos ver 5 características que hacen de JavaScript un lenguaje distinto.

 

 

Ref:  http://www.nebaris.com/post/7/5_cosas_de_javascript_que_vale_la_pena_conocer

Validar un formulario de forma correcta

Validar un formulario de forma correcta

Validar un formulario de forma correcta
Una de las formas más simples de mejorar la experiencia de usuario es a través de la validación de formularios. Desgraciadamente, esta tarea queda relegada al final del proyecto o directamente se pasa por alto.
Para dejar las cosas claras, vamos a ir por pasos.

¿Qué es la validación de formularios?

La validación de formularios es el proceso por el cual se verifica que la información ingresada en el formulario sea correcta o no.
Por ejemplo:
  • Si un campo está marcado como dirección de email, el mismo debe estar escrito correctamente (con "@" y ".com")
  • Si un campo está marcado como teléfono, el mismo debe contener sólo números
El errar es humano, por lo que la validación asegura que el usuario no haya cometido un error. Aquí es donde la validación juega su papel, de una forma "user friendly".

¿Dónde se realiza la validación del formulario?

Desde el punto de vista tecnológico existen dos formas de integrar validación a un formulario:
  • Del lado del cliente: se hace a través de JavaScript, ofrece un feedback instantáneo, no hace falta el envío de los datos
  • Del lado del servidor: se hace al enviar los datos, se realiza con un lenguaje de servidor (PHP, C#, Java, etc.), no es instantáneo
Es importante recalcar que la validación debe hacerse en ambos lados, ya que a pesar de tener la validación del lado del cliente esta puede ser salteada (por ejemplo, desactivando JavaScript en el navegador).

Tipos más comunes de errores

Existen 3 errores generales con los que tu formulario se encontrará:
  1. Errores de formato: La mayoría de los campos en un formulario son alfanuméricos, pero si poseés campos como un teléfono o un email, tenés que verificar que el formato ingresado por el usuario sea el correcto.
  2. Campos requeridos: Estos errores ocurren cuando el usuario olvida completar un campo que es necesario para el proceso.
  3. Errores de comparación: Estos errores se dan cuando tenés que chequear que dos valores sean iguales, técnica utilizada cuando es vital verificar que el usuario no haya cometido un error de tipeo. Por ejemplo, al ingresar dos veces la contraseña.

Hablar con el usuario

Esa es básicamente la función de la validación: Hablar con el usuario, decirle que algo no está correcto.
¿A quién pertenece la función de validar? ¿al programador o al diseñador?
En general, un programador no diseñará una validación amigable, lo cual puede ser frustrante para los usuarios. En el siguiente gráfico
Validar un formulario
Se nos dice que algo está mal, pero tenemos que buscar qué.
Dejar que el usuario tenga que adivinar qué es lo que está haciendo mal, es un mal diseño.

Diseñando una solución

Ya sabemos qué no hay que hacer. Falta ver qué podemos hacer para corregir nuestro formulario. Para eso podemos utilizar la siguiente lista:
  • Informar al usuario que hay un error con un texto
  • Resaltar el campo que contiene el error
  • Mostrarles un ejemplo de lo que se espera
  • Utilizar colores (el rojo es un color instintivo de que algo salió mal)
  • Utilizar imágenes
  • Mantener las notificaciones cerca del lugar del error.
No es necesario agregar todas estas cosas, solamente son una guía para que tengas en cuenta.
La siguiente imagen es un ejemplo de cómo se podría mejorar nuestro ejemplo anterior.
Validar un formulario

Resumen

Es importante al momento de planificar un formulario, entender cuáles son los errores en los que puede incurrir un usuario. Con esto nos anticipamos al problema y es más simple diseñar una solución para ayudar a los usuario a que pasen dicho problema.

Ref: http://www.nebaris.com/post/8/validar_un_formulario_de_forma_correcta

Métodos de extensión en C#

Métodos de extensión en C#



Menú con rotación aleatoria
Los métodos de extensión son, básicamente, una forma de agregarle métodos a una clase sin necesidad de hacerlo en la original o en alguna instancia de la misma. Es un pequeño "truco" que permite darle más funcionalidad a una clase sin modificarla realmente.

Extendiendo una clase propia

Para lograr entender bien la idea detrás de los métodos de extensión, vamos a crear una clase propia llamada Persona que sólo tenga dos propiedades (nombre y apellido).
Para probar estos ejemplos vamos a utilizar un proyecto de consola.
Creamos un nuevo proyecto de consola; creamos una clase llamada Persona y le agregamos el siguiente código:
    public class Persona
{
    public Persona(string nombre, string apellido)
    {
        this.Nombre = nombre;
        this.Apellido = apellido;
    }


    public string Nombre { get; set; }
    public string Apellido { get; set; }
}
La clase sólo tiene las propiedades y un constructor. Si vamos al Main() de nuestro proyecto y creamos un objeto de la clase Persona, vamos a poder ver lo siguiente en el intellisense.
Métodos de extensión C#
Ahora creamos una nueva clase estática llamada Extensores y escribimos el siguiente código:
    public static class Extensores
{
    public static string ObtenerNombreCompleto(this Persona persona)
    {
        return persona.Nombre + " " + persona.Apellido;
    }
    }
Podemos notar las siguientes cosas sobre los métodos de extensión:
  • Deben estar contenidos en clases estáticas
  • Deben ser estáticos
  • Se debe indicar a qué clase se extiende mediante la palabra reservada this
Por lo tanto, si ahora nosotros compilamos el proyecto, los objetos de persona van a contar con este nuevo método (podemos ver este método cuenta con un ícono distinto que el resto).
Métodos de extensión C#

Extendiendo clases de terceros

Por lo visto hasta ahora, la lógica diría que si vamos a agregar un método nuevo a una clase, lo tendríamos que hacer dentro de la clase y no en otra a través de un método extensor. Y es verdad. Los métodos extensores son mucho más útiles para agregar en clases de terceros, de las cuales no contamos con el código fuente o por definición están selladas.
Para jugar un poco con esto, vamos a un caso específico. Vamos a crear un método para extender la clase Object y que nos indique si el objeto declarado es nulo.
    public static bool EsNulo(this Object obj)
{
    return obj == null;
}
Seguimos dentro de nuestra clase Extensores, esta vez extendemos la clase Object, y como en .NET todo deriva de esta clase, significa que todo objeto que creemos va a contar con este nuevo método.
Métodos de extensión C#

Extendiendo la clase String

Como último ejemplo, vamos a extender la clase String, la cual es sellada (lo que no nos permite crear una clase que derive de ella). Lo que vamos a hacer, es crear un método que nos devuelva la cantidad de palabras que contiene un texto.
Para lograrlo, dividimos la cadena en un arreglo de char (por los caracteres indicados) y contamos la cantidad de elementos que contiene el arreglo.
    public static int CantidadDePalabras(this string str)
    {
        return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
    }
Gracias a eso, podemos hacer algo como lo siguiente.
    //texto aleatorio
    string loremIpsum = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
                        tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
                        quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
                        consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
                        cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
                        proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";


Console.WriteLine("Cantidad de palabras: " + loremIpsum.CantidadDePalabras());

Resumen

Gracias a los métodos de extensión se puede obtener un código más legible y mantenible, pero tiene sus inconvenientes:
  • El ciclo de vida de la clase y de los métodos que la extienden pueden ser diferentes
  • Sin el Intellisense es muy difícil saber si un método pertenece a una clase o la extiende
  • Si se agrega en la clase extendida un método con el mismo nombre que el extendido, el extensor dejará de funcionar.
A pesar de estas contras, esta funcionalidad es tan potente, que herramientas como Linq están construidas con esta técnica de desarrollo.
¿Usás métodos de extensión en tus proyectos?


10 errores que cometí como novato en PHP / MySQL

10 errores que cometí como novato en PHP / MySQL
PHP es un lenguaje que permite que novatos estén creando aplicaciones en poco tiempo, razón por la cual empecé a usarlo cuando empecé a programar de manera profesional.
En este artículo, hago un repaso de los 10 errores más importantes que cometí, para que puedas evitarlos en tu día a día.

1 - Usar las funciones MySQL de PHP

PHP provee funciones para trabajar con MySQL desde el primer día, a través de la extensión MySQL. A pesar de esto, el manual de PHP desaconseja su uso, ya que quedó vieja.
Para trabajar con MySQL es aconsejable utilizar la extensión MySQLi, la cual soporta:
  • orientación a objetos
  • declaraciones preparadas
  • transacciones y rollbacks

2 - No sanitizar los datos enviados por el usuario

Al principio uno es naif y no piensa que alguien le va a enviar datos basura... hasta que pasa. La regla debería ser "Nunca confiar en los datos enviados por el usuario".
Validando que sean del tipo de datos esperado, que estén dentro de un rango y verificando que no contengan caracteres inválidos; evitaremos problemas como: ataques por inyección de SQL o XSS.

3 - Usar MyISAM en lugar de InnoDB

Los motores más conocidos de MySQL son MyISAM e InnoDB. El primero se utiliza por defecto, pero generalmente es una elección equivocada. Si se necesitan transacciones, claves foráneas o bloqueos, es obligatorio elegir InnoDB. MyISAM debe usarse para casos donde predominen las consultas del tipo SELECT.
Para crear una tabla InnoDB se debe indicar el motor o el tipo en la consulta SQL:
-- de esta forma
CREATE TABLE clientes (a INT, b CHAR (20), INDEX (a)) ENGINE=InnoDB;

-- o de esta
CREATE TABLE clientes (a INT, b CHAR (20), INDEX (a)) TYPE=InnoDB;

4 - Usar PHP en lugar de SQL

Cuando uno sabe usar un martillo, todos los problemas tienen forma de clavo. Cuando uno aprende PHP y es novato con las bases de datos, es tentador resolver los problemas del lado del lenguaje. Esto lleva a un código lento e ineficiente. Las bases de datos pueden hacer más que sólo traer los datos, por lo cual, es importante aprender cómo funcionan.

5 - No usar UTF-8

UTF-8 es un formato de codificación de caracteres único e independiente del idioma y de la plataforma. Al usar UTF-8, toda persona que no hable nuestro idioma puede ver la página correctamente, en cambio al utilizar un set de caracteres diferentes, verá símbolos raros en los caracteres que su idioma no reconozca (como las vocales con acentos o la ñ).
Usar UTF-8 también sirve para que cualquier programa que lo utilice (no sólo navegadores) pueda interpretar bien el documento.

6 - Usar SELECT *

Devolver todas las columnas de una consulta es de programador vago. Las consultas SELECT sólo deben devolver las columnas que realmente necesitamos. La "performance" de toda la base de datos mejora cuando nuestras consultas son las correctas.

7 - No utilizar los tipos de datos correctos

MySQL ofrece varios tipos de datos para utilizar en las columnas. Lo mejor es aprender que la buena utilización de estos, hace que el motor funcione mejor, ahorre espacio y sea claro a la hora de codificar.
No usar strings para un campo DATETIME, no usar INT para un campo que sólo va a aceptar número pequeños.

8 - No utilizar stored procedures

En este artículo, ya hablé de lo importante que son los stored procedures (o procedimientos almacenados). No usarlos, es error de novato.

9 - No hacer backups

Esto se aplica a todo lo que tiene que ver con computadoras. Es raro, pero las mismas pueden fallar. Los discos rígidos pueden arruinarse. Nos pueden robar la notebook. El hosting nos puede eliminar el alojamiento.
Hacer copias de nuestros datos es algo que debería estar en nuestra vida diaria. Automatizar estos backups, nos ahorra mucho tiempo.

10 - No considerar otras bases de datos

MySQL es la base de datos más extendida entre los desarrolladores PHP y phpMyAdmin una de las herramientas principales para su administración. A pesar de esto, quizás no es lo mejor para nosotros.
Existen muchas herramientas para administrar MySQL (HeidiSQL, Toad, Navicat, etc.) y existen varias bases de datos con las que podemos trabajar (PostgreSQL, SQL Server, SQLite, etc.).
El abrir nuevos horizontes, nos permite aprender nuevas cosas.

Resumen

El cometer errores, significa que uno está haciendo cosas, por lo cual es normal que sucedan; cometerlos no es malo, lo malo es no aprender de ellos.