sábado, 10 de noviembre de 2012

El Patrón Estrategia en Java

Este proyecto fue guiado por el patrón de diseño Strategy Pattern para su estructura, junto a librerías que dan apoyo para su realización tales como el sonido y el LookAndFeel. No vamos a explicar el proyecto pero si explicaremos la parte esencial del proyecto, que es este patrón de diseño. El patrón de diseño Strategy se guían con los siguientes pasos:
  • Separar los datos que cambiaran de valor en un futuro. Ya que en una empresa todo cambia o muere al no hacerlo. Ya sea por mejoramiento, innovación, etc. Siempre esta destinada a cambiar y nada mejor que un patrón de diseño que aguante el cambio.
  • Programar para una interfaz no una implementación. En pocas palabras (Herencia no siempre es la respuesta) ya que si se seguían en Herencia siempre estarás cambiando el dato.
Para mayor entendimiento es mejor si aplicamos un pequeño ejemplo. Supongamos que trabajamos para una empresa de aplicaciones educativas y recibimos una llamada para la realización de una aplicacion de lecciones de Guitarra. En este caso no queremos abundar con clases de guitarras ya que solo se quiere tomar una leccion con una sola clase de guitarra. Lo primero que se nos podría ocurrir es crear una clase Padre llamada Tonos y que todos los tonos hereden de este y aquí es donde empiezan notar los 2 pasos antes mencionados. Cualquier subclase de la clase Tonos estarían reusando los métodos, pero cuando aparecen casos por ejemplo: los tonos Do,Re,Mi,Fa,Sol,La,Si; cada subclase de tonos no siempre debe de reusar los metodos ya que hay casos en donde no son necesarios reusarlos ya sea por diferentes comportamientos que este realiza.
abstract class Tonos {

    public abstract void doMayor();

    public abstract void doMenor();
}

class DOMayor extends Tonos {

    public void doMayor() {
        System.out.println(" Esta posicion es doMayor ");
    }
}
Pero si haces esto es probable que vuelvas a recibir una llamada de quejas, ya que esto no es muy flexible a cambios ya que habran mas cambios en el futuro, mas tonos con posiciones diferentes, etc. Siguiendo el paso 1 descrito al incio, debemos pensar sobre los comportamientos que podrían variar en un futuro. Para este ejemplo podríamos mencionar Domayor,Domenor,DoBemol, Do sostenido, Do septimo, etc. Y luego. Siguiendo el paso 2. Haríamos un conjunto de comportamientos programando para una interfaz. Esto nos quedaría del siguiente modo:

public interface Chords {

    public abstract void position(List<List<JLabel>> cuerda);

    public abstract String chordName();
}
//-----------------COMPORTAMIENTOS--------------//
package Chords.C;

import ChordsBehavior.Chords;
import java.util.List;




import javax.swing.JLabel;
       //Este comportamiento es del tono C mayor
public class C_Mayor implements Chords {

    List<List<JLabel>> cuerdas;

    public void position(List<List<JLabel>> cuerda) {    //Posicion del Tono en los acordes
        this.cuerdas = cuerda;
        cuerda.get(0).get(1).setVisible(true);     //traste 0(1) cuerda 1(2);
        cuerda.get(1).get(3).setVisible(true);   // traste 1(2)cuerda 3(4);
        cuerda.get(2).get(4).setVisible(true);   // traste 2(3) cuerda 4(5);
    }

    public String chordName() {
        return "C Mayor";
    }
}

// Nota:   No creamos una clase Abstracta ya que la parte de la vista extiende de Jframe 
//-----------------Vista-----------------------------//
public class GuitarApp extends javax.swing.JFrame implements BasicPlayerListener {

    Chords c = null;
    List<List<JLabel>> cuerda = null;     //una lista de listas 

    private void cMayorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cMayorActionPerformed
        try {
            cMinor.setSelected(false);
            cSharp.setSelected(false);
            c7.setSelected(false);
            this.emptyTrast();

            c = new C_Mayor();
            c.position(cuerda);  //pasamos la lista de listas para las posiciones de la cuerda y el traste para la colocacion de la posicion de este acorde cuyo comportamiento es DO_MAYOR

            if (!muteBox.isSelected()) {
                file = getClass().getResource("/note_sound/DoMayor.mp3");

                File a = new File(file.toURI());
                jf.setSelectedFile(a);
                a = jf.getSelectedFile();
                System.out.println(a.getName());
                loadFile(a);
                play();
            }



            for (int i = 0; i <= 3; i++) {

                this.d_Chords().get(i).setSelected(false);
                this.e_Chords().get(i).setSelected(false);
                this.f_Chords().get(i).setSelected(false);
                this.g_Chords().get(i).setSelected(false);
                this.a_Chords().get(i).setSelected(false);
                this.b_Chords().get(i).setSelected(false);
            }
        } catch (BasicPlayerException ex) {
            Logger.getLogger(GuitarApp.class.getName()).log(Level.SEVERE, null, ex);
        } catch (URISyntaxException ex) {
            Logger.getLogger(GuitarApp.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}
Para este proyecto se siguió esta estructura, en donde el dato que variaría serían los tonos ya que hay un sin numero de tonos y cada clase de tono tiene una posición distinta y sonido distinto. El proyecto se encuentra disponible para su descarga en el siguiente enlace:

Descargar

Y también les dejo un screenshot del proyecto :

Figura 1. Aplicación de lecciones de Guitarra desarrollado en Java utilizando el Patrón Estrategia
Espero este post les sea de utilidad y quiero hacer un agradecimiento al autor del mismo, mi amigo Roliver Javier Rodriguez quien nos envió su aporte desde Santo Domingo. Saludos y hasta una próxima oportunidad.

viernes, 9 de noviembre de 2012

Ejemplo básico de ABAP

El propósito de este post es mostrarles el camino, paso a paso, para iniciarse en el mundo SAP y lógicamente la programación en ABAP, un lenguaje de cuarta generación orientado al desarrollo de aplicaciones y reportes empresariales. Evidentemente en este artículo no se va a detallar todos los conceptos técnicos y muchos serán pasados por alto o se harán descripciones breves pues la gran mayoría de personas que lean este post son gente que está dando sus primeros pasos, así que no tiene sentido profundizar en conceptos que se aprenderán en el camino.
Bien, ahora debo indicar que para poder desarrollar este ejemplo debemos contar con algún entorno SAP, ya sea una instalación de prueba personal o el de alguna empresa para la cual laboremos. En otro post detallaré la manera de cómo conseguir una instalación doméstica de SAP (minisap).
SAP trabaja en base a transacciones. Existen muchas de ellas ypueden servirnos para, entre otras cosas, generar facturas, ordenes de compra, control de stock, etc. Una de las más importantes es el diccionario de datos, al cual accedemos a través de la transacción SE11 tal como se muestra en la Figura 1. Escribimos el código de la transacción y a continuación presionamos la tecla enter.
Figura 1. Transacción SE11 para el acceso al diccionario de datos de SAP.
En esta transacción podemos gestionar tablas, vistas, etc. a través de la interfaz que se muestra en la Figura 2. Con fines académicos SAP nos brinda tablas de un sistema de vuelos que ya vienen con datos desde el momento de la instalación de NetWeaver.

Figura 2. Diccionario de datos de SAP.
Entonces lo que debemos hacer es ingresar el nombre de la tabla de conexiones de vuelos: SPFLI en la ventana de la Figura 2 y hacer clic en el botón  Visualizar . Esto nos llevará a la ventana de la Figura 3 en donde podemos visualizar la estructura de la tabla de conexiones de vuelo.

Figura 3. Estructura de la tabla de conexiones de vuelo
Para observar el contenido de esta tabla debemos hacer clic en el botón , que se encuentra en la parte superior. Esto nos llevará a la ventana de la Figura 4. En esta ventana podemos personalizar nuestra consulta ingresando una serie de parámetros.

Figura 4. Pantalla se selección de la tabla SPFLI.
En nuestro caso por defecto la ejecutaremos sin parámetros haciendo clic en el botón , lo que nos llevará a la ventana de la Figura 5.

Figura 5. Datos de conexiones de vuelo.
Ahora que conocemos un poco la tabla de conexiones de vuelos, podemos crear nuestro primer programa en ABAP que haga una consulta sencilla a esta tabla y nos devuelva un registros. Para esto abrimos un nuevo modo utilizando el comando /n seguido de la transacción utilizada para la creación de programas: SE38, tal como se muestra en la Figura 6.

Figura 6. Transacción SE38 utilizada para la creación de programas.
A continuación se nos mostrará la ventana de la Figura 7 en donde debemos escribir el nombre de nuestro programa. Les comento que el nombre del programa debe empezar con Z o con Y pues en caso contrario SAP no nos permitirá crearlo. Una vez ingresado el nombre, hacemos clic en el botón Crear.
Figura 7. Ventana utilizada para creación de programas.
Al crear el programa, SAP nos mostrará la ventana de la Figura 8 en donde solo será necesario indiciar el nombre del programa y el tipo: Programa ejecutable. 

Figura 8. Ventana de atributos del programa.
Por último nos aparecerá la ventana de la Figura 9, en donde solo debemos indicarle que el programa creado será un objeto local ya que de este modo no se va a generar órdenes de transporte (este tema será tratado en otro post).

Figura 9. Ventana de atributos del objeto.
Hecho esto, SAP nos mostrará el editor de texto de la Figura 10 en donde podremos editar nuestro programa utilizando ABAP.

Figura 10. Editor ABAP.
En esta ventana debemos escribir nuestro programa. Para este caso escribiremos un programa que ejecute un SELECT a la tabla de conexiones de vuelo y nos filtre solo un registro por ID de la compañía de vuelos. Declaramos la variable wa_spfli la tendrá la misma estructura que la tabla spfli. Esto se logra mediante la palabra reservada LIKE. Adicionalmente declaramos un parámetro de la pantalla se selección (como la mostrada en la Figura 4) con la palabra reservada PARAMETERS. Con la sentencia SELECT SINGLE le indicamos a SAP que nos devuelva solo un registro. INTO CORRESPONDING FIELDS OF indica que cada celda de la tabla SPFLI se va a situar en su columna correspondiente de nuestra tabla WA_SPFLI. La cláusula WHERE tiene la misma función que en SQL estándar. Y la sentencia WRITE sirve para mostrar el resultado de nuestra consulta en pantalla.

REPORT  Z_PRIMER_PROGRAMA.

***********************
* DECLARACIÓN DE DATOS
***********************

* EL WORK ÁREA REPRESENTA LA ESTRUCTURA DE UNA TABLA
DATA WA_SPFLI LIKE SPFLI.
PARAMETERS PA_CARR LIKE SPFLI-CARRID.

SELECT SINGLE CARRID CONNID CITYFROM CITYTO FROM SPFLI INTO CORRESPONDING FIELDS OF WA_SPFLI WHERE CARRID = PA_CARR.

WRITE: WA_SPFLI-CARRID COLOR COL_KEY,
WA_SPFLI-CONNID COLOR COL_KEY,
WA_SPFLI-CITYFROM, WA_SPFLI-CITYTO.
Una vez terminada la edición de nuestro programa, debemos activarlo haciendo clic en el botón . Hecho esto nos aparecerá la ventana de la Figura 11 en donde debemos confirmar el programa que deseamos activar seleccionándolo y presionando Enter.

Figura 11. Ventana de activación de programas.
Luego de activarlo presionamos F8 para ejecutar nuestro programa y nos mostrará la ventana de la Figura 12.
Figura 12. Ejecución de nuestro primer programa en SAP.
Para seleccionar una compañía aérea hacemos clic en el botón  y se desplegará la ventana de la Figura 13. Hacemos doble clic en cualquier registro y automáticamente se pasará el registro a la ventana de la Figura 12.
Figura 13. Lista de compañías aéreas.
Luego de esto presionamos F8 para ejecutar nuestro programa y obtendremos como resultado una pantalla similar al mostrado en la Figura 14.

Figura 14. Resultado de la ejecución de nuestro primer programa en SAP.
Como podemos ver el lenguaje ABAP maneja las consultas a base de datos de manera similar a un gestor de base de datos que utilice el estándar SQL. Espero que este ejemplo les sea de utilidad y próximamente estaré publicando más artículos relacionados a SAP.

Hasta la próxima.