Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programación en Capas.
La programación por capas es un estilo de programación en el que el objetivo primordial es la separación de la
lógica de negocios de la lógica de diseño; un ejemplo básico de esto consiste en separar la capa de datos de la
capa de presentación al usuario.
Se utiliza este tipo de programación, pues la ventaja principal de este estilo es que el desarrollo se puede llevar a
cabo en varios niveles y, en caso de que sobrevenga algún cambio, sólo se ataca al nivel requerido sin tener que
revisar entre código mezclado.
Caso Planteado:
Se desea administrar los datos de los empleados de una organización. De cada empleado se conoce su código,
fecha de ingreso a la organización, apellidos, nombres y área en la que trabaja.
Además se conoce el número de horas trabajadas por semana, el número de dependientes, el puesto (Jefe de
área, administrativo o auxiliar), la modalidad (estable o contratado) y sus descuentos (AFP, EsSalud, FNP).
Se considera como horas normales trabajadas 40 horas por semana. Por cada dependiente recibe un adicional de
S/.45.00. Si es Jefe de área tiene un pago por hora normal de S/.50, si es Administrativo S/. 30 y si es Auxiliar
S/. 15. Cada hora extra se paga con un 50% adicional sobre la hora normal. Si es estable recibe un adicional del
20% y si es contratado 10%. Si cotiza en la AFP el descuento es del 8%, en el FNP 5% y en EsSalud 3%.
a.- Capa de Presentación: es la que ve el usuario (también se la denomina "capa de usuario"), presenta el
sistema al usuario, le comunica la información y captura la información del usuario en un mínimo de proceso
(realiza un filtrado previo para comprobar que no hay errores de formato). Esta capa se comunica únicamente
con la capa de negocio. También es conocida como interfaz grafica y debe tener la característica de ser
"amigable" (entendible y fácil de usar) para el usuario.
// Clase: FrmDatos.java
package capaPresentacion;
import java.io.*;
import java.text.*;
public FrmDatos() {
initComponents();
setLocationRelativeTo(null);
}
/** Aqui va el código del método intiComponents. No se ha colocado puesto que
* es generado automáticamente por el IDE.
*/
private void formWindowOpened(java.awt.event.WindowEvent evt) {
try {
txtCodigo.setText(generaCodigo(new EmpleadoBL().getNumeroRegistros()));
} catch(IOException ex) {
showMessageDialog(this, "No se pudo acceder al archivo\n" + ex.getMessage(),
"Aviso", 2);
}
}
private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
private void btnBuscarActionPerformed(java.awt.event.ActionEvent evt) {
codigoE = null;
try {
if(new EmpleadoBL().listarEmpleadosParaPago().size()>0) {
FrmBuscarEmpleado buscar = new FrmBuscarEmpleado(this, 1);
buscar.setVisible(true);
} else {
showMessageDialog(this,"No existen datos de empleados para pagos","Aviso",2);
activar2(false);
principal.setSelectedIndex(0);
activar(false);
btnNuevo.requestFocus();
}
}catch(IOException ex) {}
}
private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {
try {
int anio = dcbxFecha.getCurrent().get(java.util.Calendar.YEAR);
int mes = dcbxFecha.getCurrent().get(java.util.Calendar.MONTH) + 1;
int dias = dcbxFecha.getCurrent().get(java.util.Calendar.DATE);
String fecha = dias + "/" + mes + "/" + anio;
new EmpleadoBL().setEmpleado(txtCodigo.getText(), fecha, txtApellidos.getText(),
txtNombre.getText(), String.valueOf(cbxArea.getSelectedItem()));
} catch(IOException ex) {
showMessageDialog(this, "No se pudo acceder al archivo\n" + ex.getMessage(),
"Aviso", 2);
}
limpiarCajas();
activar(false);
formWindowOpened(null);
}
private void formWindowActivated(java.awt.event.WindowEvent evt) {
if(principal.getSelectedIndex()== 1) {
txtCodigoE.setText(codigoE);
txtHoras.requestFocus();
} else {
if(principal.getSelectedIndex() == 2 && codigoE != null) {
calcularPagos();
}
}
}
private void calcularPagos() {
DecimalFormat formato = new DecimalFormat("S/ ###,##0.00");
txtCodigoEB.setText(codigoE);
try {
String datos = new EmpleadoBL().obtenerDatos(codigoE);
txtDatos.setText(datos);
txtHorasNormales.setText(formato.format(new
DatosPagoBL().getPagoHorasNormales(codigoE)));
txtHorasExtras.setText(formato.format(new
DatosPagoBL().getPagoHorasExtras(codigoE)));
txtSueldoBruto.setText(formato.format(new
DatosPagoBL().getSueldoBruto(codigoE)));
txtBonificaciones.setText(formato.format(new
DatosPagoBL().getBonificaciones(codigoE)));
txtDescuentos.setText(formato.format(new DatosPagoBL().getDescuentos(codigoE)));
txtSueldoNeto.setText(formato.format(new DatosPagoBL().getSueldoNeto(codigoE)));
} catch (IOException ex) {
showMessageDialog(this, "No se pudo acceder al archivo", "Error", 0);
}
}
private void btnBuscarEActionPerformed(java.awt.event.ActionEvent evt) {
codigoE = null;
limpiarCajas3();
try {
if(new DatosPagoBL().existenRegistros()) {
FrmBuscarEmpleado buscar = new FrmBuscarEmpleado(this, 2);
buscar.setVisible(true);
} else {
showMessageDialog(this,"No existen datos de pagos de empleados", "Aviso", 2);
principal.setSelectedIndex(1);
activar2(false);
btnNuevoDL.requestFocus();
}
}catch(IOException ex) {}
}
private void btnGuardarDLActionPerformed(java.awt.event.ActionEvent evt) {
int puesto;
float modalidad, afp, essalud, fnp;
if(rbtnJefe.isSelected())
puesto = Puesto.JEFE.getPagoHora();
else
if(rbtnAdmnistrativo.isSelected())
puesto = Puesto.ADMINISTRATIVO.getPagoHora();
else
puesto = Puesto.AUXILIAR.getPagoHora();
if(rbtnContratado.isSelected())
modalidad = Modalidad.CONTRATADO.getBonificacion();
else
modalidad = Modalidad.ESTABLE.getBonificacion();
afp = (chkAfp.isSelected()? Descuento.AFP: Descuento.NINGUNO).getDescuento();
fnp = (chkFnp.isSelected()? Descuento.FNP: Descuento.NINGUNO).getDescuento();
essalud = (chkEsSalud.isSelected()?
Descuento.ESSALUD: Descuento.NINGUNO).getDescuento();
try {
new DatosPagoBL().setDatosPago(txtCodigoE.getText(),
Integer.parseInt(txtHoras.getText()),
Integer.parseInt(txtDependientes.getText()), puesto, modalidad,
afp, essalud, fnp);
} catch(IOException ex) {
showMessageDialog(this, "No se pudo acceder al archivo", "Error", 0);
}
limpiarCajas2();
activar2(false);
}
private void btnNuevoActionPerformed(java.awt.event.ActionEvent evt) {
activar(true);
}
private void btnNuevoDLActionPerformed(java.awt.event.ActionEvent evt) {
activar2(true);
}
private void btnSalirBPActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
private void btnSalirDLActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
private void limpiarCajas() {
txtApellidos.setText(null);
txtNombre.setText(null);
cbxArea.setSelectedIndex(0);
}
private void activar(boolean estado) {
dcbxFecha.setEnabled(estado);
txtApellidos.setEnabled(estado);
txtNombre.setEnabled(estado);
cbxArea.setEnabled(estado);
btnGuardar.setEnabled(estado);
btnNuevo.setEnabled(!estado);
txtApellidos.requestFocus();
}
private void limpiarCajas2() {
txtCodigoE.setText(null);
txtHoras.setText(null);
txtDependientes.setText(null);
rbtnJefe.setSelected(true);
rbtnAdmnistrativo.setSelected(false);
rbtnAuxiliar.setSelected(false);
rbtnEstable.setSelected(true);
rbtnContratado.setSelected(false);
chkAfp.setSelected(false);
chkFnp.setSelected(false);
chkEsSalud.setSelected(false);
}
private void activar2(boolean estado) {
txtHoras.setEnabled(estado);
txtDependientes.setEnabled(estado);
rbtnJefe.setEnabled(estado);
rbtnAdmnistrativo.setEnabled(estado);
rbtnAuxiliar.setEnabled(estado);
rbtnEstable.setEnabled(estado);
rbtnContratado.setEnabled(estado);
chkAfp.setEnabled(estado);
chkEsSalud.setEnabled(estado);
chkFnp.setEnabled(estado);
btnBuscar.setEnabled(estado);
btnGuardarDL.setEnabled(estado);
btnNuevoDL.setEnabled(!estado);
}
private void limpiarCajas3() {
txtCodigoEB.setText(null);
txtDatos.setText(null);
txtHorasNormales.setText(null);
txtHorasExtras.setText(null);
txtBonificaciones.setText(null);
txtDescuentos.setText(null);
txtSueldoBruto.setText(null);
txtSueldoNeto.setText(null);
}
private String generaCodigo(int empleados) {
String codigo="";
int numero = String.valueOf(empleados).length();
for(int i=0; i<(5-numero); i++)
codigo += "0";
codigo += (empleados + 1);
return codigo;
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new FrmDatos().setVisible(true);
}
});
}
// Clase: FrmBuscarEmpleado.java
package capaPresentacion;
import javax.swing.*;
import java.io.*;
import java.util.*;
import static javax.swing.JOptionPane.showMessageDialog;
import capaEntidad.*;
import capaNegocio.*;
import javax.swing.table.DefaultTableModel;
fila[0] = empleado.getCodigo();
fila[1] = empleado.getApellidos() + ", " + empleado.getNombre();
modelo.addRow(fila);
}
tblEmpleados.setModel(modelo);
} catch(IOException ex) {
showMessageDialog(this, "No se pudo acceder al archivo\n" + ex.getMessage(),
"Aviso", 2);
}
}
/** Aqui va el código del método initComponents
*/
private void tblEmpleadosMouseClicked(java.awt.event.MouseEvent evt) {
FrmDatos.codigoE =
String.valueOf(tblEmpleados.getValueAt(tblEmpleados.getSelectedRow(), 0));
this.dispose();
}
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel lblMensaje;
private javax.swing.JTable tblEmpleados;
// End of variables declaration
private DefaultTableModel modelo;
private int modo;
}
b.- Capa de Negocio: es donde residen los programas que reciben las peticiones del usuario y se envían las
respuestas tras el proceso. Se denomina capa de negocio (e incluso de lógica del negocio) porque es aquí donde
se establecen todas las reglas que deben cumplirse. Esta capa se comunica con la capa de presentación, para
recibir las solicitudes y presentar los resultados, y con la capa de datos, para solicitar al gestor de datos para
almacenar o recuperar datos de él. Puede dividirse esta capa en 2 Módulos: Entidades (clases) y Negocios
(funciones o Lógica).
// Clase: Empleado.java
package capaEntidad;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public int tamaño() {
return (codigo.length() + fechaIngreso.length() + apellidos.length() +
nombre.length() + area.length())*2;
}
}
// tipoEnumerado: Puesto.java
package capaEntidad;
// tipoEnumerado: Modalidad.java
package capaEntidad;
// tipoEnumerado: Descuento.java
package capaEntidad;
// Clase: DatosPago.java
package capaEntidad;
}
public float getFnp() {
return fnp;
}
public void setFnp(float fnp) {
this.fnp = fnp;
}
public int tamaño() {
return codigoEmpleado.length()*2 + 28;
}
}
// Clase: EmpleadoBL.java
package capaNegocio;
import java.io.*;
import capaEntidad.*;
import capaDatos.*;
import java.util.ArrayList;
import static javax.swing.JOptionPane.showMessageDialog;
// Clase: DatosPagoBL.java
package capaNegocio;
import java.io.*;
import capaEntidad.*;
import capaDatos.*;
import java.util.ArrayList;
import static javax.swing.JOptionPane.showMessageDialog;
c.- Capa de Datos: es donde residen los datos y es la encargada de acceder a los mismos. Está formada por uno
o más gestores de archivos de datos que realizan todo el almacenamiento de datos, reciben solicitudes de
almacenamiento o recuperación de información desde la capa de negocio.
// Clase: AccesoAleatorio.java
package capaDatos;
import java.io.*;
// Clase: EmpleadoDAL.java
package capaDatos;
import java.io.*;
import java.util.*;
import static javax.swing.JOptionPane.showMessageDialog;
import capaEntidad.*;
flujo.writeUTF(empleado.getApellidos());
flujo.writeUTF(empleado.getNombre());
flujo.writeUTF(empleado.getArea());
mensaje = "ok";
}
} else
mensaje = "Número de registro no válido";
return mensaje;
}
public Empleado getEmpleado(int i) throws IOException {
if(i>=0 && i<=numeroRegistros) {
flujo.seek(i * tamañoRegistro);
String codigo, fechaIngreso, apellidos, nombre, area;
codigo = flujo.readUTF();
fechaIngreso = flujo.readUTF();
apellidos = flujo.readUTF();
nombre = flujo.readUTF();
area = flujo.readUTF();
return new Empleado(codigo, fechaIngreso, apellidos, nombre, area);
} else {
showMessageDialog(null, "Número de registro no válido", "Error", 0);
return null;
}
}
public String añadirEmpleado(Empleado empleado) throws IOException {
String mensaje = "";
mensaje = setEmpleado(numeroRegistros, empleado);
if(mensaje.compareTo("ok") == 0) {
numeroRegistros++;
}
return mensaje;
}
public ArrayList<Empleado> listarEmpleados() throws IOException {
ArrayList<Empleado> empleados = new ArrayList<Empleado>();
for(int i=0; i<getNumeroRegistros(); i++) {
flujo.seek(i * tamañoRegistro);
empleados.add(getEmpleado(i));
}
return empleados;
}
public ArrayList<Empleado> listarEmpleadosParaPago() throws IOException {
ArrayList<Empleado> empleados = new ArrayList<Empleado>();
ArrayList<Empleado> auxiliar = new ArrayList<Empleado>();
empleados = listarEmpleados();
Iterator iterador = empleados.iterator();
while(iterador.hasNext()) {
Empleado empleado = (Empleado)iterador.next();
if(new DatosPagoDAL().buscarPagoEmpleado(empleado.getCodigo(),0) == -1) {
auxiliar.add(empleado);
}
}
return auxiliar;
}
public ArrayList<Empleado> listarDatosEmpleadosParaPago() throws IOException {
ArrayList<Empleado> auxiliar = new ArrayList<Empleado>();
ArrayList<DatosPago> lista = new DatosPagoDAL().listarDatosPagos();
Iterator iterador = lista.iterator();
while(iterador.hasNext()) {
DatosPago datosPago = (DatosPago)iterador.next();
int pos = buscarEmpleado(datosPago.getCodigoEmpleado(), 0);
if(pos != -1) {
Empleado empleado = getEmpleado(pos);
auxiliar.add(empleado);
}
}
return auxiliar;
}
public int buscarEmpleado(String dato, int pos) throws IOException {
String codigo;
if(dato == null)
return -1;
if(pos < 0)
pos = 0;
for(int i=pos; i<getNumeroRegistros(); i++) {
codigo = getEmpleado(i).getCodigo();
if(codigo.indexOf(dato) > -1)
return i;
}
return -1;
}
public String obtenerDatos(String dato) throws IOException {
String datos="";
int pos = buscarEmpleado(dato, 0);
if(pos != -1) {
Empleado empleado = getEmpleado(pos);
datos = empleado.getApellidos() + ", " + empleado.getNombre();
}
return datos;
}
public boolean existenDatos() throws IOException {
if(getNumeroRegistros()==0)
return false;
else
return true;
}
}
// Clase: DatosPagoDAL.java
package capaDatos;
import java.io.*;
import java.util.*;
import static javax.swing.JOptionPane.showMessageDialog;
import capaEntidad.*;
flujo.writeFloat(datosPago.getFnp());
mensaje = "ok";
}
} else
mensaje = "Número de registro no válido";
return mensaje;
}
public DatosPago getDatosPago(int i) throws IOException {
if(i>=0 && i<=numeroRegistros) {
flujo.seek(i * tamañoRegistro);
String codigoEmpleado;
int horasTrabajadas, numeroDependientes, puesto;
float modalidad, afp, essalud, fnp;
codigoEmpleado = flujo.readUTF();
horasTrabajadas = flujo.readInt();
numeroDependientes = flujo.readInt();
puesto = flujo.readInt();
modalidad = flujo.readFloat();
afp = flujo.readFloat();
essalud = flujo.readFloat();
fnp = flujo.readFloat();
return new DatosPago(codigoEmpleado, horasTrabajadas, numeroDependientes,
puesto, modalidad, afp, essalud, fnp);
} else {
showMessageDialog(null, "Número de registro no válido", "Error", 0);
return null;
}
}
public String añadirDatosPago(DatosPago datosPago) throws IOException {
String mensaje = "";
mensaje = setDatosPago(numeroRegistros, datosPago);
if(mensaje.compareTo("ok") == 0) {
numeroRegistros++;
}
return mensaje;
}
public ArrayList<DatosPago> listarDatosPagos() throws IOException {
ArrayList<DatosPago> pagos = new ArrayList<DatosPago>();
for(int i=0; i<getNumeroRegistros(); i++) {
flujo.seek(i * tamañoRegistro);
pagos.add(getDatosPago(i));
}
return pagos;
}
public int buscarPagoEmpleado(String dato, int pos) throws IOException {
String codigo;
if(dato == null)
return -1;
if(pos < 0)
pos = 0;
for(int i=pos; i<getNumeroRegistros(); i++) {
codigo = getDatosPago(i).getCodigoEmpleado();
if(codigo.indexOf(dato) > -1)
return i;
}
return -1;
}
public boolean existenDatos() throws IOException {
if(getNumeroRegistros()==0)
return false;
else
return true;
}
}