Está en la página 1de 34

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING.

MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS

CONSTRUCCIN DE UN SISTEMA DE INFORMACIN DESKTOP CASO DE ESTUDIO ATM, DISEO ORIENTADO A OBJETOS CON UML. I. OBJETIVOS
Incorporar el manejo de herencia en el diseo delATM. Incorporar el polimorfismo en el diseo del ATM. Implementar en Java el diseo orientado a objetos basado en UML del software ATM. Estudiar un tutorial detallado cdigo del software ATM que explica los problemas de implementacin.

II.

INTRODUCCIN

En el Laboratorio anterior, se desarroll un diseo orientado a objetos para el sistema ATM. Ahora implementaremos el diseo orientado a objetos en Java. Se mostrar cmo convertir diagramas de clases en cdigo Java. sintonizar el diseo con la herencia y el polimorfismo. A continuacin se presenta una implementacin de cdigo Java del software ATM . El cdigo est comentado cuidadosamente.

III.

DESARROLLO

Empezar a programar las clases del sistema ATM visibilidad Aplicaremos modificadores de acceso a los miembros de las clases. Hemos introducido modificadores de acceso pblico y privado. Los modificadores de acceso determinan la visibilidad o accesibilidad de mtodos y atributos de un objeto a otros objetos. Antes de que podamos comenzar a implementar nuestro diseo, debemos tener en cuenta que los atributos y los mtodos de las clases deben ser pblicas y privadas. Hemos observado que los atributos normalmente deberan ser privados y los mtodos invocado por los clientes de una determinada clase debe ser pblica. El UML emplea marcadores de visibilidad para el modelado de la visibilidad de atributos y operaciones. Visibilidad Pblica se indica colocando un signo ms (+) antes de una operacin o un atributo, mientras que el signo menos (-) indica visibilidad privada. La figura 1 muestra el diagrama de clases con marcadores de visibilidad incluidos.

Lab. Sistemas de Informacin I

Pgina 1

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS

Fig.1 class diagram with visibility markers Navigability Antes de comenzar la implementacin de nuestro diseo en Java, se introduce una notacin UML adicional. El diagrama de clases en la figura. 2 muestra las relaciones entre las clases en el sistema ATM mediante la adicin de las flechas de navegacin para las lneas de asociacin. Flechas Navegabilidad (representadas como flechas con el palillo () puntas de flecha en el diagrama de clases). Al implementar un sistema de diseo usando el UML, utilice las flechas de navegacin para determinar qu objetos necesitan referencias a otros objetos. Por ejemplo, la flecha que seala la navegabilidad desde una clase a otra ATM a Banco-Base de Datos indica que se puede navegar desde la primera a la segunda, permitiendo as que el cajero automtico invoque las operaciones delBankDatabase. Sin embargo, desde la figura. 2 no contiene una flecha que apunta a la navegabilidad BankDatabasea la clase ATM, elBankDatabaseno puede acceder a las operaciones de la ATM. Las asociaciones en un diagrama de clases que tienen flechas de navegacin en ambos extremos o no tengan ninguno indican bidireccionalidad de navegabilidad que puede proceder en cualquier direccin a travs de la asociacin.

Lab. Sistemas de Informacin I

Pgina 2

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS

Fig.2 class diagram with navigability arrows

Implementar el Sistema ATM desde su diseo UML Convertir las clases de los diagramas de la figura. 1 y la figura. 2 en cdigo Java. El cdigo va a representar el "esqueleto" del sistema. Modificaremos el cdigo para incorporar la herencia. En la figura 4 se presenta el total de trabajo de cdigo Java para nuestro modelo. A modo de ejemplo, desarrollamos el cdigo de nuestro diseo de la clase de retiro en la figura. 1. Utilizamos esta clase para determinar los atributos y operaciones de la clase. Utilizamos el modelo de UML en la figura. 2 para determinar las asociaciones entre las clases. Se sigue cuatro directrices siguientes para cada categora:
1. Utilice el nombre que se encuentra en el primer compartimiento para declarar la clase

como una clase pblica,un constructor con argumento vaco. Incluimos este constructor simplemente como un marcador de posicin para recordarnos que la mayora de las clases sern en realidad constructores personalizados. En la figura 4, cuando completemos esta clase, vamos a aadir los argumentos y el cdigo del cuerpo del constructor, segn sea necesario.
1 // Class Withdrawal represents an ATM withdrawal transaction 2 public classWithdrawal 3{ 4 // no-argument constructor 5 public Withdrawal()

Lab. Sistemas de Informacin I

Pgina 3

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
6{ 7 }// end no-argument Withdrawal constructor 8 }// end class Withdrawal Fig. 3 | Java code for class Withdrawal based on Figs. 12.

2. Utilice los atributos ubicados en el segundo compartimiento para declarar las variables de

instancia. Por ejemplo, los atributos privados numero Cuenta y cantidad retirada de la clase producen el cdigo en la figura. 4
1 // Class Withdrawal represents an ATM withdrawal transaction 2 public classWithdrawal 3{ 4 // attributes 5 private intaccountNumber; // account to withdraw funds from 6 private double amount; // amount to withdraw 78
// no-argument constructor 9 public Withdrawal() 10 { 11 }// end no-argument Withdrawal constructor 12 }// end class Withdrawal

Fig. 4 | Java code for class Withdrawal based on Figs. 1.2.

3. Utilice las asociaciones descritas en el diagrama de clases para declarar las referencias a

otros objetos. Por ejemplo, de acuerdo a la figura. 2 La clase de retiro puede acceder a un objeto de la clase pantalla, a un objeto de clase de teclado, a un objeto de la clase CashDispenser y a un objeto de la claseBankDatabase .Tenemos el cdigo en la figura. 5 [Nota:. El constructor de la versin completa de trabajo de esta clase inicializar estas variables de instancia de referencias a objetos reales].
1 // Class Withdrawal represents an ATM withdrawal transaction 2 public classWithdrawal 3{ 4 // attributes 5 private intaccountNumber; // account to withdraw funds from 6 private double amount; // amount to withdraw 78
// references to associated objects 9 private Screen screen; // ATMs screen 10 private Keypad keypad; // ATMs keypad 11 private CashDispensercashDispenser; // ATMs cash dispenser 12 private BankDatabasebankDatabase; // account info database

13 14 // no-argument constructor 15 public Withdrawal() 16 { 17 }// end no-argument Withdrawal constructor 18 }// end class Withdrawal Fig. 5 | Java code for class Withdrawal based on Figs. 12.

Lab. Sistemas de Informacin I

Pgina 4

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
4. Usar las operaciones ubicadas en el tercer compartimiento de la figura. 1 para declarar

los mtodos. Si todava no hemos especificado un tipo de cambio de una operacin, declaramos el mtodo con el tipo de retorno void. Consulte los diagramas de clases de figuras. 12.17 a 12.21 para declarar todos los parmetros necesarios. Por ejemplo, la adicin de la operacin pblica ejecutar de la clase de Retiro, que tiene una lista de parmetros vaco, (cdigo en la figura. 6).
1 // Class Withdrawal represents an ATM withdrawal transaction 2 public classWithdrawal 3{ 4 // attributes 5 private intaccountNumber; // account to withdraw funds from 6 private double amount; // amount to withdraw 78
// references to associated objects 9 private Screen screen; // ATMs screen 10 private Keypad keypad; // ATMs keypad 11 private CashDispensercashDispenser; // ATMs cash dispenser 12 private BankDatabasebankDatabase; // account info database

13 14 // no-argument constructor 15 public Withdrawal() 16 { 17 }// end no-argument Withdrawal constructor 18 19 // operations 20 public void execute() 21 { 22 }// end method execute 23 }// end class Withdrawal Fig. 13.6 | Java code for class Withdrawal based on Figs. 13.113.2.

Incorporacin de Herencia y polimorfismo enel Sistema ATM Ahora revisemos nuestro diseo del sistema ATM para ver cmo puede beneficiarse de la herencia. Aplicar la herencia, lo primero que buscamos en el sistema son elementos comunes entre las clases. Creamos una Jerarqua de clases de herencia a modelo similar (pero no idntico) de una forma ms elegante y de manera eficiente. Luego modificamos nuestro diagrama de clases para incorporar las nuevas relaciones de herencia. Por ltimo, demostrar cmo nuestro diseo actualizado se traduce a cdigo Java.

Para la representacin de una transaccin financieraen el sistema, en lugar de crear una clase para representar a todos los tipos de transacciones, decidimoscrear tres clases de transacciones individuales: BalanceInquiry, Withdrawal (Retiro) y Depsito, para representar las transacciones que el sistema de ATM puede realizar.

Lab. Sistemas de Informacin I

Pgina 5

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
La figura 7 muestra losatributos y operaciones de las clases BalanceInquiry, Retiro y Depsito. Estoslas clases tienen un atributo (numeroCuenta) y una operacin (ejecucin) en comn. Cada clase requiere atributo numeroCuenta para especificar la cuenta en la que la transaccin se aplica. Cada clase contiene operacin de ejecucin, lo que el cajero automtico invoca para realizar latransaccin. Claramente, BalanceInquiry, Retiro y Depsito representan tipos de transacciones. La figura 7 muestra las clases de transacciones, por lo que el uso de la herencia excluye las caractersticas comunes apropiados para el diseo de clases BalanceInquiry, Retiro y Depsito. Ponemos la funcionalidad comn en una superclase, que las clases BalanceInquiry, Retirada y Depsito extienden.

Fig. 7 Attributes and operations of BalanceInquiry, Withdrawal and Deposit.

Generalization El UML especifica una relacin llamada una generalizacin de modelo de herencia.
La Figura 8 es el diagrama de clases que modela la generalizacin de la Transaccin superclase y subclases BalanceInquiry, Retiro y Depsito. Las flechas con puntas triangularhueca indica que las clases BalanceInquiry, Retiro y Depsito extiendende la clase transaccin. La clase Transaccin se dice que es una generalizacin de las clases BalanceInquiry,Retiro y Depsito. Y las clases BalanceInquiry, retiro y depsito son especializaciones de la clase transaccin.

Fig. 8 | Class diagram modeling generalization of superclass Transaction andsubclasses BalanceInquiry, Withdrawal and Deposit

Lab. Sistemas de Informacin I

Pgina 6

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
Recordemos, sin embargo, que las subclases no pueden acceder directamente a los atributos particulares de una superclase. Por lo tanto, se incluye un mtodo pblicogetAccountNumberen la clase de transacciones. Cada subclase heredar este mtodo, Permitiendo a la subclase acceder a su numeroCuenta segn sea necesario para ejecutar una transaccin. De acuerdo a la figura. 7, las clases BalanceInquiry, Retiro y Depsito tambin comparten la operacinejecutar, por lo que se coloca mtodo pblico ejecutar en transacciones superclase. Sin embargo, no tiene sentido aplicar ejecutar en la clase transacciones, ya que la funcionalidad que este mtodo proporciona depende del tipo de la transaccin real. Por lo tanto, se declarar mtodo execute como resumen en transacciones de la superclase. Cualquier clase quecontiene al menos un mtodo abstracto tambin debe ser declarado como abstracto. Esto obliga a cualquier subclasede transaccin que debe haber una clase concreta (es decir, BalanceInquiry, Retiro yDepsito) que implemente mtodo execute. El UML requiere que pongamos nombres de la clase abstracta(y mtodos abstractos) en cursiva, de modo que la transaccin y su mtodo Executeapareceren cursiva, en la figura. 8. Mtodo de Execute no est en cursiva en las subclases BalanceInquiry,Retiro y Depsito. Cada subclase sobreescribeel mtodo execute de la superclase Transaccin con una aplicacin concreta que realiza los pasos adecuados para completarese tipo de transaccin. La Figura incluye la operacin o mtodo de ejecucin en el tercer compartimentode las clases BalanceInquiry, Retiro y Depsito, ya que cada clase tiene una diferente aplicacin concreta del mtodo reemplazado. Procesamiento de Transacciones polimrficamente El polimorfismo proporciona al cajero automtico una forma elegante para ejecutar todas las operaciones "en general." Por ejemplo, supongamos que un usuario decide realizar una consulta de saldo. La ATM establece una referencia de transacciones a un nuevo objeto BalanceInquiry. Cuando el cajero automtico utiliza su Transaccin de referencia para invocar mtodo execute, la versin de BalanceInquiry de ejecucin se llama. Este enfoque de polimorfismo tambin hace que el sistema sea fcilmente extensible. Si deseramos crear un nuevo tipo de transaccin (por ejemplo, la transferencia de fondos o pago de facturas), se crea una subclase de transaccin adicional que reemplaza el mtodo ejecutar con una versin de el mtodo apropiado para la ejecucin de la nueva clase de movimiento. Tendramos que hacerslo cambios mnimos en el cdigo del sistema para permitir a los usuarios elegir el nuevo tipo de transaccinen el men principal y para el cajero automtico crear una instancia y ejecutar los objetos de la nueva subclase. El cajero automtico podra ejecutar transacciones del nuevo tipo utilizando el cdigo actual, porque se ejecutatodas las transacciones polimrfica utilizando una referencia general de transacciones. Recordemos que una clase abstracta como la transaccin es aquel al que nunca se va a instanciar objetos. Una clase abstracta simplemente declara atributos y comportamientos comunes de sus subclases en una jerarqua de herencia. La clase Transaccin define el concepto de lo que significa ser una operacin que tiene un nmero de cuenta y se ejecuta. Conceptualmente, la incluimos porque corresponde a la definicin comportamiento de todas las transacciones de ejecucin. Tcnicamente, hay que incluir en el mtodo execute en la superclaseTransaccin para que el cajero automtico (o cualquier otra clase) puede invocar polimrficamente la versin sustituida de cada subclase de este mtodo a travs de una

Lab. Sistemas de Informacin I

Pgina 7

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
referencia de la operacin. Adems,desde la perspectiva de la ingeniera de software, incluyendo un mtodo abstracto en una superclase obliga al implementador de las subclases anular ese mtodo con implementaciones concretas en las subclases, o bien las subclases, tambin, al ser abstracta, prevencin de los objetos de las subclases que se creen instancias. Atributo adicional de las clases Retiro y Depsito Las subclases BalanceInquiry, Retiro y Depsito heredan el atributo numeroCuenta de la superclase Transaccin, pero las clases Retiro y Depsito contienen el adicional atributo que los distingue de la clase BalanceInquiry. La Clase Retiroy Depsito requiere este atributo adicional para almacenar la cantidad de dinero que el usuariodesea retirar o depositar. La Clase BalanceInquiry no tiene necesidad de tal atributoy slo requiere un nmero de cuenta para la ejecucin.

La Figura 9 presenta un diagrama de clase actualizada de nuestro modelo que incorpora la herenciae introduce la clase Transaccin. Se modela una asociacin entre clases y clase ATMTransaccin para mostrar que el cajero automtico, en un momento dado, o bien se ejecuta una transaccino no es (es decir, existen cero o uno los objetos de tipo de transaccin en el sistema en un momento). Porqueun Retiro es un tipo de transaccin, ya no dibujamos una lnea de asociacin directaATM entre clase y clase de Retiro. La subclase retiro hereda de la superclase la asociacin de la clase Transaccin con la claseATM . Las subclases heredan BalanceInquiry y Depsito. Las asociaciones de las clases del diseo anterior fueron omitidas entre ATM y clases BalanceInquiryy el depsito ya no existe tampoco.

Lab. Sistemas de Informacin I

Pgina 8

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS

Fig. 9 | Class diagram of the ATM system (incorporating inheritance).

Se aade una asociacin entre las clases transacciones y BankDatabase(Fig.9). Todas las transacciones requieren una referencia a la claseBankDatabase para que puedan acceder y modificar la informacin de la cuenta. Debido a que cada subclase de la Transaccin hereda esta referencia,ya no el modelo de asociacin entre la clase de retiro y la clase de BankDatabase. De manera similar, las asociaciones previamente omitidas entre la claseBankDatabase y BalanceInquiry y Depsito ya no existen. Se demuestra una asociacin entre la clase transaccin y la clase pantalla. Todas las transacciones muestran la salida para el usuario a travs de la pantalla. Por lo tanto, no incluimos la asociacin previamentemodelada entre Retiro y la pantalla, a pesar de Retiro sigue participandoen asociacin con el CashDispenser y el teclado. El diagrama de clases la incorporacin de la herencia tambin modela el Depsito y BalanceInquiry. Mostramos asociacionesentre el depsito y el DepositSlot y el teclado. Clase BalanceInquiryparticipa en ninguna asociacin que no sean los heredados de la clase Transaction-aBalanceInquiry necesita interactuar slo con el BankDatabase y con la pantalla. La figura 1 muestra los atributos y operaciones con marcadores de visibilidad. Ahora en la figura 10 se presenta un diagrama de clases modificado que incorpora la herencia. Estediagrama no muestra relaciones de herencia, sino que muestra los atributosy mtodos despus de que hemos empleado herencia en nuestro sistema Observacin de la figura1 ingeniera del software
Lab. Sistemas de Informacin I

Pgina 9

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
Un diagrama de clases completa muestra todas las asociaciones entre las clases y todos los atributosy las operaciones de cada clase. Cuando el nmero de atributos de clase, mtodos y asociaciones es importante (como en las figuras. 9 y 10), una buena prctica que promueve legibilidad es dividir esta informacin entre los dos diagramas de clase-uno centrado enasociaciones y el otro sobre los atributos y mtodos.

Fig. 10 | Class diagram with attributes and operations (incorporating inheritance).

Implementar el Diseo de Sistemas ATM (incorporacin de herencia) Implementar el Diseo de Sistemas ATM (incorporacin de herencia) de la figura2, comenzamos a implementar el diseo del sistema ATM en el cdigo Java. Ahora modificamos nuestra aplicacin para incorporar la herencia, con la clase de retiro como un ejemplo.

Lab. Sistemas de Informacin I

Pgina 10

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
1. Si una clase A es una generalizacin de la clase B, la clase B se extiende a la clase A en la declaracin de clase. Por ejemplo, la superclase abstracto de Transaccines una generalizacin de la clase Retiro. La figura 11 muestra la declaracin de la clase de retiro.
1 // Class Withdrawal represents an ATM withdrawal transaction 2 public classWithdrawal extends Transaction 3{ 4 }// end class Withdrawal

Fig. 11 | Java code for shell of class Withdrawal.


2. Si la clase A es una clase abstracta y la clase B es una subclase de la clase A, la clase B debe implementar los mtodos abstractos de la clase A si la clase B es una clase concreta. Por ejemplo, las clase de transacciones contiene un mtodo abstracto ejecutar, por lo que la clase de retiro debe implementar su mtodo si queremos crear una instancia de un objeto de Retiro. La figura 12 es el cdigo de Java para la clase de retiro por la figura. 9 y la figura. 10.laclase de Retiro hereda el camponumeroCuenta de la superclase Transaccin, as que la clase retiro no tiene que declarar este campo. La clase Retiro hereda tambin referencias a la pantalla y el BankDatabase de su superclase transacciones, por lo que no incluyen estas referencias en nuestro cdigo. La Figura 10 especifica la cantidad de atributos y operacin de ejecucin de la clase de Retiro. La Lnea 6 de la figura. 12 declara un campo para la cantidad de atributos. Lneas 16-19 declaran un procedimiento para ejecutar la operacin. Recordemos que la subclase retiro debe proporcionar una implementacin concreta del mtodo abstracto excuteen la superclasetransacciones. El teclado y las referencias cashDispenser (lneas 7-8) son campos derivados de las asociaciones de la figura. 9.
1 // Withdrawal.java 2 // Generated using the class diagrams in Fig. 13.9 and Fig. 13.10 3 public classWithdrawal extends Transaction 4{ 5 // attributes 6 private double amount; // amount to withdraw 7 private Keypad keypad; // reference to keypad 8 private CashDispensercashDispenser; // reference to cash dispenser 9 10 // no-argument constructor 11 public Withdrawal() 12 { 13 }// end no-argument Withdrawal constructor 14

Fig. 12 | Java code for class Withdrawal based on Figs. 13.9 and 13.10.(Part 1 of 2.)
Lab. Sistemas de Informacin I

Pgina 11

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
15 // method overriding execute 16 @Override 17 public void execute() 18 { 19 }// end method execute 20 }// end class Withdrawal

Fig. 13.12 | Java code for class Withdrawal based on Figs. 13.9 and 13.10.(Part 2 of 2.)

Software Engineering Observacin ,2 Varias herramientas de modelado UML puede convertir diseos basados en UML a cdigo Java, lo que acelera el proceso de implementacin considerablemente. Para obtener ms informacin acerca de estas herramientas, visite nuestro Centro de Recursos UML en www.deitel.com/UML/.

Ejercicios de auto-revisin de la Seccin 3

1. El UML utiliza una flecha para indicar una relacin de generalizacin. a) slida cabeza de flecha llenado b) punta de flecha hueca triangular c) en forma de diamante hueca la flecha de la cabeza d) bastn de punta de flecha 2. Indique si la siguiente afirmacin es verdadera o falsa, y si es falsa, explique por qu: El UML requiere que destacamos los nombres de clase abstractos y nombres de mtodo. 3. Escribir cdigo Java para comenzar a aplicar el diseo para transacciones de clase especificado en las figuras. 9 y 10. Asegrese de incluir los atributos de tipo de referencia privados basados en asociaciones de clase de transacciones. Tambin asegrese de incluir mtodos get pblicos que ofrecen acceso a cualquiera de estos atributos particulares que las subclases requieren para llevar a cabo sus tareas. Caso de Estudio ATM Implementacin Consideramos que las clases en el orden en que se los identific en la Seccin anterior, ATM,Pantalla, teclado, CashDispenser, DepositSlot, cuenta, BankDatabase, Transaccin, BalanceInquiry, Retiro y Depsito. Aplicamos los lineamientos discutidos en las secciones 13,2-13,3 para codificar estas clases basadasen la forma en que ellos modelan en los diagramas de clases UML de las figuras. 9 y 10. Desarrollarlos cuerpos de los mtodos de la clase, que hacen referencia a los diagramas de actividad de la Seccin 12.5 y la comunicaciny los diagramas de secuencia que se presenta en la Seccin 12.7. Nuestro diseo ATM noespecificar toda la lgica del programa y no se puede especificar todos los atributos y operaciones necesariaspara completar la implantacin de la ATM. Esta es una parte normal del proceso de diseo orientado a objetos. A medida que implementamos el sistema, completamos la lgica del programa y agregar atributos y las conductas que sean necesarios para construir el sistema de ATM especificado por los requisitosdocumento en la Seccin 12.2.
Lab. Sistemas de Informacin I

Pgina 12

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS

Llegamos a la conclusin de la discusin presentando una aplicacin Java (ATMCaseStudy) queinicia el ATM y pone las otras clases en uso del sistema. Recordemos que estamos desarrollandouna primera versin del sistema ATM que se ejecuta en un ordenador personal y utiliza el equipo deteclado y el monitor a la aproximacin de teclado y screen. El ATM tambin simulanslo las acciones de dispensador de efectivo de la ATM y la ranura de depsito. Intentamosimplementar el sistema, sin embargo, para que las versiones reales de hardware de estos dispositivos podran serintegrados sin cambios significativos en el cdigo.

ClassATM
Clase ATM (13) representa el cajero automtico en su conjunto. Las Lneas 6-12 aplican atributos de la clase. Determinamos todos menos uno de estos atributos en los diagramas de clases UML de las figuras. 9 y 10. Implementamos el atributo Booleano UMLuserAuthenticated en la figura. 10 como un valor lgico en Java (lnea 6). La lnea 7 declara un atributo que no se encuentra en nuestro diseo UML currentAccountNumber un atributo int que realiza un seguimiento del nmero de cuentadel usuario actual autenticadol. Pronto veremos cmo la clase utiliza este atributo. Las Lneas 8-12 declaran atributos de tipo de referencia correspondientes a las asociaciones de la clase de ATM modelados en el diagrama de clases de la figura. 9. Estos atributos permiten que el cajero automtico puedan acceder a sus partes (es decir, su pantalla, teclado, CashDispenser y DepositSlot) e interactuar con la cuenta bancaria-base de datos de informacin (es decir, un objeto BankDatabase)
1 // ATM.java 2 // Represents an automated teller machine 34
public class ATM 5{ 6 private booleanuserAuthenticated; // whether user is authenticated 7 private intcurrentAccountNumber; // current user's account number 8 private Screen screen; // ATM's screen 9 private Keypad keypad; // ATM's keypad 10 private CashDispensercashDispenser; // ATM's cash dispenser 11 private DepositSlotdepositSlot; // ATM's deposit slot 12 private BankDatabasebankDatabase; // account information database

13 14 // constants corresponding to main menu options 15 private static final intBALANCE_INQUIRY = 1; 16 private static final intWITHDRAWAL = 2; 17 private static final intDEPOSIT = 3; 18 private static final intEXIT = 4; 19 20 // no-argument ATM constructor initializes instance variables 21 public ATM() 22 { 23 userAuthenticated = false; // user is not authenticated to start 24 currentAccountNumber = 0; // no current account number to start 25 screen = new Screen(); // create screen

Fig. 13.13 | Class ATM represents the ATM. (Part 1 of 4.)


26 keypad = new Keypad(); // create keypad 27 cashDispenser = new CashDispenser(); // create cash dispenser 28 depositSlot = new DepositSlot(); // create deposit slot 29 bankDatabase = new BankDatabase(); // create acct info database 30 }// end no-argument ATM constructor 31 32 // start ATM

Lab. Sistemas de Informacin I

Pgina 13

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
33 public void run() 34 { 35 // welcome and authenticate user; perform transactions 36 while ( true) 37 { 38 // loop while user is not yet authenticated 39 while ( !userAuthenticated ) 40 { 41 screen.displayMessageLine("\nWelcome!" ); 42 authenticateUser(); // authenticate user 43 }// end while 44 45 performTransactions(); // user is now authenticated 46 userAuthenticated = false; // reset before next ATM session 47 currentAccountNumber = 0; // reset before next ATM session 48 screen.displayMessageLine("\nThank you! Goodbye!" ); 49 }// end while 50 }// end method run 51 52 // attempts to authenticate user against database 53 private void authenticateUser() 54 { 55 screen.displayMessage("\nPlease enter your account number: " ); 56 intaccountNumber = keypad.getInput(); // input account number 57 screen.displayMessage("\nEnter your PIN: " ); // prompt for PIN 58 intpin = keypad.getInput(); // input PIN 59 60 // set userAuthenticated to boolean value returned by database 61 userAuthenticated = 62 bankDatabase.authenticateUser(accountNumber, pin ); 63 64 // check whether authentication succeeded 65 if ( userAuthenticated ) 66 { 67 currentAccountNumber = accountNumber; // save user's account # 68 }// end if 69 else 70 screen.displayMessageLine( 71 "Invalid account number or PIN. Please try again." ); 72 }// end method authenticateUser 73 74 // display the main menu and perform transactions 75 private void performTransactions() 76 { 77 // local variable to store transaction currently being processed 78 Transaction currentTransaction = null;

Fig. 13 | Class ATM represents the ATM. (Part 2 of 4.)


79 80 booleanuserExited = false; // user has not chosen to exit 81 82 // loop while user has not chosen option to exit system

Lab. Sistemas de Informacin I

Pgina 14

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
83 while ( !userExited ) { 85 // show main menu and get user selection 86 intmainMenuSelection = displayMainMenu(); 87 88 // decide how to proceed based on user's menu selection 89 switch ( mainMenuSelection ) { 91 // user chose to perform one of three transaction types 92 case BALANCE_INQUIRY: 93 case WITHDRAWAL: 94 case DEPOSIT: 95 96 // initialize as new object of chosen type 97 currentTransaction = createTransaction(mainMenuSelection ); 99 100 currentTransaction.execute(); // execute transaction 101 break; 102 case EXIT: // user chose to terminate session 103 screen.displayMessageLine("\nExiting the system..." ); 104 userExited = true; // this ATM session should end 105 break; 106 default: // user did not enter an integer from 1-4 107 screen.displayMessageLine( "\nYou did not enter a valid selection. Try again." ); 109 break; 110 }// end switch 111 }// end while 112 }// end method performTransactions 113 114 // display the main menu and return an input selection 115 private intdisplayMainMenu() 116 { 117 screen.displayMessageLine("\nMain menu:" ); 118 screen.displayMessageLine("1 - View my balance" ); 119 screen.displayMessageLine("2 - Withdraw cash" ); 120 screen.displayMessageLine("3 - Deposit funds" ); 121 screen.displayMessageLine("4 - Exit\n" ); 122 screen.displayMessage("Enter a choice: " ); 123 return keypad.getInput(); // return user's selection 124 }// end method displayMainMenu 125 126 // return object of specified Transaction subclass 127 private Transaction createTransaction(inttype ) 128 { 129 Transaction temp = null; // temporary Transaction variable 130

Fig. 33 | Class ATM represents the ATM. (Part 3 of 4.)


131 // determine which type of Transaction to create 132 switch ( type ) { 134 case BALANCE_INQUIRY: // create new BalanceInquiry transaction 135 temp = new BalanceInquiry(currentAccountNumber, screen, bankDatabase ); 137 break; 138 case WITHDRAWAL: // create new Withdrawal transaction 139 temp = new Withdrawal(currentAccountNumber, screen, bankDatabase, keypad, cashDispenser ); 141 break; 142 case DEPOSIT: // create new Deposit transaction 143 temp = new Deposit(currentAccountNumber, screen, bankDatabase, keypad, depositSlot ); 145 break; 146 }// end switch 147 148 return temp; // return the newly created object

Lab. Sistemas de Informacin I

Pgina 15

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
149 }// end method createTransaction 150 }// end class ATM

Fig. 13 | Class ATM represents the ATM. (Part 4 of 4.)


Las Lneas 15-18 declaran constantes enteras que se corresponden con las cuatro opciones en el men principal del cajero automtico (es decir, consulta de saldo, retiro, depsito y salida).las Lneas 21-30 declaran el constructor, que inicializa los atributos de la clase. Cuando se crea un objeto ATM en primer lugar, el usuario no est autenticado, por lo que la lnea 23 se inicializa userAuthenticated en false. Del mismo modo, la lnea 24 currentAccountNumber inicializa a 0 porque no hay ningn usuario actual todava. Lneas 25-28 instancia nuevos objetos para representar partes del ATM. Recordemos que la clase ATM tiene relaciones con la composicin de las clases de la pantalla, el teclado, CashDispenser y DepositSlot, as la clase ATM es responsable de su creacin. La lnea 29 crea un nuevo BankDatabase. [Nota: Si se tratara de un sistema de ATM real, la clase ATM recibira una referencia a una base de datos existente del objeto creado por el banco. Sin embargo, en esta implementacin slo estamos simulando la base de datos del banco, por lo que la clase ATM crea el objeto BankDatabase con el que interacta.]

ATM mtodo run El diagrama de clases de la figura. 13.10 no enumera las operaciones para las ATM clase. Ahora aplicamos una operacin (es decir, el mtodo pblico) en ATM clase que permite a un cliente externo de la clase (es decir, la clase ATMCaseStudy) para decirle al cajero automtico para correr. ATM mtodo run (lneas 33-50) utiliza un bucle infinito (lneas 36-49) para dar la bienvenida en repetidas ocasiones un usuario intenta autenticar al usuario y, si la autenticacin tiene xito, permitir al usuario realizar transacciones. Despus de un usuario autenticado realiza las transacciones deseadas y decide salir, se restablece la ATM en s, muestra un mensaje de despedida para el usuario y se reinicia el process.We utilizar un bucle infinito aqu para simular el hecho de que un cajero automtico parece funcionar de forma continua hasta que el banco lo apaga (una accin fuera del control del usuario). Un usuario de ATM tiene la opcin de salir del sistema, pero no la posibilidad de desactivar completamente el cajero automtico. Authenticating a User En bucle infinito, el mtodo de ejecucin, lneas 39-43 hacen que el ATM pueda dar la bienvenida en repetidas ocasiones e intentarautenticar al usuario, siempre y cuando el usuario no se ha autenticado (es decir,! usuario autenticado es cierto). Lnea 41 invoca el mtodo displayMessageLine del cajero automtico depantalla para mostrar un mensaje de bienvenida. Como mtodo mostrarMensaje pantalla diseada enel caso de estudio, el mtodo displayMessageLine (declarada en las lneas 13-16 de la fig. 13.14) muestraun mensaje para el usuario, pero este mtodo tambin da salida a una nueva lnea despus del mensaje. Hemos aadido este mtodo durante la ejecucin para dar a los clientes de la clase de pantalla ms controlsobre la colocacin de mensajes mostrados. Lnea 42 invoca la utilidad privada de la clase ATM mtodoauthenticateUser (declarado en las lneas 53-72) para intentar autenticar al usuario. Nos referimos al documento de requisitos para determinar las medidas necesarias para autenticarel usuario antes de permitir que las transacciones que se produzcan. Lnea 55 de mtodo authenticateUserinvoca el mtodo mostrarMensaje de la pantalla para solicitar al usuario que introduzca un numero de cuenta. La Lnea 56 invoca el mtodo getInput del teclado para obtener la entrada del usuario, a continuacin, almacena el valor entero introducido por el usuario en un numeroCuenta variable local. El Mtodo authenticateUser pide al usuario que introduzca un PIN (lnea 57) y almacena el PIN
Lab. Sistemas de Informacin I

Pgina 16

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
de entrada por el usuario en una variable local (lnea 58). A continuacin, lneas 61-62 intenta de autenticarel usuario pasando el numeroCuenta y PIN introducido por el usuario para la bankDatabase demtodo authenticateUser. Clase ATM establece su atributo userAuthenticated a lavalor booleano devuelto por este mtodo-userAuthenticated llega a ser verdad si la autenticacintiene xito (es decir, numeroCuenta y el pin coinciden con los de una cuenta existente en el banco-Base de datos) y se mantiene en caso contrario. Si userAuthenticated es cierto, lnea 67 guarda lacuenta nmero introducido por el usuario (es decir, numeroCuenta) en theATMattribute actual-AccountNumber. Los otros mtodos automticos utilizan esta variable cada vez que una sesin de ATMrequiere el acceso a nmero de cuenta del usuario. Si userAuthenticated es falso, las lneas 70-71utilizan el mtodo displayMessageLine de la pantalla para indicar que un nmero de cuenta no vlido y / o el PIN se ha escrito y que el usuario debe intentar conjunto again.We slo currentAccountNumberdespus de la autenticacin nmero de cuenta del usuario y el PIN, si la base de datos asociadano pudo autenticar al usuario, currentAccountNumber sigue siendo 0. Despus mtodo run intenta autenticar al usuario (lnea 42), si userAuthenticated sigue siendo falsa, el bucle while en las lneas 39 a 43 se ejecuta de nuevo. Si userAuthenticated es ahoraverdadera, el bucle termina y el control contina con la lnea 45, que llama a la utilidad de la clase ATMperformTransactions mtodo.

Realizar transacciones PerformTransactions mtodos (lneas 75-112) lleva a cabo una sesin de ATM de un usuario autenticado. Lnea 78 declara una variable Transaccin local a la que vamos a asignar un objeto BalanceInquiry, retiro o depsito que representa la transaccin de cajero automtico el usuario ha seleccionado. Utilizamos una variable de transacciones para permitir tomar ventaja de polimorfismo. Adems, llamamos esta variable despus del nombre de la funcin incluida en el diagrama de clases de la figura. 12.7-currentTransaction. Lnea 80 declara otra variable local-un booleano llamado userExited que realiza un seguimiento de si el usuario ha optado por salir. Esta variable controla un bucle while (lneas 83-111) que permite al usuario ejecutar un nmero ilimitado de transacciones antes de elegir para salir. Dentro de este bucle, la lnea 86 muestra el men principal y obtiene la seleccin del men del usuario llamando a un mtodo de utilidad displayMainMenu ATM (declarada en las lneas 115 a 124). Este mtodo muestra el men principal mediante la invocacin de los mtodos de la pantalla del cajero automtico y devuelve una seleccin de men obtenida del usuario a travs del teclado del cajero automtico. Lnea 86 tiendas de la seleccin del usuario devuelto por displayMainMenu en mainMenuSelection variable local. Despus de obtener una seleccin del men principal, performTransactions mtodo utiliza una sentencia switch (lneas 89-110) para responder a la seleccin apropiada. Si mainMenuSelection es igual a cualquiera de las tres constantes de enteros que representan los tipos de transacciones (es decir, si el usuario eligi para llevar a cabo una transaccin), lneas 97-98 llamada utilidad mtodo CreateTransaction (declarada en las lneas 127 a 149) para devolver un objeto recin instanciado de del tipo que corresponde a la transaccin seleccionada. CurrentTransaction variable se le asigna la referencia devuelveCreateTransaction, luego la lnea 100 invoca el mtodo ejecutar de esta transaccin para ejecutar it.We 'll discutir mtodo Transaccin ejecutar y los tres subclases transaccin en breve. Le asignamos la variable Transaccin currentTransaction un objeto de una de las tres subclases de transaccin para que podamos ejecutar transacciones polimrfica.

Lab. Sistemas de Informacin I

Pgina 17

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
Por ejemplo, si el usuario decide realizar una consulta de saldo, mainMenuSelection es igual a BALANCE_INQUIRY, lo que lleva CreateTransaction para devolver un objeto BalanceInquiry. Por lo tanto, se refiere a un currentTransactionBalanceInquiry, e invocando currentTransaction. ejecutar () resulta en la versin de BalanceInquiry de execute que llama. Creating a Transaction CreateTransaction Mtodo (lneas 127-149) utiliza una sentencia switch (lneas 132 a 146) para crear una instancia de un nuevo objeto Transaction subclase del tipo indicado por el tipo de parmetro. Recordemos performTransactionsthatmethod pasa mainMenuSelection a este mtodo slo cuando mainMenuSelection contiene un valor correspondiente a uno de los tres tipos de transacciones. Por tipo es BALANCE_INQUIRY, retiro o depsito. Cada caso en la sentencia switch crea una instancia de un nuevo objeto mediante una llamada al constructor de la subclase de transaccin correspondiente. Cada constructor tiene una lista de parmetros nicos, sobre la base de los datos especficos necesarios para inicializar el objeto subclase. Un BalanceInquiry requiere slo la cuenta nmero del usuario y las referencias a la pantalla del ATM y el bankDatabase actual. Adems de estos parmetros, un Retiro se requieren referencias a teclado del cajero automtico y cashDispenser, y un depsito se requieren referencias a teclado y depositSlot del cajero automtico. Se discuten las clases de transacciones en ms detalle en las secciones 13.4.813.4.11. Exiting the Main Menu and Processing Invalid Selections Despus de ejecutar una transaccin (lnea 100 en performTransactions), userExited sigue siendo falsa y las lneas 83-111 se repiten, devuelve al usuario al men principal. Sin embargo, si un usuario no realiza una operacin y en su lugar selecciona la opcin del men principal para salir de la lnea 104 sets userExited en true, haciendo que la condicin del bucle while (!UserExited) para ser falso. Esto es, mientras que la declaracin final de mtodo performTransactions, as el control vuelve al mtodo de llamada de ejecucin. Si el usuario introduce una seleccin del men principal no vlido (es decir, no es un nmero entero de 14), las lneas 107 a 108 muestran un mensaje de error apropiado, el usuario que Sali restos falsos y el usuario vuelve al men principal para volver a intentarlo. Awaiting the Next ATM User Cuando performTransactions devuelve el control al mtodo de ejecucin, el usuario ha optado por salir del sistema, por lo que las lneas 46-47 restablecer los atributos de la ATM AccountNumberuserAuthenticated y actuales para prepararse para el siguiente usuario ATM. Lnea 48 muestra un mensaje de despedida antes de la ATM comienza de nuevo y da la bienvenida al siguiente usuario.

Class Screen
Clase de pantalla (fig. 13.14) representa la pantalla del ATM y encapsula todos los aspectos de muestra la salida en el usuario. Screen Clase aproxima la pantalla de un verdadero cajero automtico con un monitor de computadora y salidas mensajes de texto utilizando el estndar de la consola de salida mtodos System.out.print, System.out.println y System.out.printf. En este estudio de caso, hemos diseado la pantalla de clase para tener una operacin mostrarMensaje. Para una mayor flexibilidad envisualizacin de mensajes a la pantalla, ahora declaramos tres mtodos pantalla mostrarMensaje, displayMessageLine y displayDollarAmount. Mtodo mostrarMensaje (lneas 7-10) toma un argumento String y lo imprime en la consola. El cursor se mantiene en la misma lnea, haciendo de este mtodo apropiado para la visualizacin de instrucciones para el usuario. Mtodo displayMessageLine (lneas 13-16)
Lab. Sistemas de Informacin I

Pgina 18

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
hace lo mismo System.out.println utilizando, lo que genera un salto de lnea para mover el cursor a la siguiente lnea. Por ltimo, displayDollarAmount (lneas 19-22) Mtodo de salida a una cantidad de dinero con el formato correcto (por ejemplo, $ 1,234.56). Lnea 21 System.out.printf utiliza para dar salida a un valor doble formato con comas para aumentar la legibilidad y dos decimales.

ClassKeypad
La clase Teclado (Fig. 15) representa el teclado del cajero automtico y se encarga de recibir todas las entradas de usuario. Recordemos que estamos simulando el hardware, por lo que utilizar el teclado del ordenador para aproximar el teclado. Utilizamos escner de clase para obtener la consola de entrada del usuario. Un teclado de computadora contiene muchas claves que no se encuentran en el teclado del cajero automtico. Sin embargo, se asume que el usuario presiona slo las teclas del teclado de la computadora, que tambin aparecen en el teclado-las llaves numeradas 0-9 y la tecla Intro. La lnea 3 de la clase de teclado importa la clase escner para su uso en La clase teclado . La lnea 7 declara escner de entrada variable como una variable de instancia. La lnea 12 en el constructor crea un nuevo objeto de escner que lee la entrada del flujo de entrada estndar (System.in) y asigna la referencia del objeto con datos variables. Mtodo getInput (lneas 1619) invoca el mtodo escner nextInt (lnea 18) para volver la prxima entrada entero por el usuario Recordemos que nextInt obtiene toda laentrada utilizado por el cajero automtico. Mtodo getInput del teclado simplemente devuelve el entero de entrada por el usuario. Si un cliente de la clase teclado requiere de entrada que satisface algunos criterios (es decir, un nmero correspondientea una opcin de men vlida), el cliente debe llevar a cabo la comprobacin de errores.
1 // Screen.java 2 // Represents the screen of the ATM 34
public class Screen 5{ 6 // display a message without a carriage return 7 public void displayMessage( String message ) { 9 System.out.print( message ); 10 }// end method displayMessage

11 12 // display a message with a carriage return 13 public void displayMessageLine( String message ) { 15 System.out.println( message ); 16 }// end method displayMessageLine 17 18 // displays a dollar amount 19 public void displayDollarAmount(double amount ) { 21 System.out.printf("$%,.2f", amount ); 22 }// end method displayDollarAmount 23 }// end class Screen

Fig. 13.14 | Class Screen represents the screen of the ATM.

13.4.4 Class CashDispenser


Clase CashDispenser (fig. 13.16) representa el dispensador de dinero en efectivo del cajero automtico. Lnea 7 declara INITIAL_COUNT constante, lo que indica el recuento inicial de las facturas en el dispensador de efectivo cuando se inicia el cajero automtico (es decir, 500).
Lab. Sistemas de Informacin I

Pgina 19

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
Lnea 8 implementos recuento de atributo (modelado en. Fig. 13,10), que mantiene un registro del nmero de billetes que quedan en el CashDispenser en cualquier momento. El constructor (lneas 11-14) establece contar hasta el nmero inicial. CashDispenser tiene dos mtodos pblicos-dispenseCash (lneas 17-21) y isSufficientCashAvailable (lneas 24-32). La clase confa en que un cliente (por ejemplo, retirada) llama dispenseCash que no se acredite que se dispone de suficiente dinero en efectivo llamando isSufficientCashAvailable. Por lo tanto, dispenseCash simplemente simula la dispensacin de la cantidad solicitada sin comprobar si se dispone de suficiente dinero en efectivo.
1 // Keypad.java 2 // Represents the keypad of the ATM 3 import java.util.Scanner; // program uses Scanner to obtain user input 45
public class Keypad 6{ 7 private Scanner input; // reads data from the command line

89
// no-argument constructor initializes the Scanner 10 public Keypad() { 12 input = new Scanner( System.in ); 13 }// end no-argument Keypad constructor

14 15 // return an integer value entered by user 16 public intgetInput() { 18 return input.nextInt(); // we assume that user enters an integer 19 }// end method getInput 20 }// end class Keypad

Fig. 13.15 | Class Keypad represents the ATMs keypad.


1 // CashDispenser.java 2 // Represents the cash dispenser of the ATM 3

Fig. 13.16 | Class CashDispenserrepresents the ATMs cash dispenser. (Part 1 of 2.)
4 public classCashDispenser 5{ 6 // the default initial number of bills in the cash dispenser 7 private final static intINITIAL_COUNT = 500; 8 private intcount; // number of $20 bills remaining 9 10 // no-argument CashDispenser constructor initializes count to default 11 public CashDispenser() { 13 count = INITIAL_COUNT; // set count attribute to default 14 }// end CashDispenser constructor 15 16 // simulates dispensing of specified amount of cash 17 public void dispenseCash(intamount ) { 19 intbillsRequired = amount / 20; // number of $20 bills required 20 count -= billsRequired; // update the count of bills 21 }// end method dispenseCash 22 23 // indicates whether cash dispenser can dispense desired amount 24 public booleanisSufficientCashAvailable(intamount ) { 26 intbillsRequired = amount / 20; // number of $20 bills required 27 28 if ( count>= billsRequired ) 29 return true; // enough bills available 30 else 31 return false; // not enough bills available 32 }// end method isSufficientCashAvailable 33 }// end class CashDispenser

Lab. Sistemas de Informacin I

Pgina 20

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
Fig. 13.16 | Class CashDispenserrepresents the ATMs cash dispenser. (Part 2 of 2.)
Mtodo isSufficientCashAvailable (lneas 24-32) tiene una cantidad de parmetros que especifica la cantidad de dinero en efectivo en cuestin. Lnea 26 calcula el nmero de billetes de 20 dlares requerido para dispensar la cantidad especificada. El cajero automtico permite al usuario elegir slo cantidades de abstinencia que son mltiplos de $ 20, as que dividir la cantidad por 20 para obtener el nmero de billsRequired. Lneas 28-31 retorno cierto si el recuento de CashDispenser es mayor que o igual a billsRequired (es decir, suficientes facturas estn disponibles) y falso en caso contrario (es decir, no lo suficiente como facturas). Por ejemplo, si un usuario desea retirar $ 80 (es decir, billsRequired es 4), pero slo tres cuentas permanecen (es decir, el recuento es 3), el mtodo devuelve false. Mtodo dispenseCash (lneas 17-21) simula dispensacin de efectivo. Si nuestro sistema se conect a un verdadero cajero automtico de hardware, este mtodo podra interactuar con el dispositivo para dispensar fsicamente efectivo. Nuestra versin del mtodo simplemente disminuye la cuenta de facturas pendientes por el nmero requerido para dispensar la cantidad especificada (lnea 20). Es la responsabilidad del cliente de la clase (es decir, Retiro) para informar al usuario que el dinero se ha dispensado-CashDispenser no puede interactuar directamente con la pantalla

ClassDepositSlot
Clase DepositSlot (Fig. 17) representa la ranura de depsito del cajero automtico. Al igual que la clase CashDispenser, clase DepositSlot simplemente simula la funcionalidad de una ranura para depsitos hardware real. DepositSlot no tiene atributos y slo onemethodisEnvelopeReceived (lneas 8-11), que indica si se ha recibido un sobre de depsito. Recordemos que en el documento de requerimientos que el ATM le permite al usuario hasta dos minutos para insertar un sobre. La versin actual del mtodo isEnvelopeReceivedsimplyreturns verdad inmediatamente (lnea 10), ya que esto es slo una simulacin de software, y suponemos que el usuario ha introducido un sobre dentro del marco de tiempo requerido. Si una ranura de depsito real de hardware estaban conectados a nuestro sistema, mtodo isEnvelopeReceived podra ser implementada para esperar a un mximo de dos minutos para recibir una seal de la ranura de depsito de hardware que indica que el usuario ha hecho insertado un sobre de depsito. Si isEnvelopeReceived iban a recibir una seal de tal plazo de dos minutos, el mtodo podra devolver true. Si dos minutos transcurridos y el mtodo an no haban recibido una seal, el mtodo podra devolver false. 13.4.6 Class Account La clase Cuenta (Fig. 18) representa una cuenta bancaria. Cada cuenta tiene cuatro atributos (modelado en. Fig. 13.10)-numeroCuenta, pin, availableBalance y totalBalance. Lneas 6-9 implementar estos atributos como campos privados. AvailableBalance variable representa la cantidad de fondos disponibles para el retiro. TotalBalance variable representa la cantidad de fondos disponibles, ms el importe de los fondos depositados pendientes de confirmacin o autorizacin.
1 // DepositSlot.java 2 // Represents the deposit slot of the ATM 34
public class DepositSlot 5{ 6 // indicates whether envelope was received (always returns true, 7 // because this is only a software simulation of a real deposit slot)

Lab. Sistemas de Informacin I

Pgina 21

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
8 public booleanisEnvelopeReceived() { 10 return true; // deposit envelope was received 11 }// end method isEnvelopeReceived 12 }// end class DepositSlot

Fig. 17 | Class DepositSlotrepresents the ATMs deposit slot.


1 // Account.java 2 // Represents a bank account 34
public class Account 5{ 6 private intaccountNumber; // account number 7 private intpin; // PIN for authentication 8 private double availableBalance; // funds available for withdrawal 9 private double totalBalance; // funds available + pending deposits

Fig. 18 | Class Account represents a bank account. (Part 1 of 2.)


10 11 // Account constructor initializes attributes 12 public Account(inttheAccountNumber, intthePIN, double theAvailableBalance, double theTotalBalance ) { 15 accountNumber = theAccountNumber; 16 pin = thePIN; 17 availableBalance = theAvailableBalance; 18 totalBalance = theTotalBalance; 19 }// end Account constructor 20 21 // determines whether a user-specified PIN matches PIN in Account 22 public booleanvalidatePIN(intuserPIN ) { 24 if ( userPIN == pin ) 25 return true; 26 else 27 return false; 28 }// end method validatePIN 29 30 // returns available balance 31 public double getAvailableBalance() { 33 return availableBalance; 34 }// end getAvailableBalance 35 36 // returns the total balance 37 public double getTotalBalance() { 39 return totalBalance; 40 }// end method getTotalBalance 41 42 // credits an amount to the account 43 public void credit(double amount ) { 45 totalBalance += amount; // add to total balance 46 }// end method credit 47 48 // debits an amount from the account 49 public void debit(double amount ) { 51 availableBalance -= amount; // subtract from available balance 52 totalBalance -= amount; // subtract from total balance 53 }// end method debit 54 55 // returns account number 56 public intgetAccountNumber() { 58 return accountNumber; 59 }// end method getAccountNumber 60 }// end class Account

Lab. Sistemas de Informacin I

Pgina 22

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
Fig. 18 | Class Account represents a bank account. (Part 2 of 2.)
La clase de cuenta tiene un constructor (lneas 12-19) que lleva un nmero de cuenta, la PIN establecido para la cuenta, saldo disponible inicial de la cuenta y la cuenta de saldo total inicial como argumentos. Lneas 15-18 asignar estos valores a los atributos de la clase(Es decir, campos). Mtodo validatePIN (lneas 22-28) determina si un PIN especificado por el usuario (es decir, parmetrouserPin) coincide con el PIN asociado a la cuenta (es decir, el pasador de atributo). Recordemos que modelamos userPin parmetro de este mtodo en la figura. 12.19. Si los dos PINcoinciden, el mtodo devuelve true (lnea 25), de lo contrario, devuelve false (lnea 27). Mtodos getAvailableBalance (lneas 31-34) y getTotalBalance (lneas 37-40) devolver los valores de los atributos doble availableBalance y totalBalance, respectivamente. Mtodo de crdito (lneas 43-46) aade una cantidad de dinero (es decir, cantidad de parmetros) a unaCuenta como parte de una transaccin de depsito. Este mtodo agrega la cantidad slo para atribuirtotalBalance (lnea 45). El dinero abonado en cuenta en un depsito noestn disponibles inmediatamente, as modificamos slo el balance.Se suponer que el bancoactualiza el saldo disponible apropiadamente en un momento posterior. La implementacin de la claseCuenta slo incluye mtodos necesarios para llevar a cabo transacciones en cajeros automticos. Por lo tanto, nosomite los mtodos que algn otro sistema de banco invoca a aadir atribuir disponiblesBalance (para confirmar el depsito) o restar totalBalance atributo (de rechazar un depsito). Mtodo de dbito (lneas 49-53) se resta una cantidad de dinero (es decir, la cantidad de parmetros)a partir de una cuenta, como parte de una transaccin de retiro. Este mtodo resta el importetanto availableBalance atributo (lnea 51) y totalBalance atributo (lnea 52), porque una retirada afecta tanto a las medidas de un saldo de cuenta. GetAccountNumber Mtodo (lneas 56-59) proporciona acceso a una cuenta de cuentaNmero. Incluimos este mtodo en nuestra aplicacin, de manera que un cliente de la clase (es decir,BankDatabase) puede identificar una cuenta particular. Por ejemplo, BankDatabase contienemuchos objetos de cuenta, y puede invocar este mtodo en cada uno de sus objetos de cuenta paralocalizar el que tiene un nmero de cuenta especfico.

ClassBankDatabase
Clase BankDatabase (Fig. 19) modela la base de datos del banco con el que interacta el cajero automtico para acceder y modificar la informacin de la cuenta de un usuario. Se estudia el acceso de base de datos en el captulo 28. Por ahora modelamos la base de datos como una matriz. Un ejercicio en el Captulo 28 le pide volver a implementar esta parte de la ATM utilizando una base de datos real.
1 // BankDatabase.java 2 // Represents the bank account information database 34
public class BankDatabase 5{ 6 private Account[] accounts; // array of Accounts

78
// no-argument BankDatabase constructor initializes accounts 9 public BankDatabase() 10 {

Fig. 13.19 | Class BankDatabaserepresents the banks account information database. (Part 1
of 3.)

Lab. Sistemas de Informacin I

Pgina 23

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS

11 accounts = new Account[2 ]; // just 2 accounts for testing 12 accounts[0 ] = new Account( 12345, 54321, 1000.0, 1200.0 ); 13 accounts[1 ] = new Account( 98765, 56789, 200.0, 200.0 ); 14 }// end no-argument BankDatabase constructor 15 16 // retrieve Account object containing specified account number 17 private Account getAccount(intaccountNumber ) { 19 // loop through accounts searching for matching account number 20 for ( AccountcurrentAccount : accounts ) { 22 // return current account if match found 23 if ( currentAccount.getAccountNumber() == accountNumber ) 24 return currentAccount; 25 }// end for 26 27 return null; // if no matching account was found, return null 28 }// end method getAccount 29 30 // determine whether user-specified account number and PIN match 31 // those of an account in the database 32 public booleanauthenticateUser(intuserAccountNumber, intuserPIN ) { 34 // attempt to retrieve the account with the account number 35 Account userAccount = getAccount(userAccountNumber ); 36 37 // if account exists, return result of Account method validatePIN 38 if ( userAccount != null ) 39 return userAccount.validatePIN(userPIN ); 40 else 41 return false; // account number not found, so return false 42 }// end method authenticateUser 43 44 // return available balance of Account with specified account number 45 public double getAvailableBalance(intuserAccountNumber ) { 47 return getAccount(userAccountNumber ).getAvailableBalance(); 48 }// end method getAvailableBalance 49 50 // return total balance of Account with specified account number 51 public double getTotalBalance(intuserAccountNumber ) { 53 return getAccount(userAccountNumber ).getTotalBalance(); 54 }// end method getTotalBalance 55 56 // credit an amount to Account with specified account number 57 public void credit(intuserAccountNumber, double amount ) { 59 getAccount(userAccountNumber ).credit( amount ); 60 }// end method credit 61 62 // debit an amount from Account with specified account number 63 public void debit(intuserAccountNumber, double amount ) { 65 getAccount(userAccountNumber ).debit( amount ); 66 }// end method debit 67 }// end class BankDatabase

Fig. 13.19 | Class BankDatabaserepresents the banks account information database. (Part 3
of 3.)

Determinamos un atributo de tipo de referencia para BankDatabase clase basada en su relacin con la composicin de clase de cuenta. Recuerde que en la fig. 13.9 que un BankDatabase se compone de cero o ms objetos de la Clase de la cuenta. Line 6 implementos atributo representa una matriz de objetos de cuenta para poner en prctica esta
Lab. Sistemas de Informacin I

Pgina 24

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
relacin composicin. Clase BankDatabase tiene un constructor sin argumentos (lneas 9-14), que inicializa las cuentas para contener un conjunto de nuevos objetos de la cuenta. Por el bien de las pruebas del sistema, declaramos cuentas para mantener slo dos elementos de la matriz (lnea 11), que creamos una instancia tan nueva cuenta objetos con datos de prueba (lneas 12 a 13). El constructor cuenta con cuatro parmetros el nmero de cuenta, el PIN asignado a la cuenta, el saldo inicial y el saldo disponible total inicial. Recordemos que BankDatabase clase sirve como intermediario entre ATM clase y los objetos de cuenta reales que contienen informacin de la cuenta de un usuario. Por lo tanto, la mtodos de BankDatabase clase no hacen ms que invocar los mtodos correspondientes del objeto de cuenta que pertenece al usuario actual de ATM.

BankDatabase confa en el ATM para invocar mtodo de authenticateUser y recibir un valor de retorno de la verdadera antes de permitir que al usuario realizar las transacciones. BankDatabase tambin confa en que cada objeto de transacciones creado por el cajero automtico contiene el nmero de cuenta vlida para el usuario autenticado actual y que este es el nmero de cuenta se pasa a los mtodos BankDatabase restantes como argumento userAccountNumber.MethodsgetAvailableBalance (lneas 45-48), getTotalBalance (lneas 5154), crdito (lneas 57-60) y de dbito (lneas 63-66), por lo tanto, simplemente recuperar objetos de cuenta del usuario con utilitymethod getAccount, a continuacin, invocar el mtodo Cuenta apropiada en ese objeto. Sabemos que las llamadas a getAccount de estos mtodos nunca volvern nula, debido Nmero UserAccount deber buscar la getAvailableBalanceAccount.Methods existente y Balance getTotal devolver los valores devueltos por los mtodos de cuenta correspondientes. Adems, el crdito y dbito simplemente redirigen cantidad de parmetros a los mtodos que invocan Cuenta

ClassTransaction
Clase de transaccin (fig20) es una superclase abstracta que representa la nocin de una transaccin de cajero automtico. Contiene las caractersticas comunes de las subclases BalanceInquiry, Retirada y Depsito. Esta clase ampla el cdigo "esqueleto", desarrollado por primera vez en la Seccin 13.3. La lnea 4 declara esta clase sea abstracta. Lneas 6-8 declaran atributos privados de la clase. Recuerde que en el diagrama de clases de la figura. 13.10 que Transaction clase contiene un numeroCuenta atributo (lnea 6) que indica la cuenta involucrada en elTransaccin. Derivamos pantalla de atributos (lnea 7) y bankDatabase (lnea 8) de las asociaciones de transaccin clase modelados en la figura. 13.9-todas las transacciones requieren acceso a la pantalla de la ATM y base de datos del banco.
1 // Transaction.java 2 // Abstract superclass Transaction represents an ATM transaction 34
public abstract class Transaction 5{ 6 private intaccountNumber; // indicates account involved 7 private Screen screen; // ATM's screen 8 private BankDatabasebankDatabase; // account info database

Lab. Sistemas de Informacin I

Pgina 25

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
10 // Transaction constructor invoked by subclasses using super() 11 public Transaction(intuserAccountNumber, Screen atmScreen, 12 BankDatabaseatmBankDatabase ) 13 { 14 accountNumber = userAccountNumber; 15 screen = atmScreen; 16 bankDatabase = atmBankDatabase; 17 }// end Transaction constructor 18 19 // return account number 20 public intgetAccountNumber() 21 { 22 return accountNumber; 23 }// end method getAccountNumber 24 25 // return reference to screen 26 public Screen getScreen() 27 { 28 return screen; 29 }// end method getScreen 30

Fig. 13.20 | Abstract superclass Transaction represents an ATM transaction. (Part 1 of 2.)
La clase Transaccin tiene un constructor (lneas 11-17), que toma como argumentos el nmero y las referencias en la cuenta del usuario actual a la pantalla de la ATM y base de datos del banco. Debido Transaccin es una clase abstracta, este constructor se llama slo por los constructores de las subclases de transaccin. La clase tiene tres mtodos get-getAccountNumber (lneas 20-23), (26-29 lneas) get-Screen pblicas y getBankDatabase (lneas 32-35). Estos son heredados por las subclases de transaccin y se utilizan para acceder a los atributos privados de la clase de transaccin. Transaccin de la Clase tambin declara mtodo abstracto execute (lnea 38). No lo hace tener sentido para proporcionar la aplicacin de este mtodo, debido a una transaccin genrica no puede ser ejecutado. Por lo tanto, declaramos que este mtodo abstracto y forzamos cada subclase de transacciones para proporcionar una aplicacin concreta que se ejecuta ese tipo de transaccin.

ClassBalanceInquiry
Clase BalanceInquiry (Fig. 21) se extiende transaccin y representa una transaccin de cajero automtico de la balanza investigacin. BalanceInquiry no tiene atributos propios, pero hereda Transaccin atributos numeroCuenta, pantalla y bankDatabase, que son accesibles a travs de mtodos get pblicos de transaccin. El constructor BalanceInquiry toma argumentos correspondientes a estos atributos y simplemente reenva al constructor de Transaccincon super (lnea 10).
1 // BalanceInquiry.java 2 // Represents a balance inquiry ATM transaction 34
public class BalanceInquiryextends Transaction 5{ 6 // BalanceInquiry constructor 7 public BalanceInquiry(intuserAccountNumber, Screen atmScreen, 8 BankDatabaseatmBankDatabase ) 9{

Lab. Sistemas de Informacin I

Pgina 26

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
10 super(userAccountNumber, atmScreen, atmBankDatabase ); 11 }// end BalanceInquiry constructor 12 13 // performs the transaction 14 @Override 15 public void execute() 16 {

Fig. 13.21 | Class BalanceInquiryrepresents a balance-inquiry ATM transaction. (Part 1 of 2.)


17 // get references to bank database and screen 18 BankDatabasebankDatabase = getBankDatabase(); 19 Screen screen = getScreen(); 20 21 // get the available balance for the account involved 22 double availableBalance = 23 bankDatabase.getAvailableBalance(getAccountNumber() ); 24 25 // get the total balance for the account involved 26 double totalBalance = 27 bankDatabase.getTotalBalance(getAccountNumber() ); 28 29 // display the balance information on the screen 30 screen.displayMessageLine("\nBalance Information:" ); 31 screen.displayMessage(" - Available balance: " ); 32 screen.displayDollarAmount(availableBalance ); 33 screen.displayMessage("\n - Total balance: " ); 34 screen.displayDollarAmount(totalBalance ); 35 screen.displayMessageLine("" ); 36 }// end method execute 37 }// end class BalanceInquiry

Fig. 13.21 | Class BalanceInquiryrepresents a balance-inquiry ATM transaction. (Part 2 of 2.)


Clase BalanceInquiry anula mtodo abstracto de ejecutar transacciones para proporcionar una implementacin concreta (lneas 14-36) que lleva a cabo los pasos necesarios para una consulta de saldo. Lneas 18-19 conseguir referencias a la base de datos del banco y la pantalla del ATM por mtodos heredados de Transaccin superclase invocacin. Lneas 22-23 recuperar el saldo disponible de la cuenta implicada invocando mtodo getAvailableBalance de banco Base de datos. La lnea 23 utiliza heredado getAccountNumber mtodo para obtener el nmero de cuenta del usuario actual, que luego pasa a getAvailableBalance. Lneas 26-27 recuperar el saldo total de la cuenta del usuario actual. Las lneas 30 a 35 muestran la informacin del balance en la pantalla del cajero automtico. Recordemos que displayDollarAmount lleva una doble argumentacin y la enva a la pantalla con formato de una cantidad de dinero. Por ejemplo, si est disponibleBalance de un usuario es 1000.5, lnea 32 salidas $ 1,000.50. Lnea 35 inserta una lnea en blanco de la produccin para separar la informacin sobre el saldo de la salida posterior (es decir, el men principal repetida por ATM clase despus de la ejecucin de la BalanceInquiry).

ClassWithdrawal
La Clase de retiro (Fig. 22) se extiende transaccin y representa una transaccin de ATM retiro. Esta clase ampla el cdigo "esqueleto" para esta clase desarrollada en la figura. 13.12. Recuerde que en el diagrama de clases de la figura. 13.10 Retiro que clase tiene
Lab. Sistemas de Informacin I

Pgina 27

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
un atributo, cantidad, que la lnea 6 implementos como un campo int. Figura 13.9 modelos asociaciones entre Retiro clase y clases de teclado y CashDispenser, por lo que las lneas 7-8 implementar tipo de referencia atributos teclado y cashDispenser, respectivamente. La lnea 11 declara una constante que corresponde a la opcin de men de cancelacin. Pronto hablaremos de cmo la clase utiliza esta constante.
1 // Withdrawal.java 2 // Represents a withdrawal ATM transaction 34
public class Withdrawal extends Transaction 5{ 6 private intamount; // amount to withdraw 7 private Keypad keypad; // reference to keypad 8 private CashDispensercashDispenser; // reference to cash dispenser

9 10 // constant corresponding to menu option to cancel 11 private final static intCANCELED = 6; 12 13 // Withdrawal constructor 14 public Withdrawal(intuserAccountNumber, Screen atmScreen, 15 BankDatabaseatmBankDatabase, Keypad atmKeypad, 16 CashDispenseratmCashDispenser ) 17 { 18 // initialize superclass variables 19 super(userAccountNumber, atmScreen, atmBankDatabase ); 20 21 // initialize references to keypad and cash dispenser 22 keypad = atmKeypad; 23 cashDispenser = atmCashDispenser; 24 }// end Withdrawal constructor 25 26 // perform transaction 27 @Override 28 public void execute() 29 { 30 booleancashDispensed = false; // cash was not dispensed yet 31 double availableBalance; // amount available for withdrawal 32 33 // get references to bank database and screen 34 BankDatabasebankDatabase = getBankDatabase(); 35 Screen screen = getScreen(); 36 37 // loop until cash is dispensed or the user cancels 38 do 39 { 40 // obtain a chosen withdrawal amount from the user 41 amount = displayMenuOfAmounts(); 42 43 // check whether user chose a withdrawal amount or canceled 44 if ( amount != CANCELED ) 45 { 46 // get available balance of account involved 47 availableBalance = 48 bankDatabase.getAvailableBalance(getAccountNumber() ); 49 50 // check whether the user has enough money in the account

Lab. Sistemas de Informacin I

Pgina 28

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
51 if ( amount<= availableBalance ) 52 {

Fig. 22 | Class Withdrawal represents a withdrawal ATM transaction. (Part 1 of 3.)


53 // check whether the cash dispenser has enough money 54 if ( cashDispenser.isSufficientCashAvailable( amount ) ) 55 { 56 // update the account involved to reflect the withdrawal 57 bankDatabase.debit(getAccountNumber(), amount ); 58 59 cashDispenser.dispenseCash( amount ); // dispense cash 60 cashDispensed = true; // cash was dispensed 61 62 // instruct user to take cash 63 screen.displayMessageLine("\nYour cash has been" + 64 " dispensed. Please take your cash now." ); 65 }// end if 66 else // cash dispenser does not have enough cash 67 screen.displayMessageLine( 68 "\nInsufficient cash available in the ATM." + 69 "\n\nPlease choose a smaller amount." ); 70 }// end if 71 else // not enough money available in user's account 72 { 73 screen.displayMessageLine( 74 "\nInsufficient funds in your account." + 75 "\n\nPlease choose a smaller amount." ); 76 }// end else 77 }// end if 78 else // user chose cancel menu option 79 { 80 screen.displayMessageLine("\nCanceling transaction..." ); 81 return; // return to main menu because user canceled 82 }// end else 83 }while ( !cashDispensed ); 84 85 }// end method execute 86 87 // display a menu of withdrawal amounts and the option to cancel; 88 // return the chosen amount or 0 if the user chooses to cancel 89 private intdisplayMenuOfAmounts() 90 { 91 intuserChoice = 0; // local variable to store return value 92 93 Screen screen = getScreen(); // get screen reference 94 95 // array of amounts to correspond to menu numbers 96 int[] amounts = { 0, 20, 40, 60, 100, 200 }; 97 98 // loop while no valid choice has been made 99 while ( userChoice == 0 ) 100 { 101 // display the withdrawal menu 102 screen.displayMessageLine("\nWithdrawal Menu:" ); 103 screen.displayMessageLine("1 - $20" ); 104 screen.displayMessageLine("2 - $40" ); 105 screen.displayMessageLine("3 - $60" );

Fig. 13.22 | Class Withdrawal represents a withdrawal ATM transaction. (Part 2 of 3.)
106 screen.displayMessageLine("4 - $100" );

Lab. Sistemas de Informacin I

Pgina 29

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
107 screen.displayMessageLine("5 - $200" ); 108 screen.displayMessageLine("6 - Cancel transaction" ); 109 screen.displayMessage("\nChoose a withdrawal amount: " ); 110 111 intinput = keypad.getInput(); // get user input through keypad 112 113 // determine how to proceed based on the input value 114 switch ( input ) 115 { 116 case 1: // if the user chose a withdrawal amount 117 case 2: // (i.e., chose option 1, 2, 3, 4 or 5), return the 118 case 3: // corresponding amount from amounts array 119 case 4: 120 case 5: 121 userChoice = amounts[ input ]; // save user's choice 122 break; 123 caseCANCELED: // the user chose to cancel 124 userChoice = CANCELED; // save user's choice 125 break; 126 default: // the user did not enter a value from 1-6 127 screen.displayMessageLine( 128 "\nInvalid selection. Try again." ); 129 }// end switch 130 }// end while 131 132 return userChoice; // return withdrawal amount or CANCELED 133 }// end method displayMenuOfAmounts 134 }// end class Withdrawal

Fig. 22 | Class Withdrawal represents a withdrawal ATM transaction. (Part 3 of 3.)

Constructor de la clase de Retiro (lneas 14-24) tiene cinco parmetros. Utiliza estupendo para pasar parmetros userAccountNumber, atmScreen y atmBankDatabase al constructor de la superclase transaccin para establecer los atributos que la retirada hereda de Transaction. El constructor tambin tiene referencias atmKeypad y atmCashDispenser como parmetros y los asigna a los atributos de tipo de referencia del teclado y cashDispenser. Anulaciones mtodo de transaccin de retiro Clase ejecutar con una aplicacin concreta (lneas 27-85) que realiza las etapas de una retirada. Lnea 30 declara e inicializa una variable booleana locales cashDispensed, que indica si se ha dispensado en efectivo (es decir, si la transaccin se ha completado con xito) y es inicialmente falsa. Lnea 31 declara availableBalance doble variable local, que almacenar el saldo disponible del usuario durante una transaccin de retiro. Lneas 34-35 conseguir referencias a la base de datos del banco y la pantalla del ATM por mtodos heredados de Transaccin superclase invocacin. Lneas 38-83 contienen un do ... mientras que ejecuta su cuerpo hasta que se dispensa dinero en efectivo (es decir, hasta que se convierte en verdadera cashDispensed) o hasta que el usuario elige para cancelar (en cuyo caso, el bucle termina). Utilizamos este bucle para volver continuamente la usuario al inicio de la transaccin si se produce un error (es decir, la cantidad retirada solicitado es mayor que el saldo disponible del usuario o mayor que la cantidad de dinero en efectivo en el dispensador de efectivo). Lnea 41 pantallas un men de las cantidades de abstinencia y obtiene una seleccin de usuario al llamar al mtodo displayMenuOfAmounts privadas de servicios pblicos (declaradas en las lneas 89133). Este mtodo muestra el men de los importes y devuelve una cantidad retirada int o una constante int CANCELADA para indicar que el usuario ha elegido para cancelar la transaccin.
Lab. Sistemas de Informacin I

Pgina 30

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS

DisplayMenuOfAmounts mtodos (lneas 89-133) declara primera eleccin local de variable de usuario (inicialmente 0) para almacenar el valor que el mtodo devolver (lnea 91). Lnea 93 obtiene una referencia a la pantalla llamando al mtodo GetScreen heredado de Transaccin superclase. Lnea 96 declara una matriz de enteros de abstinencia cantidades que corresponden a las cantidades indicadas en el withdrawalmenu. Nos ignorar el primer elemento de la matriz (ndice 0), ya que el men no tiene otra opcin 0. La declaracin, mientras que en las lneas 99 a 130 repeticiones hasta UserChoice adquiere un valor distinto de 0.we Veremos en breve que esto ocurre cuando el usuario realiza una seleccin vlida en el men. Lneas 102-109 visualizar el men de la retirada en la pantalla y le indica al usuario que introduzca una eleccin. Lnea 111 obtiene entero de entrada a travs del teclado. La sentencia switch en las lneas 114 a 129 determina la forma de proceder sobre la base de la entrada del usuario. Si el usuario selecciona un nmero entre 1 y 5, la lnea 121 establece UserChoice al valor del elemento en cantidades en la entrada de ndice. Por ejemplo, si el usuario introduce 3 a retirar $ 60, la lnea 121 establece UserChoice para el valor de las cantidades [3] (es decir, 60). Lnea 122 termina el interruptor. UserChoice variable ya no es igual a 0, por lo que el tiempo en las lneas 99-130 termina y la lnea 132 vuelve UserChoice. Si el usuario selecciona la opcin de men cancel, lneas 124-125 ejecutar, estableciendo UserChoice de cancelar y haciendo que el mtodo devolver este valor. Si el usuario no introduce una seleccin validmenu, lneas 127 a 128 muestran un mensaje de error y se devuelve al usuario al men de retiro. Lnea 44 en mtodo de ejecucin determina si el usuario ha seleccionado una cantidad retirada o elegido para cancelar. Si el usuario cancela, lneas 80-81 ejecutar y mostrar un mensaje adecuado al usuario antes de devolver el control al mtodo de llamada (es decir, mtodo performTransactions ATM). Si el usuario ha optado por un monto de retiro, lneas 4748 recuperar el saldo disponible de la cuenta del usuario actual y almacenarla en availableBalance variable. A continuacin, la lnea 51 determina si la cantidad seleccionada es menor que o igual a saldo disponible del usuario. Si no lo es, lneas 73-75 muestran un mensaje de error apropiado. Despus, el control contina hasta el final de la DO ... tiempo, y se repite el bucle porque el efectivo dispensado es todava falsa. Si el saldo del usuario es lo suficientemente alta, la sentencia if en la lnea 54 determina si el cajero automtico tiene el dinero suficiente para satisfacer la solicitud de retiro mediante la invocacin de mtodo isSufficientCashAvailable del cashDispenser. Si este mtodo devuelve false, lneas 67 a 69 muestran un mensaje de error apropiado y do ...while repite. Si se dispone de suficiente dinero en efectivo, entonces se cumplen los requisitos para el retiro, y la lnea 57 dbitos cantidad de la cuenta del usuario en la base de datos. Lneas 59-60 luego instruir al dispensador de efectivo para distribuir el dinero para el usuario y establecer cashDispensed en true. Por ltimo, las lneas 63 a 64 muestran un mensaje al usuario que el dinero se ha dispensado. Debido cashDispensed ahora es cierto, el control contina despus del do ...while. No hay declaraciones adicionales aparecen debajo del bucle, por lo que devuelve el mtodo.

ClassDeposit
Clase de Depsitos (Fig. 23) se extiende transaccin y representa una transaccin de depsito. Recuerde que en la fig. 10 clase Depsitotiene una cantidad de atributos, que la lnea 6 implementos como un campo int. Lneas crean 7-8 Referencia atributos teclado y depositSlot que implementan las asociaciones entre el depsito de clase y clases de teclado y DepositSlot modelado de la figura. 13.9. Lnea 9 declara una constante

Lab. Sistemas de Informacin I

Pgina 31

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
CANCELADO que corresponde al valor de un usuario introduce para cancelar. Pronto hablaremos de cmo la clase utiliza esta constante.
1 // Deposit.java 2 // Represents a deposit ATM transaction 34
public class Deposit extends Transaction 5{ 6 private double amount; // amount to deposit 7 private Keypad keypad; // reference to keypad 8 private DepositSlotdepositSlot; // reference to deposit slot 9 private final static intCANCELED = 0; // constant for cancel option

10 11 // Deposit constructor 12 public Deposit(intuserAccountNumber, Screen atmScreen, 13 BankDatabaseatmBankDatabase, Keypad atmKeypad, 14 DepositSlotatmDepositSlot ) 15 { 16 // initialize superclass variables 17 super(userAccountNumber, atmScreen, atmBankDatabase ); 18 19 // initialize references to keypad and deposit slot 20 keypad = atmKeypad; 21 depositSlot = atmDepositSlot; 22 }// end Deposit constructor 23 24 // perform transaction 25 @Override 26 public void execute() 27 { 28 BankDatabasebankDatabase = getBankDatabase(); // get reference 29 Screen screen = getScreen(); // get reference 30 31 amount = promptForDepositAmount(); // get deposit amount from user 32 33 // check whether user entered a deposit amount or canceled 34 if ( amount != CANCELED ) 35 { 36 // request deposit envelope containing specified amount 37 screen.displayMessage( 38 "\nPlease insert a deposit envelope containing "); 39 screen.displayDollarAmount( amount ); 40 screen.displayMessageLine("." ); 41 42 // receive deposit envelope 43 booleanenvelopeReceived = depositSlot.isEnvelopeReceived(); 44 45 // check whether deposit envelope was received 46 if ( envelopeReceived ) 47 { 48 screen.displayMessageLine("\nYour envelope has been " + 49 "received.\nNOTE: The money just deposited will not " + 50 "be available until we verify the amount of any "+ 51 "enclosed cash and your checks clear." ); 52

Fig. 13.23 | Class Deposit represents a deposit ATM transaction. (Part 1 of 2.)
53 // credit account to reflect the deposit 54 bankDatabase.credit(getAccountNumber(), amount ); 55 }// end if

Lab. Sistemas de Informacin I

Pgina 32

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
56 else // deposit envelope not received 57 { 58 screen.displayMessageLine("\nYou did not insert an " + 59 "envelope, so the ATM has canceled your transaction." ); 60 }// end else 61 }// end if 62 else // user canceled instead of entering amount 63 { 64 screen.displayMessageLine("\nCanceling transaction..." ); 65 }// end else 66 }// end method execute 67 68 // prompt user to enter a deposit amount in cents 69 private double promptForDepositAmount() 70 { 71 Screen screen = getScreen(); // get reference to screen 72 73 // display the prompt 74 screen.displayMessage("\nPlease enter a deposit amount in " + 75 "CENTS (or 0 to cancel): " ); 76 intinput = keypad.getInput(); // receive input of deposit amount 77 78 // check whether the user canceled or entered a valid amount 79 if ( input == CANCELED ) 80 returnCANCELED; 81 else 82 { 83 return ( double) input / 100; // return dollar amount 84 }// end else 85 }// end method promptForDepositAmount 86 }// end class Deposit

Fig. 13.23 | Class Deposit represents a deposit ATM transaction. (Part 2 of 2.)
Como la clase Retiro, y clase Depsito contiene un constructor (lneas 12 a 22) que pasa tres parmetros al constructor de la superclase transaccin. El constructor tambin tiene parmetros atmKeypad y atmDepositSlot, que se asigna a los atributos correspondientes (lneas 20-21). Mtodo de ejecucin (lneas 25-66) invalida la versin resumen en transacciones superclase con una aplicacin concreta que lleva a cabo los pasos necesarios en una transaccin de depsito. Lneas 28-29 conseguir referencias a la base de datos y la pantalla. Lnea 31 pide al usuario que ingrese una cantidad de depsito mediante la invocacin de mtodo de utilidad privada promptForDepositAmount (declarada en las lneas 69 a 85) y conjuntos de atributos importe al valor returned.MethodpromptForDepositAmount pide al usuario que introduzca una cantidad de depsito como un nmero entero de cntimos (porque el teclado del cajero automtico no contiene un punto decimal, lo que es consistente con muchos verdaderaATMs) y devuelve el valor Double que representa la cantidad de dinero a depositar. Lnea 71 en el mtodo promptForDepositAmount obtiene una referencia a la pantalla del cajero automtico. Las lneas 74 a 75 muestran un mensaje que pide al usuario que introduzca una cantidad de depsito como un nmero de centavos o "0" para cancelar la operacin. Lnea 76 recibe la entrada del usuario desde el teclado. Lneas 79-84 determinar si el usuario ha introducido una cantidad de depsito real o elegido para cancelar. En este ltimo caso, la lnea 80 devuelve la constante CANCELADO. De lo contrario, la lnea 83 devuelve el importe del depsito despus de la conversin de la cantidad
Lab. Sistemas de Informacin I

Pgina 33

UNIVERSIDAD NACIONAL DE SAN CRISTOBAL DE HUAMANGAFACULTAD DE ING. MINAS, GELOGIA Y CIVILESCUELA DE FORMACIN PROFESIONAL DE INGENIERA DE SISTEMAS
de centavos, a una cantidad de dinero por la entrada de lanzamiento a un doble y luego dividiendo por 100. Por ejemplo, si el usuario introduce 125 como el nmero de centavos de dlar, lnea 83 devuelve 125,0 dividido por 100, o 1,25 a 125 centavos es $ 1,25. Lneas 34-65 en el mtodo ejecutar determinar si el usuario ha optado por cancelar la transaccin en lugar de introducir una cantidad de depsito. Si el usuario cancela, la lnea 64 muestra el mensaje correspondiente y devuelve el mtodo. Si el usuario introduce una cantidad de depsito, lneas 37-40 indique al usuario que inserte un sobre de depsito con la cantidad correcta. Recordemos que el mtodo de pantalla displayDollarAmount emite un doble formato de una cantidad de dinero. Lnea 43 establece una variable booleana local para el valor devuelto por el mtodo isEnvelopeReceived de depositSlot, indica si el sobre de depsito ha sido recibido. Recordemos que codificamos mtodo isEnvelopeReceived (lneas 8-11 de la figura 13.17.) Para volver siempre es cierto, ya que estamos simulando la funcionalidad de la ranura de depsito y asumir que el usuario siempre inserta un sobre. Sin embargo, mtodo de cdigo de ejecucin de cdigo de clase para prueba de la posibilidad de que el usuario no introduce un sobre-buena ingeniera de software exige que cuenta los programas de todos los posibles valores de retorno. Por lo tanto, la clase de depsito se prepara para futuras versiones de isEnvelopeReceived que podra devolver false. Lneas 48 54 ejecutar si la ranura de depsito recibe un sobre. Las lneas 48-51 muestran un mensaje apropiado para el usuario. Lnea 54 a continuacin, acredita la cantidad de depsito de la cuenta del usuario en la base de datos. Las lneas 58 a 59 se ejecutarn si la ranura de depsito no recibe un sobre de depsito. En este caso, se muestra un mensaje al usuario indicando que la ATM ha cancelado la operacin. El mtodo a continuacin, devuelve sin modificar la cuenta del usuario. Class ATMCaseStudy Estudio de caso ATM Clase (Fig. 13.24) es una clase simple que nos permita iniciar, o "encender", el cajero automtico y probar la implementacin de nuestro modelo de sistema ATM. Principal mtodo de clase ATMCaseStudy (lneas 7-11) no hace ms que crear una instancia de un nuevo objeto llamado ATM theATM (lnea 9) y la invocacin de su mtodo run (lnea 10) para iniciar la ATM.

Wrap-Up
En este captulo, se utiliz la herencia para afinar el diseo del sistema de software de ATM, y que ha implementado plenamente la ATM en Java. Felicidades por completar toda la ATM 1 // ATMCaseStudy.java 2 // Driver program for the ATM case study 34
public class ATMCaseStudy 5{ 6 // main method creates and runs the ATM 7 public static void main( String[] args ) 8{ 9 ATM theATM = new ATM(); 10 theATM.run(); 11 }// end main 12 }// end class ATMCaseStudy

Fig. 13.24 | ATMCaseStudy.java starts the ATM.

Lab. Sistemas de Informacin I

Pgina 34

También podría gustarte