domingo, 20 de abril de 2008

Que paso con los buenos modales y la buena formación

Revisando un código, me di cuenta que por alguna razón se nos esta olvidando los buenos modales y la buena formación y me refiero cuando escribimos código. Los siguientes tips, sin ser los únicos, si hacen la diferencia en algún momento en nuestro código. Estos tips se basan en la disciplina de "Refactoring" que nos indica que cada vez que modificamos algo tenemos la oportunidad de mejorar su funcionamiento interno sin alterar el externo y esto acompañado con las pruebas necesarias que nos garanticen que no estamos rompiendo la funcionalidad de nuestro código. Aquí les va:

En VB.Net para definir un tipo utilizamos las palabras reservadas Dim y as como sigue:

Dim x as NuevaClase

... pero esto no es lo mismo en C# podemos utilizar la palabra reservada as para comprobar en una sola línea si al tipo que deseamos castear es valido de lo contrario en vez de devolverme un error me devuelve un nulo como se muestra a continuación:

NuevaClase _nueva = objecto as NuevaClase;

Esto es equivalente a:

NuevaClase _nueva;

if (objecto is NuevaClase) _nueva = (Nuevaclase)objecto;

Este única palabra o prepocisión de C# hace muy eficiente nuestro código, veamos este ejemplo:

Es usual in ASP.NET utilizar el objeto ViewState para guardar información que necesitamos persistir por lo que normalmente definimos dentro de la clase parcial de la pagina una propiedad utilizando el ViewState, de la siguiente manera:

private ClaseUsuario ClaseUsuarioSeleccionada

{

get

{

if (ViewState["ClaseUsuarioSeleccionada"] != null &&

ViewState["ClaseUsuarioSeleccionada"] is ClaseUsuario)

{

return (ClaseUsuario)ViewState"ClaseUsuarioSeleccionada"];

}else

return null;

}

set{ViewState["ClaseUsuarioSeleccionada"] = value;}

}

Ahora veamos el mismo código optimizado por la cláusula "as":

private ClaseUsuario ClaseUsuarioSeleccionada

{

get

{

return ViewState["ClaseUsuarioSeleccionada"] as ClaseUsuario;

}

set{ViewState["ClaseUsuarioSeleccionada"] = value;}

}

Arriba en el getter si no puede castearlo devuelve nulo y listo, nuestro código esta fuera de peligro de generar alguna excepción.

Así mismo desde la version 2.0 del .NET framework tenemos del TypeBase.TryBase(); donde TypeBase puede ser cualquier tipo base del framework como int, decimal, double, bool, etc.

No es recomendable utilizar el Convert.ToInt32() o el Int.Parse() porque si no puede castearse levantará una excepción es mejor utilizar el TryInt. Veamos un ejemplo:

int CodigoObtenido;

if (int.tryParse(TextBox1.Text, out CodigoObtenido)

{

..... //Segmento de Codigo

}else

MessageBox.Show("Valor ingresado debe de ser entero");

Este es mejor que:

int CodigoObtenido = int.Parse(TextBox1.Text);

y mucho mas eficiente que:

try

{

int CodigoObtenido = int.Convert(TextBox1.Text);

}

Catch(Excepcion as ex)

{

MessageBox.Show("Valor ingresado debe de ser entero");

}

Otras recomendaciones:

No es recomendable escribir código en los métodos invocados con eventos sino crear un método que encapsulen la tarea, esto es porque puede ser reutilizando dicha operaciones y por otro lado si cambia la pagina es mucho mas facil ubicarla, veamos el siguiente ejemplo:

protectec void PersistirInfo_Click(object sender, EventArgs e)

{

PersistirInformacionIngresada();

}

Utilicemos los nombres con claridad, encapsulado segmentos de código en métodos esto lo hace mas legible y fácil de encontrar lo que buscamos, veamos el siguiente ejemplo:

protected void OtrosMovimientosConfirmarNuevo_Click(object sender, EventArgs e)
{
Page.Validate("Otros");

if (Page.IsValid)
{
try
{
ConciliacionBancariaDetalleOtrosMovimientos conciliacionOM = new ConciliacionBancariaDetalleOtrosMovimientos();
conciliacionOM.CodigoConciliacionBancaria =
OtrosMovimientosListaConciliaciones.ConciliacionBancariaSeleccionada != null
? OtrosMovimientosListaConciliaciones.ConciliacionBancariaSeleccionada.CodigoCorrelativo: null;

conciliacionOM.CodigoTipoOperacionBancaria =
OtrosMovimientosTipoOperacionBancaria.TipoOperacionBancariaSeleccionada.
CodigoTipoOperacionBancaria;

conciliacionOM.Descripcion = OtrosMovimientosDescripcion.ValorSeleccionado;
conciliacionOM.Fecha = OtrosMovimientosFecha.FechaSelected.Value;
conciliacionOM.NumeroReferencia = OtrosMovimientosNumeroReferencia.Text;
conciliacionOM.Valor = OtrosMovimientosValor.ValorSeleccionado;
conciliacionOM.UsuarioSistema = Page.User.Identity.Name;
ConciliacionBancariaDetalleOtrosMovimientosBLL.Crear(conciliacionOM);

ConfirmaLabel.Text = "Se ingreso un nuevo registro exitosamente."

OtrosMovimientosNumeroReferencia.Text = null;
OtrosMovimientosDescripcion.ValorSeleccionado = null;
conciliacionOM.Valor = null;

if (ConciliacionBancariaSeleccionada != null)
{
string NombreEmpresa = ObtenerNombreEmpresa(ConciliacionBancariaSeleccionada.CodigoEmpresa);
PrepararEdicionConciliacion(NombreEmpresa, ConciliacionBancariaSeleccionada.NombreCuenta, ConciliacionBancariaSeleccionada.FechaInicial.Value.ToShortDateString(), ConciliacionBancariaSeleccionada.FechaFinal.Value.ToShortDateString(), ConciliacionBancariaSeleccionada.CodigoCYBConciliacionBancaria.Value, ConciliacionBancariaSeleccionada.CodigoCorrelativo.Value);

}

}
catch (Exception Error)
{
ErrorLabel.Text = Error.Message;
//throw;
}

}
}

Que Entiende ud. en este código, y ud. me dirá acaso yo conozco las reglas de su negocio o yo se para que escribieron este código?.. y son validas al ver el código de Arriba pero que sucede si usted ve lo siguiente:

protected void OtrosMovimientosConfirmarNuevo_Click(object sender, EventArgs e)
{

PersistirOtrosMovimientosConciliacionBancaria();

}

private void PersistirOtrosMovimientosConciliacionBancaria()

{

If (EsValidaCapturaUsuario())

{

ConciliacionBancaria NuevaConciliacion = ObtenerInfoConciliacion();

PersistirNuevaConciliacion(NuevaConciliacion);

}

}

De Inmediato primero por el nombre del método sabemos de que se trata y luego en 3 líneas de código sabemos lo que hace, validar la información capturada llenar la entidad de negocio y luego persistir la información capturada.

Amigos, regresemos a los buenos modales y a la buena formación. Que bueno será que cuando nos revisen nuestro código o el legado que dejemos sea grato a los ojos de otro socio de la industria..

Code4Fun!,

Manolo Herrera

2 comentarios:

Massagem dijo...

Hello. This post is likeable, and your blog is very interesting, congratulations :-). I will add in my blogroll =). If possible gives a last there on my blog, it is about the Massagem, I hope you enjoy. The address is http://massagem-brasil.blogspot.com. A hug.

Fernando dijo...

Buenisimo aporte Manolo..