sábado, 31 de marzo de 2012

Patron de diseño Iterador (Java)

Patrón de Diseño ITERADOR

Proposito
 El patrón Iterador es un mecanismo de acceso a los elementos que constituyen una estructura de datos para la utilización de estos sin exponer su estructura interna.

Motivación

El patrón surge del deseo de acceder a los elementos de un contenedor de objetos (por ejemplo, una lista) sin exponer su representación interna. Además, es posible que se necesite más de una forma de recorrer la estructura siendo para ello necesario crear modificaciones en la clase.
La solución que propone el patrón es añadir métodos que permitan recorrer la estructura sin referenciar explícitamente su representación. La responsabilidad del recorrido se traslada a un objeto iterador.
El problema de introducir este objeto iterador reside en que los clientes necesitan conocer la estructura para crear el iterador apropiado.
Esto se soluciona generalizando los distintos iteradores en una abstracción y dotando a las estructuras de datos de un método de fabricación que cree un iterador concreto.

Aplicabilidad

El patrón iterator permite el acceso al contenido de una estructura sin exponer su representación interna. Además diferentes iteradores pueden presentar diferentes tipos de recorrido sobre la estructura (recorrido de principio a fin, recorrido con saltos...). Por otro lado los iteradores no tienen por qué limitarse a recorrer la estructura, sino que podrían incorporar otro tipo de lógica (por ejemplo, filtrado de elementos). Es más, dados diferentes tipos de estructuras, el patrón iterador permite recorrerlas todas utilizando una interfaz común uniforme

Consecuencias

El patrón Iterador permite por tanto diferentes tipos de recorrido de un agregado y varios recorridos simultáneos, simplificando la interfaz del agregado.

Estructura
Fuente Wikipedia

Explicación Simple:
El objetivo principal de este patrón es la manipulación de datos mediante los indices de una estructura ya sea estática (Arrays) o dinámica (Listas). la condición de este patrón es que el acceso debe de ser secuencial mente, a continuación se mencionan algunas de las operaciones que puede contener una clase iterador:

      -Recorridos uno a uno hacia delante.
      -Recorridos uno a uno hacia atras.
      -Recorridos en saltos.
      -Aplicación de Filtros.
      -Aplicación de operaciones.
      -Consulta de un dato por su posición.
      -etc..

Lo que no se puede hacer:
      X-Ordenaciones.(ya que requiere de un recorrido unico de principio a fin  las veces que tenga como talla.).

El principal problema que viene a resolver  este patron es lo siguiente.

Suponemos que tenemos una clase con un vector de tipo (int) la cual queremos saber cuantos de ellos son pares. estaría de esta manera: 
La forma simple de saber cuales son pares seria de manera sencilla y sin patron , un metodo que imprimiera los pares.

public class VectorDatos{
      int[] datos  = new int[5];
     public VectorDatos(){
           //llenamos el vector con los 5 datos
            datos[0] = 10;
            datos[1] = 3;
            datos[2] = 6;
            datos[3] = 5;
             datos[4] = 1;
      }
   public void filtrarPares()
     {
          for(int i=0;i<5;i++)
          {
                if(getValor(i) / 2 ==0)
                   {
                               imprimirPosicion(i);
                   }
           }             
     }

  public void imprimirPosicion(int pos)
   {
            System.out.printf("Valor : "+getValor(pos) .toString());
    }
    public int getValor(int pos){
        
return datos[pos];
    }
    
public void setValor(int pos, int valor){
        datos[pos] = valor;
    }
    
public int dimension(){
        
return _datos.length;
    } 
}

ahora si quisiera saber cuales son los impares, la solucion seria hacer otro metodo y anexarlos a la clase quedaria asi:

public class VectorDatos{
      int[] datos  = new int[5];
     public VectorDatos(){
           //llenamos el vector con los 5 datos
            datos[0] = 10;
            datos[1] = 3;
            datos[2] = 6;
            datos[3] = 5;
             datos[4] = 1;
      }
   public void filtrarPares()
     {
          for(int i=0;i<5;i++)
          {
                if(getValor(i) / 2 ==0)
                   {
                               imprimirPosicion(i);
                   }
           }             
     }

 public void filtrarImpares()
     {
          for(int i=0;i<5;i++)
          {
                if(getValor(i) / 2 !=0)
                   {
                               imprimirPosicion(i);
                   }
           }             
     }


  public void imprimirPosicion(int pos)
   {
            System.out.printf("Valor : "+getValor(pos) .toString());
    }
    public int getValor(int pos){
        
return datos[pos];
    }
    
public void setValor(int pos, int valor){
        datos[pos] = valor;
    }
    
public int dimension(){
        
return _datos.length;
    } 
}



y si quisiera anexarle otro metodo que me filtrara a los ceros, seguiria siendo la misma solucion crear un metodo y anexarlo esto convertiria a la clase con una codificación basta. 

Lo que el patrón Iterador propone es crear una clase que realice recorridos independientemente de la clase que manipula los valores de la estructura.
la clase iterador quedaria asi:

public class IteradorParesImpares {
   
private int[] _vector;
   
private int _posicion;

   
public IteradorVector(VectorDatos vector) {
        _vector =
vector._datos;
        _
posicion = 0;
    } 

 public void filtrarPares()
     {
          for(int i=0;i<5;i++)
          {
                if(getValor(i) / 2 ==0)
                   {
                               imprimirPosicion(i);
                   }
           }             
     }

 public void filtrarImpares()
     {
          for(int i=0;i<5;i++)
          {
                if(getValor(i) / 2 !=0)
                   {
                               imprimirPosicion(i);
                   }
           }             
     }

  public void imprimirPosicion(int pos)
   {
            System.out.printf("Valor : "+getValor(pos) .toString());
    }


    public boolean hasNext(){
       
if (_posicion < _vector.length)
                   
return true;
           
else
                   
return false;
    }
   
public Object next(){
           
int valor = _vector[_posicion];
            _
posicion++;
           
return valor;
    }    
 public int getValor(int pos){
        
return datos[pos];
    }
    
public void setValor(int pos, int valor){
        datos[pos] = valor;
    } 

}


y la nueva clase manipulador de datos se le anexaría un método el cual al mandarlo a llamar que retorne un objeto de la clase del iterador deseado.

public class VectorDatos {
   
   
public int[] datos;
 
      int[] datos  = new int[5];
     public VectorDatos(){
           //llenamos el vector con los 5 datos
            datos[0] = 10;
            datos[1] = 3;
            datos[2] = 6;
            datos[3] = 5;
            datos[4] = 1;
      }
   
   
public int getValor(int pos){
       
return _datos[pos];
    }
   
public void setValor(int pos, int valor){
        _datos[pos] = valor;
    }
   
public int dimension(){
       
return _datos.length;
    } 
//nuevo metodo que manda a llamar al iterador deseado
   
public  
IteradorParesImpares  iterador(){
       
return new IteradorVector(this
);
    }

}

y  se utilizaria asi :

       public static void main(String[] args) {
    }


        // TODO code application logic here
        VectorDatos vector = new VectorDatos();

        //Creación del iterador
        IteradorParesImpares iterador = vector.iterador();

        //Recorrido con el iterador
        while (iterador.hasNext())
        System.out.println(iterador.next()); 

       // filtrar pares e impares
          iterador.filtrarPares();
          iterador.filtrarImpares();


          } 

Podriamos crear mas iteradores con diferentes funciones y usarlos con la misma estructura, solo tendríamos que crear un nuevo método en la clase manupulador que cree el objeto iterador y se pase el this como parametro.

(Espero les haya servidor, recibo sugerencias y comentarios de cualquier tipo)



sábado, 14 de enero de 2012



Conexion |||| C# - SQL Server ||||




Comenzaremos viendo este tema que para algunas personas se les complica realizar esta operación..

Necesitamos:

  • Entorno de desarrollo para C#, en este caso Visual Studio 2010.
  • Una version de SQL Server, en este caso la 2000.
  • y lo mas importante..Poner atencion y leer cuidadosamente.. :)

Debemos de conocer.

La cadena de conexión

La cadena de conexión puede ser de dos formas distintas, según se indique la autenticación de Windows o la de SQL Server.
En la primera no hay que indicar ni usuario ni password, en la segunda si que hay que indicar esos dos datos.
Las bases de datos de SQL Server a las que podemos acceder con esa cadena de conexión pueden ser de cualquier versión, al menos yo lo he probado con las versiones 7.0, 2000 y 2005, en los tres casos usando ADO.NET.
En los siguientes ejemplos usaremos ciertos valores que tendrás que indicar según tus preferencias, me refiero al nombre del servidor de SQL Server y a la base de datos a la que quieres acceder, además del nombre del usuario o la contraseña.
En esos casos estarán indicados con letra en negrita y cursiva, el resto es texto "fijo" y que siempre podrás usar.
Esos valores serán los siguientes:
ValorDescripción
ServidorSQL  El nombre del servidor de SQL Server al que quieres acceder.
Los valores que puede tener dependerá de tu configuración de SQL Server, pero estos son los valores más comunes:

ValorDescripción
.
(local)
Uno de estos valores indicará que quieres acceder a la instancia predeterminada de SQL Server que haya en el equipo en el que se está ejecutando la aplicación.
Es preferible usar (local).
NombreEquipoEl nombre del equipo en el que se está usando la aplicación.
Es preferible usar (local) para que no influya el equipo en el que se ejecute el programa.
NombreDNSUn nombre DNS es decir, un nombre que después "resolverá" una dirección IP, por ejemplo, el nombre de un servidor de Internet: nombreDominio.com.
DirecciónIPUna dirección IP en la que está el servidor de SQL al que queremos acceder, esto vale para servidores que están en equipos remotos.
Por defecto se utilizará el puerto predeterminado: 1433
DirecciónIP, PuertoLa dirección IP del servidor de IP al que se accederá por el puerto indicado.
Por defecto el puerto de SQL Server es el 1433.
ServidorSQL/Instancia  Si no queremos usar la instancia predeterminada del servidor de SQL Server indicado (usando cualquiera de los cuatro métodos anteriores), podemos indicarlo después del nombre del servidor separado con un \.
Por ejemplo, en Visual Studio .NET (2002 y 2003) se crea una instancia llamada NETSDK, para acceder a esa instancia usaremos: (local)\NETSDK.
En Visual Studio 2005 se suele instalar el SQL Server 2005 Express y se crea una instancia llamada SQLEXPRESS, para acceder a las bases de datos de esa instancia, usaremos: (local)\SQLEXPRESS.

BaseDatos  El nombre de la base de datos de SQL Server a la que quieres acceder (no la tabla)
Usuario  El nombre del usuario de la base de datos a la que quieres acceder.
Contraseña  El password (o contraseña) del usuario indicado.


Pagina en Costruccion..