Ya es hora de que empecemos a tratar cosas un poco más concretas y, para empezar, quiero hablar sobre algo que no sólo agrega "estilo" a nuestro trabajo, también lo hace mucho más mantenible.
En una empresa, existen personas que saben lo que hay que hacer y cuándo hay que hacerlo, y otras que saben cómo hacerlo.
En nuestro código debería haber métodos que sepan qué y cuándo hacer las cosas y métodos que sepan cómo hacerlas. No me parece una buena práctica construir métodos que mezclan ambos roles.
Mantener esa separación nos permite ver rápidamente las reglas de negocio por un lado y, de ser necesario, revisar los algoritmos en forma individual. Además, estaremos creando métodos que podrán ser reutilizados en otras lugares de nuestro desarrollo.
Para graficar un poco más este concepto, veamos un ejemplo en ASPX. Necesitamos un método que envía un mail a la dirección especificada en un formulario. Tenemos un HTML en disco con la etiqueta "$$nombre$$" que debemos reemplazar por el nombre del usuario para personalizar el mail. Finalmente, grabamos el mail en nuestra base de datos.
El que sigue es un ejemplo de código muy poco profesional:
private void Button1_Click(object sender, System.EventArgs e)
NameValueCollection config = ConfigurationSettings.AppSettings;
string mailFile = config["MailFileName"];
FileStream fs = new FileStream(mailFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs, Encoding.Default);
string message = sr.ReadToEnd();
message = message.Replace("$$nombre$$", campoNombre.Text);
MailMessage mail= new MailMessage();
mail.Subject = config["MailSubject"];
mail.From = config["MailFrom"];
mail.Body = message;
mail.BodyFormat = MailFormat.Html;
mail.To = campoEmail.Text;
SmtpMail.SmtpServer = config["SmtpServer"];
SmtpMail.Send( mail );
string connString = config["ConnectionString"];
SqlConnection oConn = new SqlConnection(connString);
SqlCommand dbCommand = new SqlCommand();
dbCommand.CommandText = "Exec Insert_Email @email=@@email";
dbCommand.Connection = oConn;
int rowsAffected = 0;
oConn.Open();
try
{
rowsAffected = dbCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
oConn.Close();
}
}
Algo con mucho más estilo sería:
private void Button1_Click(object sender, System.EventArgs e)
{
// Nunca debemos escribir más código del necesario
// en los métodos que capturan eventos !!!
EnviarMailAUsuario(campoNombre.Text, campoEmail.Text);
}
private void EnviarMailAUsuario(string nombre, string email)
{
NameValueCollection config = ConfigurationSettings.AppSettings;
string emailSource = LeerArchivoDeDisco(config["MailFileName"]);
emailSource = message.Replace("$$nombre$$", campoNombre.Text);
EnviarMailDelSitio(campoEmail.Text, emailSource);
GuardarMail(campoEmail.Text);
}
Los métodos invocados seguramente tendrán un código parecido a las líneas correspondientes del primer ejemplo. Noten que no estoy especificando en que capa de mi aplicación se encuentran estos métodos, pero deberían estar en una capa diferente de la de presentación.