10.21.2008

¿Arquitectura n-Tier o Arquitectura n-Layer?

Al parecer existe una confusión respecto al término aplicación n-capas cuando este se lleva al idioma español. El problema principal es que en inglés se manejan dos conceptos a nivel de arquitectura:

  • Aplicaciones n-Tier
  • Aplicaciones n-Layer

Ambos términos significan “de n capas"; pero existe una gran diferencia respecto al significado de cada uno de ellos. Una arquitectura n-Tier se refiere a la distribución física de las capas, es decir donde corre el código y los procesos. Una arquitectura n-Layer se refiere a la distribución lógica de las capas, es decir, como esta estructurado el código.

En la siguiente figura podemos ver una aplicación n-tier – una aplicación web - que contiene 3 capas, una capa en el cliente, otra en el servidor IIS, y otra en la base de datos; es decir, el navegador, el servidor Web y el servidor de bases de datos corren en diferentes máquinas.

Ejemplo Arquitectura n-Tier

Por otra parte, una arquitectura n-Layer define simplemente como se organiza el código. Normalmente incluye una capa de presentación, una capa de negocios, una capa de acceso a datos, una capa de entidades de negocio y una capa de datos – repositorio de datos. El hecho de que se dividan las capas para organizar el código, no significa que las capas obligatoriamente deban corren en diferentes máquinas o que deben estrictamente correr en una sola máquina o en un único proceso.

La siguiente figura detalla una arquitectura n-Layer básica.

Arquitectura N-Layer

Como podemos ver en la figura, en una arquitectura n-layer las capas solamente interactúan con sus capas adyacentes lo que permite abstraer funcionalidades de las capas superiores e inferiores. Por ejemplo, la capa de presentación no se da cuenta que tipo de base de datos o que repositorio de datos se utiliza por que esta solamente se comunica con la capa de negocios, y el repositorio de datos no se da cuenta en donde se esta utilizando o desplegando la información ya que este interactúa con la capa de acceso a datos.

En los post siguientes vamos a hablar el por que es importante dividir las aplicaciones en capas, y vamos a profundizar en las arquitecturas n-Layer.

10.18.2008

Buscando Elementos dentro de una Lista Generica - List.FindIndex

En el post anterior, trabajamos con el método List<T>.FindAll, el cual se encarga de obtener todos los elementos que concuerdan con un predicado definido por el usuario para comparar. En esta oportunidad vamos a trabajar con el método FindIndex de una lista genérica.

De acuerdo al msdn, el método FindIndex busca un elemento que cumpla con las condiciones especificadas por un predicado, y retorna el índice en la lista de la primera ocurrencia. Este índice inicia en 0 para el primer elemento y termina en el largo de la lista – 1 para el último elemento.

En este ejemplo vamos a buscar a la primera persona que vive en Costa Rica, y para tal fin vamos a utilizar la clase persona utilizada en el post anterior, y vamos a utilizar la lista cargada con los mismos datos del mismo post. Es importante recordar que esta aplicación de ejemplo, es una aplicación de consola.

Para iniciar, tenemos que crear un método que nos devuelva verdadero si la persona que viene por parámetro vive en Costa Rica o no. Este método será utilizado como predicado para buscar el elemento deseado dentro de la lista. Además, este método se va a invocar una vez por cada elemento dentro de la lista hasta que se encuentre el elemento buscado o hasta que finalice la lista. El método se muestra a continuación:

static bool viveEnCostaRica( Persona persona )
{
if (persona.Pais == "Costa Rica")
return true;
return false;
}


El siguiente método, es un método que busca el primer elemento que contenga como país “Costa Rica”, por lo tanto invoca el método FindIndex una vez con el método anterior como predicado.



static int IndicePrimeraPersonaQueViveEnCostaRica( List<Persona> listaPersonas )
{
int indice = listaPersonas.FindIndex(viveEnCostaRica);
return indice;
}


Por último, invocamos el método IndicePrimeraPersonaQueViveEnCostaRica y desplegamos en la consola el índice de la primera persona encontrada. Se debe destacar que si no se encuentra ninguna persona que cumpla con la condición establecida, el índice retornado es –1.



Console.WriteLine("Índice de la Primera Persona Encontrada de Costa Rica");
Console.WriteLine("------------------------------");
Console.WriteLine("Ínidice: {0} ", IndicePrimeraPersonaQueViveEnCostaRica(listaPersonas));



El resultado se puede ver en la siguiente figura.



image

10.12.2008

Buscando Elementos dentro de una Lista Generica - List.FindAll(Predicado)

En el post anterior, explicamos y hicimos un pequeño ejemplo acerca de como buscar un elemento dentro de una lista genérica, utilizando el método List<T>.Find. En esta oportunidad vamos a trabajar con el método FindAll de una lista genérica.

De acuerdo al msdn, el método FindAll obtiene todos los elementos que concuerden con las condiciones definidas por el predicado específico. Esto quiere decir que a diferencia del método Find que devuelve el primer objeto que cumple con el predicado, este método devuelve la lista de todos los objetos que cumplen con el predicado.

En este ejemplo vamos a buscar todas las personas que viven en México, y para tal fin vamos a utilizar la clase persona utilizada en el post anterior, y vamos a utilizar la lista cargada con los mismos datos del mismo post. Es importante recordar que esta aplicación de ejemplo, es una aplicación de consola.

El método para buscar las personas que viven en México a partir de una lista de personas es el siguiente.

image

Este método recibe la lista de objetos de instancia de persona que se va a recorrer para buscar solamente las que viven en México. El predicado para utilizar el método FindAll, es un handler a la función PersonaDeMexico, que se encarga de identificar si el objeto que se compara tiene como país México dentro de sus valores en la propiedad Pais. Hay que notar que al igual que el método Find, FindAll solo requiere una llamada al método, pero internamente se recorre toda la lista comparando todos los objetos que hay dentro de ella a través del método especificado en el predicado, en este caso PersonaDeMexico. FindAll devuelve todos los objetos que cumplieron de forma positiva en el predicado y los retorna al método que lo invoca. El método PersonaDeMexico que se utiliza en el predicado se presenta a continuación.

image

El método PersonaDeMexico, solamente compara la propiedad país contra el valor “Mexico” y retorna verdadero si la condición de cumple.

Para invocar el método BuscarPersonasDeMexico, se procede tal y como lo muestra el siguiente código.

image

 

 

 

 

 

El resultado al ejecutar el programa anterior es el siguiente:

image

10.09.2008

Buscando Elementos dentro de una Lista Generica - List<T>.Find(Predicado)

Es muy común tener la necesidad de buscar objetos en una colección basado en un criterio de búsqueda. Normalmente en ciertos momentos del desarrollo de una aplicación que utilice colecciones de objetos – en especial objetos de negocio - nos vamos a enfrentar a la necesidad de llevar a cabo tareas como por ejemplo: necesito obtener todos los objetos dentro de la lista que cumplen con el criterio X, necesito todos los objetos que su índice es mayor que Y, etc.

Para llevar a cabo esta tarea de una manera simple, en .NET la clase List<> tiene una serie de métodos que permiten realizar búsqueda sobre listas de objetos utilizando predicados especificos en la llamada.

Vamos a utilizar el método Find para buscar el primer objeto que cumpla con un predicado que nosotros mismos vamos a especificar a través de un método. Vamos a usar como base la clase Persona que vemos en la siguiente figura.

Clase_Persona

Seguidamtente vamos a inicializar una lista de personas la cual utilizaremos como referencia durante todos los ejemplos que vamos a desarrollar:

InicializarLista

El método Find de acuerdo al msdn permite buscar un elemento que concuerde con las condiciones definidas por un predicado específico, y retorna el primer objeto con cumpla con esta condición en la lista. Por ejemplo, supongamos que queremos la primera persona que tenga como nombre Juan y su primer apellido sea Ramos. El primer paso es crear un método para buscar la persona deseada. En este caso, vamos a buscar a Juan Ramos y vamos a retornar verdadero cuando lo encontramos y falso cuando no es el objeto que buscamos – En este caso la condición se encuentra digitada de manera directa, pero esta podría hacer referencia a una propiedad, a un campo de texto en una interface gráfica, etc.

CompararPersona

Seguidamente, vamos a crear un método que invoca el método find a travez del predicado definido, el cual en este caso será el método CompararPersona. Nótese que este método se “invoca” solamente una vez desde la lista, aunque internamente, el método se llama una vez por objeto contenido en la lista hasta que se termine la lista o se encuentre el objeto.

 BuscarPersona

Ahora, desde el método main, invocamos el método BuscarPersona e imprimos el pais donde reside la persona a buscar.

FindBuscarPersona

Y listo, el resultado se puede ver en la siguiente figura.

image