lunes, 21 de diciembre de 2009

Expresiones regulares: Fecha

Las expresiones regulares o patrones no son más que un grupo de caracteres orientados a cumplir una determinada condición. Por ejemplo, si queremos validar un número de DNI podemos hacerlo mediante sentencias if anidadas, comprobando su longitud, si contiene números o letras, etc. y también podemos hacerlo comparándola con una expresión regular. No entraré mucho en detalle, porque hay bastantes sitios que lo explican y seguro que además lo hacen mucho mejor que yo.
Pongo a continuación alguno de los sitios que he consultado:
Expresiones regulares en la Wikipedia.
Tutorial rápido para crear expresiones regulares (está en inglés):
http://www.regular-expressions.info/
Buscador de expresiones regulares:
http://regexlib.com/
Bueno, la principal razón por la que he abierto este post es la de incluir la expresión regular que he (iba a decir creado) adaptado a mis gustos desde otras que he encontrado por ahi. Es para validar campos con la fecha, no solo en lo que es el formato en sí sino también que los valores sean los correctos. La he limitado a los años 2000-2099 por comodidad, y he incluido seis formatos diferentes: 21/12/2000 21/12/09 21-12-2009 21-12-09 21122009 211209 De esta forma, contemplo las formas más comunes de escribir la fecha. el objetivo es que al introducir la fecha en un textbox me permita validarla. Adicionalmente, se podría utilizar también las expresiones regulares para convertir la fecha a un formato concreto, para que al resultar válidas las transforme a un formato concreto.
He dividido la expresión en dos patrones, para que el que quiera usar uno solo pueda hacerlo.
//Formato de Fecha: 12/12/2009 12-12-2009 12122009
//Fecha Minima: 01/01/2000
//Fecha Maxima: 31/12/2099
string Patron1 = "(((0[1-9]|[12][0-9]|3[01])([/]|[-])?(0[13578]|10|12)([/]|[-])?(’’d{4}))" +
"|(([0][1-9]|[12][0-9]|30)([/]|[-])?(0[469]|11)([/]|[-])?(’’d{4}))" +
"|((0[1-9]|1[0-9]|2[0-8])([/]|[-])?(02)([/]|[-])?(’’d{4}))" +
"|((29)([/]|[-])?(02)([/]|[-])?((20)[02468][048]))" +
"|((29)([/]|[-])?(02)([/]|[-])?((20)[13579][26])))";

//Fecha 12/12/09 12/12/09 121209
//Fecha Minima: 01/01/00
//Fecha Maxima: 31/12/99
string Patron2 = "(((0[1-9]|[12][0-9]|3[01])([/]|[-])?(0[13578]|10|12)([/]|[-])?(’’d{2}))" +
"|(([0][1-9]|[12][0-9]|30)([/]|[-])?(0[469]|11)([/]|[-])?(’’d{2}))" +
"|((0[1-9]|1[0-9]|2[0-8])([/]|[-])?(02)([/]|[-])?(’’d{2}))" +
"|((29)([/]|[-])?(02)([/]|[-])?([02468][048]))" +
"|((29)([/]|[-])?(02)([/]|[-])?([13579][26])))";

string Patron = "^("+Patron1+"|"+Patron2+")$";

Regex ExpresionRegular = new Regex(Patron);

if(ExpresionRegular.IsMatch(this.textBox1.Text.ToString()))
{
}

Básicamente lo que hacemos es buscar primero si coincide con los meses que tienen 31 días, con las opciones de todo junto, con / o con –. Después vemos si coincide con alguno de los meses que tienen 30 días, después valida la fecha del 28 de febrero, y por último si el día es el 29 comprueba que el año sea bisiesto. En otro momento, si tengo ganas y tiempo podré el código que compruebe el textbox, como aquí y además le sobreescriba con un formato de fecha concreto, para poder convertirlo a DateTime, por ejemplo.
Para el que quiera usarlo, recordar que hay que hacer referencia al espacio de nombres Text.RegularExpressions.

miércoles, 2 de diciembre de 2009

Con un poco de estilo

Un aspecto que aunque no lo parezca es importante a la hora de programar aplicaciones es el estilo. Aunque los comentarios y todas esas cosas se suelen dejar para el final, no debería ser así por dos motivos:
Si hay que andar modificando código es más difícil encontrarlo y saber que hace cada cosa.
Al final, por mucho que digamos, "pasamos" de estar comentando y retocando el código.
Por eso he considerado importante documentarme un poco sobre el código antes de escribir una línea del mismo. Aquí van, a modo de resumen o que he considerado más importante:
1. Nombres de clases, métodos, objetos ...
  • Escribir los nombres de forma que se sepa que hacen. Por ejemplo, si queremos hacer un método que calcule un área, será siempre mejor  llamarle CalcularArea() que no Calcular o Area a secas.
  • Seguir una notación concreta. Yo he optado por usar una notación Pascal, que entre otras cosas consiste en poner en mayúscula las primera letra de cada palabra. Por ejemplo, podemos escribir un método de varias formas: CalcularArea(), calcular_area(), calculararea(). Cada uno es libre de escoger la que quiera, lo que si aconsejo es si escoges una, seguir siempre con esa. ¿Por qué? Pues más que nada por sencillez. Si declaro un método llamado CalcularArea() y otro calcular_superficie() cuando quiera definirlos o llamarlos no me acordare si después de Calcular iba Area o _area o que iba.
  • Aplicar la misma notación a todos los objetos, nombres… Por ejemplo, si creo un objeto DataTable, sería lógico que se llamase dtClientes, por ejemplo o si creo un objeto de tipo TextBox, podría llamarse txtEliminar. Otra opción es poner “obj” delante, o incluso o (oDataTable). Otra vez lo mismo, decidas lo que decidas, seguir siempre la misma notación.
2. Orden en el código.
  • Seguir un orden. En tu archivo de código usar siempre el mismo órden. El aconsejable y que tengo intención de usar yo es el siguiente:


    1. Instrucciones using
    2. Namespace que corresponda
    3. Clase: declaracion
    4. Variables o Campos
    5. Delegados y Eventos
    6. Propiedades
    7. Métodos, entre los que se incluye en constructor, los métodos públicos, los métodos protegidos y los métodos privados, en ese orden.



  • Usar las etiquetas de región #region y #endregion para separar cada parte, de forma que lo podamos contraer o expandir según nos interese.
3. Comentarios de líneas con // y /* */
  • Poner comentarios donde corresponda. No hace falta explicar al detalle todo, sino simplemente describir un poco lo que hace o aclarar cosas, sobre todo en partes de código que parezcan más confusas.
  • Poner los comentarios antes de lo que se quiere comentar y en una línea nueva, salvo en casos de pequeños comentarios, que se pueden poner seguido.
4. Comentarios XML
En Visual Studio es posible comentar las clases, métodos, campos, etc. mediante etiquetas XML. Aunque en principio puede parecer menos útil que los comentarios //, tiene algunas ventajas, como por ejemplo:
  • Permite generar un archivo XML de documentación del código que hemos programado. Otro día si me acuerdo explicaré como.
  • Nos permite conocer qué hacen las clases y métodos, qué parámetros reciben, que valores devuelven,etc.
Estos comentarios se añaden poniendo ///, tras lo cual el propio Visual añade la estructura del comentario. A continuación un ejemplo y su utilidad:
///<summary>
/// Descripcion breve de que hace el metodo PermitirAcceso
///</summary>
///<remarks>
/// Descripcion detallada (este es opcional)
///</remarks>
///<param name="Edad">Edad de la persona que quiere acceder</param>
///<returns>Devuelve true si la persona es mayor de 18 </returns>
public bool PermitirAcceso(int Edad)
{
     if (Edad => 18)
     {
          return true;
     }
     else
     {
          return false;
     }
}

Si ahora queremos llamar a esta función desde cualquier otro sitio, al empezar a introducir su nombre nos aparece la descripción breve del método:
image
Y si seguimos escribiendo, al abrir el paréntesis nos muestra una ayuda con los parámetros que tenemos que pasar y su descripción.
image
Podemos definir los parámetros que queramos e incluso sobrecargas si ponemos las etiquetas correspondientes antes de cada método. En el caso de sobrecargas, los campos de summary y returns han de coincidir en todos los métodos.