Programación en Capas Hoy haremos un tema que es bastante interesante y muy usado en el desarrollo de software. Realizaremos un ejemplo de la programación orientada a capas. La programación orientada a capas es una técnica que se usa para el desarrollo de software el cual permita que dicho software sea escalable, mantenible, consistente y que tenga una aspecto mucho más profesional de desarrollo, no como la clásica programación secuencial. La programación orientada a capas se caracteriza por ser un tipo de diseño en el desarrollo de software mediante clases las cuales se separan generalmente en: -La capa de datos. -La capa de negocios. -La
capa
de
presentación.
Bien, como se sabe que lo que Ud. quiere es la parte técnica más no la parte teórica, pasaremos a realizar el ejemplo de la programación orientada a capas. Tener en cuenta que la programación en capas generalmente va de la mano con la programación orientada a objetos para la optimización de este.
Estructura del proyecto Creamos el proyecto, luego creamos 4 paquetes uno para la capa de datos, otro para la capa de negocio, otro para la capa de presentación y el último para los encapsulamientos. Tener en cuenta que para poder trabajar de forma más ordenada es mejor separar la lógica de negocio de los datos, así mismo sería bueno separar componentes aislados al código fuente en otro paquete como las imágenes, formato de reportes y otros. Ahora que tenemos t enemos los 4 paquetes, creamos en cada uno de ellos la clase respectiva res pectiva para par a trabajar. tr abajar. En este caso haremos un ejemplo que consista en manejar mediante la Programación en capas la inserción y lectura de los datos de una persona. Para dicho caso en el paquete de encapsulamiento creamos una clase TPersona, en la capa de datos (Paquete que se creo para los datos) creamos otra clase DbTPersona, en la capa de presentación (Paquete para los formularios) creamos un formulario frmPersona y e la capa de negocio (Paquete para negociar los datos) creamos la clase NegocioFrmPersona. Debemos tener en cuenta que en la Programación sobre capas, generalmente se debe crear un encapsulado y una clase de la capa de datos por cada tabla existente en nuestra base de datos y un negocio por cada formulario el cual será quien maneje toda la negociación de datos entre las capas de datos que se usen en el formulario y la capa de presentación. También recordar que en la capa de datos
se puede crear una clase exclusivamente para las consultas relacionales ya que la programación orientada a objetos que va de la mano con la programación en capas no permite encapsular este tipo de consultas. Como en nuestro caso no tenemos una base de datos, simularemos dicho caso con un formulario que tenga los campos para registrar una persona que lo pasará a un JTable y luego tendremos un botón que permita leer tales datos almacenados en nuestro JTable. La estructura de nuestro árbol con las clases creadas debería quedar de la siguiente manera.
Diseño del formulario Con lo mencionado anteriormente, nuestro formulario debería quedar de la siguiente forma.
Código Fuente La Clase TPersona /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package ENCAPSULAMIENTO; /** * * @author kaaf */ public class TPersona { private private private private private private private
String nombre; String apellidoPaterno; String apellidoMaterno; String dNI; String direccion; int edad; char sexo;
public void SetNombre(String nombre) { this.nombre=nombre; } public String GetNombre() { return this.nombre; } public void SetApellidoPaterno(String apellidoPaterno) { this.apellidoPaterno=apellidoPaterno; } public String GetApellidoPaterno() { return this.apellidoPaterno; }
public void SetApellidoMaterno(String apellidoMaterno) { this.apellidoMaterno=apellidoMaterno; } public String GetApellidoMaterno() { return this.apellidoMaterno; } public void SetDNI(String dNI) { this.dNI=dNI; } public String GetDNI() { return this.dNI; } public void SetDireccion(String direccion) { this.direccion=direccion; } public String GetDireccion() { return this.direccion; } public void SetEdad(int edad) { this.edad=edad; } public int GetEdad() { return this.edad; } public void SetSexo(char sexo) { this.sexo=sexo; } public char GetSexo() { return this.sexo;
} }
La Clase DbTPersona
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package CAPADEDATOS; import import import import import
ENCAPSULAMIENTO.TPersona; java.util.ArrayList; java.util.List; javax.swing.JTable; javax.swing.table.DefaultTableModel;
/** * * @author kaaf */ public class DbTPersona { public static DefaultTableModel Registrar(TPersona tPersona, JTable miTabla) { DefaultTableModel modeloDeDatosTabla=(DefaultTableModel)miTabla.getModel(); Object[] datosRegistro= { tPersona.GetNombre(), tPersona.GetApellidoPaterno(), tPersona.GetApellidoMaterno(), tPersona.GetDNI(), tPersona.GetDireccion(), tPersona.GetEdad(), tPersona.GetSexo() }; modeloDeDatosTabla.addRow(datosRegistro); return modeloDeDatosTabla; } public static List LeerTodo(JTable miTablaDeDatos)
{ List listaTPersona=new ArrayList<>(); for(int i=0;i
La Clase NegocioFrmPersona
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package CAPADENEGOCIO; import import import import import import
CAPADEDATOS.DbTPersona; ENCAPSULAMIENTO.TPersona; java.util.ArrayList; java.util.List; javax.swing.JOptionPane; javax.swing.JTable;
/** * * @author kaaf */ public class NegocioFrmPersona { public void Registrar(TPersona tPersona, JTable miTabla) { try {
miTabla.setModel(DbTPersona.Registrar( tPersona, miTabla)); } catch(Exception ex) { JOptionPane.showMessageDialog(null, ex.getMessage()); } } public List LeerDatosPersona(JTable tablaDeDatos) { List listaTPersona=new ArrayList<>(); try { listaTPersona=DbTPersona.LeerTodo(tablaDeDatos); } catch(Exception ex) { JOptionPane.showMessageDialog(null, ex.getMessage()); } finally { return listaTPersona; } } }
Botón "Ingresar Datos"-actionPerformed
TPersona tPersona=new TPersona(); tPersona.SetNombre(txtNombre.getText()); tPersona.SetApellidoPaterno(txtApellidoP.getText()); tPersona.SetApellidoMaterno(txtApellidoM.getText()); tPersona.SetDNI(txtDNI.getText()); tPersona.SetDireccion(txtDireccion.getText()); tPersona.SetEdad(Integer.parseInt(txtEdad.getText())); tPersona.SetSexo(rbM.isSelected() ? rbM.getText().charAt(0) : rbF.getText().charAt(0)); new NegocioFrmPersona().Registrar(tPersona, jTableDatos);
Botón "Leer Datos Ingresados"-actionPerformed
List listaTPersona=new NegocioFrmPersona().LeerDatosPersona(jTableDatos); DefaultTableModel modeloTabla=new DefaultTableModel(); modeloTabla.addColumn("Nombre"); modeloTabla.addColumn("Apellido P."); modeloTabla.addColumn("Apellido M."); modeloTabla.addColumn("DNI"); modeloTabla.addColumn("Dirección"); modeloTabla.addColumn("Edad"); modeloTabla.addColumn("Sexo"); for(TPersona tPersona:listaTPersona) { Object[] registroLeido= { tPersona.GetNombre(), tPersona.GetApellidoPaterno(), tPersona.GetApellidoMaterno(), tPersona.GetDNI(), tPersona.GetDireccion(), tPersona.GetEdad(), tPersona.GetSexo() }; modeloTabla.addRow(registroLeido); } jTableDatosLeidos.setModel(modeloTabla);
Compilando la Aplicación Una vez se realizó todos estos pasos la aplicación debería correr de la siguiente manera.
Tener en cuenta que los datos no fueron validados por lo que debería ingresarse datos correctos sin dejar ningún dato vacío. Por otro lado, hay cosas que no debería estar; como pasar el JTable desde la capa de presentación hasta la capa de datos. Pero se hace esto porque no se está trabajando con una base de datos real y se está tomando como base de datos nuestra primera tabla donde estamos ingresando los datos de la persona. En un próximo post ya estaremos viendo programación orientada a objetos con el uso de una base de datos real, herencia, polimorfismo entre otros.