miércoles, 26 de septiembre de 2012

Ganas de escribir mejor código

Leyendo en internet, me he contrado:
"He exhorted us every day to write code that we’d be proud to take home and show our moms. He told us over and over, “I don’t care how much you get done, or whether you meet some deadline. I only care that you produce the best quality that you can.”".

En la lengua de Cervantes:
"Él nos exhorta a diario para escribir código que estaríamos orgullosos de llevar a casa y mostrar a nuestras madres. Él nos dijo una y otra vez: "No me importa lo mucho que hacer, o si usted cumple con algún plazo. Sólo me importa que usted produce la mejor calidad que se puede. "" .

domingo, 16 de septiembre de 2012

Patrón (arquitectura) MVP

En el proyecto en el que estoy programando, hemos tomado de decisión de adoptar el patrón MVP, que es Modelo Vista y Presentador. Es algo muy parecido al MVC.
Para hacerse una idea de lo que es, aquí alguna referencia.

Tiene  muchas ventajas, ya que separa realmente en capas la aplicación.
Mejor esto que meter todo en la presentación, no?

Primeramente hay que hacer 4 proyectos. En este ejemplo concreto voy a emplear asp.net, pero perfectamente se puede emplear WindowsForms, Gtk#, ...

Detallo cada uno de los proyectos de los que consta la solución, para implementar la arquitectura MVP. Luego se puede modificar adaptando a las necesidades concretas de cada proyecto.

1º Vista, donde se encuentran los elementos visuales, en este caso .aspx
2º Presentadores, donde se encuentra la lógica del negocio
3º Modelos, donde está lo relacionado con los datos
4º Entidades, todo lo relacionado con las entidades de negocio y lo que viaja por las capas, pero hay que tener en cuenta de que son objetos no datatables, ni datasets.

Como se puede apreciar, la solución con los cuatro proyectos.

Me voy a centrar en un pequeño ejemplo, que es dar de alta un usuario. Comencemos pues ...

Añadimos un nuevo elemento el proyecto de vistas, que se va a llamar NuevoUsuario.aspx, que va a servir para dar de alta a los nuevos usuarios. El código de presentación es el siguiente.

<%@ Page Language="C#" Inherits="Vistas.NuevoUsuario" %>



NuevoUsuario


También se tiene que crear una interfaz, que se va a llamar IUsuarioVista, se encuentra el en proyecto de Presentadores. Define el comportamiento de la página NuevoUsuario.aspx. El código es el siguiente
using System;

namespace Presentadores
{
 public interface IUsuarioVista
 {
  string Nombre { get; } 
  
  string PrimerApellido { get; }
  
  string SegundoApellido { get; }

  string DeportePreferido { get ; }
 }
}
Como se puede observar las propiedades son cada una de las cajas de texto de la página. Esta es la forma de comunicación de datos entre la vista y el presentador. Como se ve lógico hay una entidad, que se llama Usuario, se crea en el proyecto de Entidades, su código es:
using System;

namespace Entidades
{
 public class Usuario
 {
  public string Nombre {
   get;
   set;
  }
  public string PrimerApellido {
   set;
   get;
  }
  public string SegundoApellido {
   get;
   set;
  }
  public string DeportePreferido {
   get;
   set;
  }
  
  public Usuario ()
  {
   Nombre = string.Empty;
   PrimerApellido = string.Empty;
   SegundoApellido = string.Empty;
   DeportePreferido = string.Empty;
  }
 }
}
En el proyecto (capa) Modelos, creamos la clase correspondiente, para guardar, actializar, crear y eliminar un Usuario, dentro de la base de datos. El código dependerá de la base de datos con la que se trabaje, o sistema de almacenamiento correspondiente.
using System;
using Entidades;

namespace Modelos
{
 public class UsuarioRepositorio
 {
  public UsuarioRepositorio ()
  {
  }
  public void GuardarUsuario (Usuario usuario)
  {
   /*Guarda el nuevo usuario en la base de datos*/
  }
  public void EliminarUsuario (Usuario usuario)
  {
   /*Borrar el usuario en la base de datos*/
  }

  public void ActualizarUsuario (Usuario usuario)
  {
   /*Actualiza los valores del usuario en la base de datos*/
  }
 }
}
Ahora toca la lógica del negocio, es decir programar el código del presentador, relaciionado con dar de alta un nuevo usuario. Esta capa, se tiene que encargar de conseguir los datos introducidos y guardarlos en la base de datos. Para ello, por medio de la interfaz, se pueden conseguir los valores, se construye la entidad Usuario y luego se llama a la capa de datos, pasándole el nuevo usuario, para almacenarlo.
using System;
using Modelos;
using Entidades;

namespace Presentadores
{
 public class UsuarioPresentador
 {
  private IUsuarioVista _vista;
  private UsuarioRepositorio _modelo;
  
  public UsuarioPresentador (IUsuarioVista vista)
  {
   _vista = vista;
   _modelo = new Modelos.UsuarioRepositorio();
  }
  
  public void GuardarNuevoUsuario ()
  {
   var nuevoUsuario = new Usuario ()
   {
    Nombre = _vista.Nombre,
    PrimerApellido  = _vista.PrimerApellido,
    SegundoApellido = _vista.SegundoApellido,
    DeportePreferido = _vista.DeportePreferido
   };
   _modelo.GuardarUsuario(nuevoUsuario);
  }
 }
}
Como se puede apreciar el el código anterior. Colabora con la página porque en el contructor se la han pasado, y está en el objeto _vista. Hay que decir que la página tiene que implementar la interfaz IUsuarioVista. Luego el objeto que se encarga de guardar los datos, es _modelo. Ahora el código codebehing de la página es:
using System;
using System.Web;
using System.Web.UI;
using Presentadores;

namespace Vistas
{
 public partial class NuevoUsuario : System.Web.UI.Page, IUsuarioVista
 {
  private UsuarioPresentador _usuarioPresentador;
  
  public NuevoUsuario ()
  {
   _usuarioPresentador = new UsuarioPresentador (this);
  }
 
  
  public string Nombre { 
   get { return txtNombre.Text; } 
  }

  public string PrimerApellido {
   get { return txtPrimerApellido.Text; }
  }
  public string SegundoApellido { 
   get { return txtSegundoApellido.Text; }
  }
  public string DeportePreferido { 
   get { return txtDeportePreferido.Text; }
  }
  
  
  protected void btnGuardar_click (object sender, EventArgs e)
  {
   _usuarioPresentador.GuardarNuevoUsuario (); 
  }
 }
}
Como se puede apreciar, para crear en presentador, se pasa así mismo, porque implementa la interfaz IUsuarioVista. De esta forma colaboran la capa de presentación y la capa de las vistas.

Una forma de limpia y coherente de hacer las cosas, mejor que meter todo en la página y el siguiente que se apañe.

viernes, 7 de septiembre de 2012

Estudiando

Formas alternativas e interesante a la universidad pública española, para aprender de verdad.
Enlace

jueves, 6 de septiembre de 2012

Yiruma

Hace poco conocí a un chico, que me recomendó este autor.
En youtube hay una lista de reproducción, para hacerse una idea de lo que toca.

Piano

Lo malo de tener amigos, que tocan el piano, es que han despertado una sana curiosidad por este instrumento.

Me he encontrado una página para tenerla en cuenta: Pianistas del mundo