Un tipo abstracto de dato es una cuenta bancaria que contiene operaciones
public String numero(); public String titular(); public void ingresar(double monto ) throws CuentaBancariaMontoIncorrecto; public void extraer(double monto) throws CuentaBancariaSaldoExcedido,CuentaBancariaMontoIncorrecto; public double saldoActual() ;
public interface CuentaBancaria { .... }See the complete code for CuentaBancaria here.
Las excepciones son las siguientes:
Cuando el monto a ingresar o extraer es menor que 0
public CuentaBancariaMontoIncorrecto() { super(); } public CuentaBancariaMontoIncorrecto(String msg) { super(msg); }
public class CuentaBancariaMontoIncorrecto extends RuntimeException { .... }See the complete code for CuentaBancariaMontoIncorrecto here.
Cuando se quiere retirar dinero que supera al saldo actual
public CuentaBancariaSaldoExcedido() { super(); } public CuentaBancariaSaldoExcedido(String msg) { super(msg); }
public class CuentaBancariaSaldoExcedido extends RuntimeException { .... }See the complete code for CuentaBancariaSaldoExcedido here.
Dada una interfase denominada CuentaBancaria, se puede construir una clase que aplique la administracion de dicha cuenta. El administrador consiste en recibir como parametro una cuenta bancaria y aplicar ciertos algoritmos sobre ella. Por ejemplo, el generar un reporte de la cuenta bancaria:
public void reporte(CuentaBancaria cta) { System.out.println("Numero Cuenta " + cta.numero()); System.out.println("Nombre Titular " + cta.titular()); System.out.println("Saldo " + cta.saldoActual()); }
public class CuentaBancariaAdministrador { .... }See the complete code for CuentaBancariaAdministrador here.
Para implantar el tipo abstracto de dato, se puede construir una clase que la aterrice.
private String _numero,_titular; private double _saldo; public CuentaBancariaImpl(String n,String t) { _numero = n; _titular = t; } public void setSaldo(double s) { _saldo = s;} public String numero(){ return _numero; } public String titular(){ return _titular; } public void ingresar(double monto ) throws CuentaBancariaMontoIncorrecto{ DesignByContract.require(monto >0, new CuentaBancariaMontoIncorrecto("Monto Incorrecto, negativo o cero")); _saldo += monto; } public void extraer(double monto) throws CuentaBancariaSaldoExcedido,CuentaBancariaMontoIncorrecto{ DesignByContract.require(monto >0, new CuentaBancariaMontoIncorrecto("Monto Incorrecto, negativo o cero")); DesignByContract.require((_saldo-monto)>=0, new CuentaBancariaSaldoExcedido("El monto a extraer excede el saldo")); _saldo -= monto; DesignByContract.ensure(_saldo>=0, new CuentaBancariaSaldoExcedido("El saldo es negativo")); } public double saldoActual() { return _saldo; }
public class CuentaBancariaImpl implements CuentaBancaria { .... }See the complete code for CuentaBancariaImpl here.
Para verificar el funcionamiento del codigo, se puede utilizar el siguiente codigo
public static void main(String [] args) { CuentaBancariaImpl cta = new CuentaBancariaImpl("1023454", "Gustavo De la Cruz"); cta.setSaldo(2000); try { cta.ingresar(1000); cta.extraer(-3500); cta.extraer(3500); } catch (CuentaBancariaMontoIncorrecto pre) { pre.printStackTrace(); } catch (CuentaBancariaSaldoExcedido pre) { pre.printStackTrace(); } }
public class CuentaBancariaTest { .... }See the complete code for CuentaBancariaTest here.
El diagrama UML de esta ejemplo es: Diagrama Clases