Alters

La pseudo-capa: abstracción

Buenas de nuevo!

En esta entrega veremos cómo sacarle algo más de partido a nuestras funciones.
En este caso, intentaré no hacer dos versiones, sino hacer una especie de "pseudocódigo" que pueda ser entendido y extrapolado al lenguaje de programación que uséis.

- Abstracción de conceptos
    · Clases auxiliares
    · Tablas auxiliares

Clases auxiliares:

Clase auxiliar, para mí, es toda aquella que apoya el desarrollo de un proyecto, pero es "secundaria"; es decir, podríamos prescindir de ella.

Un ejemplo sería una clase que solo tuviera variables globales, cadenas de formato, métodos para formatear, sacar diferencias (por ejemplo añadir un porcentaje - IVA - a una cantidad)... todos estos métodos se podrían incluir en diversas clases que lo necesitaran, pero los metemos en un utilitario para no replicar código. Ésta se convierte en una clase auxiliar.

Así, para el IDA, podemos crear la clase auxiliar esbozada en la entrega anterior.
Pero, aparte, podemos hacer una serie de métodos que agilicen el proceso de montar listas de objetos, las selecciones...

Para ello hay varias cosas que podríamos hacer. Es obvio que esto son solo algunas de las cosas que se podrían hacer, y siempre aceptaré nuevos aportes.

 - Lista de select:

 Se puede crear una lista de selects, updates... (de SQL me refiero) y usar un índice único para invocarlos.

Un ejemplo:

SelectList = array("select * from personas", "update personas set telefono = 0")

Entonces solo tendríamos que llamar a SelectList[0] para usar la primera selección.

No obstante, como habréis visto, cosas tan generales (como hacer un set a todos los registros de personas) pueden no servir. Para arreglar esto, se pueden hacer varias cosas:

   * Sublistas de select:

Se puede hacer algo similar a ésto:

Select1 = array("select nombre, telf from personas where nombre like('", "');
Select2 = array("update personas set telefono=", " where id=");
SelectList = array(Select1, Select2);

function getSelect(int id, array values){
  String ret = "";
  Array aux = SelectList[id]
  for(i=0;i<length(aux);i++)
     ret = concat(aux[i], values[i]);

 return ret;
}

Como veis, haciendo una lista de listas se pueden intercalar valores. Esto produciría sentencias personalizadas, lo que es más útil. AVISO que esta función es un prototipo. Al copiar esta función es posible que tengáis que retocar algo (añadir un if, quitar algo innecesario...). Esto está hecho de manera rápida y en una sintaxis propia más del pseudocódigo.

Retomando el ejemplo de objetos de la anterior entrada

/*
$bridge = new MyBridge(); //suponiendo que la clase la llaméis así
$array = $bridge->execute("select curdate() from dual");
$bridge->disconnect();
*/

y, si este método lo metemos en nuestra clase Utilities, podríamos modificar lo anterior, y hacer:

bridge = new MyBridge(); //para lanzar SQL
array = bridge.execute(Utilities.getSelect(0, {{David}}); //hacemos un select, los {{ }} indican un inicio y //fin de "array rápido"
bridge.disconnect();

No obstante, tendríamos que tener una lista de objetos e ir iterando sobre "array" para crear objetos...

- Generador de objetos

Esta parte es posible que no funcione con ciertos lenguajes de programación, aunque siempre se puede hacer algo parecido (desde luego, en php, que es donde más se usa la base de datos funciona).

Supongamos que tenemos el siguiente objeto

Class Persona{
  private String nombre;
  private String apellido;
  private String telf;
  private int id;
}

podemos añadir un método, al que podemos llamar "setVal", que sea así:

function setVal(Array values){
 vars = array(&this.nombre, &this.apellido, &this.telf, &this.id);

  for(i=0;i<length(vars);i++)
  vars[i] = value[$i];
}

y voliá, como pasamos la dirección de memoria (puntero) de los atributos de la clase (por eso el &), se modifican los valores de la propia clase, desde cualquier sitio.

Por tanto, podríamos hacer, siguiendo con el ejemplo anterior:

for(i=0;i<length(array);i++){
 per = new Persona();
 per.setVal({{array.next()}}); //en php se tendría que hacer un mysql_fetch_array y arreglarlo un poco
 objArray.add(per);
}

¡Pero vayámos un poco más allá!

- Generador de array dinámico

Podemos crear en Utilities una función así:

/*
params:

[0] ->id sql
[1] ->parámetros para el id
[2] ->tipo de objeto
[3] -> patrón de llenado
*/
fill(Array params){
  Object o = new Object();
  Array ret = new Array();
  bridge = new MyBridge(); 
  array = bridge.execute(this.getSelect(params[0], params[1]);
  bridge.disconnect();

  if(params[2] == 1){
     o = new Persona();
  }

  for(i=0;i<length(array);i++){
  aux = array(); 
    for(j=0;j<strlen(params[3];j++){
       val = "";

       if(substr(params[3], i, 1) == 1)
         val = array[j];

       aux.add(val);
    }

  o.setVal(aux);
  ret.add(o)
 } 

 return ret;
}

Bien, parece confuso, pero veamos un ejemplo:

objArray = Utilities.fill({{0, {{David}}, 1, 1010}});

Esto llenaría con una lista de personas (porque le paso un 1), y solamente nombre y telf (1010), con el select 0.

Como digo, puede parecer confuso. Es cuestión de mirar bien el código, adaptarlo a vuestro lenguaje favorito (recomiendo php en este caso) e ir probando.

Creo que sacar un array con una sola función es algo que puede servir...

Tablas auxiliares:

Para no cargar las clases con un montón de arrays, se pueden crear una serie de tablas en nuestra base de datos (incluso en una aparte), y que contenga las listas de sentencias, agrupadas por un id, por ejemplo.

Solo sería cosa de modificar la función getSelect para que conectase con la tabla y recuperase los fragmentos, el resto sería todo igual.

De momento termino esta entrega aquí.

Es posible que la próxima sea una continuación de ésta, ya veré...

Hasta la próxima!