MIT OpenCourseWare


6.170 Curso práctico en ingeniería del software.

Página principal
¿Qué es OCW?
Ayuda
Feedback
Preguntas frecuentes
Glosario
 
 
Página principal del curso
Programa
Calendario
Material de clase
Trabajos
Exámenes
  Lecturas obligatorias
  Otras fuentes
  Prácticas
  Grupos/Clases de repaso
  Herramientas
  Proyectos

   MIT

   
 

Trabajos

Ejercicio 6: Foliotracker, 2ª parte

Plazo de entrega: 7ª semana

Hoja E6

Le aconsejamos que todos los problemas antes de empezar a trabajar.

Introducción

En el Ejercicio 5, usted decidió cuál sería la funcionalidad básica de su Foliotracker, diseñó una interfaz gráfica de usuario (GUI) para el programa y especificó una interfaz para la programación de aplicaciones (API), a través de la cual la GUI accede a los componentes del código que obtienen las cotizaciones de las acciones y que mantienen una base de datos con los valores y demás. Sin embargo, a pesar de haber especificado la interfaz y la funcionalidad, no se trató mucho el tema del diseño o implementación del backend.

El ejercicio 6 se centra en el diseño del backend y su implementación. No será necesario aprender nada nuevo, pero tendrá la oportunidad de refinar sus habilidades en el diseño de tipos de datos abstractos, modelos de objeto, etc. No tiene que implementar el código para obtener las cotizaciones de las acciones; le facilitamos una clase con un método simple que toma un símbolo de transacción como una cadena y devuelve una cotización.
Hemos puesto a su disposición un módulo QuoteServer para su comodidad. Si le interesa, puede consultar el código fuente del QuoteServer, pero lo ideal es que fuese capaz de hacer uso de él utilizando sólo la especificación. No será necesario que realice pasos adicionales para utilizar este módulo (debería aparecer automáticamente en su path de clases).

Ejercicio 6

Su tarea en este ejercicio consiste en completar su Foliotracker mediante la implementación de la API que definió en el ejercicio 5. Será necesario que diseñe la estructura interna del backend de su Foliotracker y que haga un ensayo general de todo el programa. Resulta difícil testear este programa porque hay una GUI implicada y porque las variables cotizaciones de las acciones dificultan la ejecución de tests repetidos. Por lo cual tendrá que proyectar una estrategia de testing aceptable, que de algún modo le asegure que la aplicación tiene un funcionamiento seguro y que las cotizaciones de las acciones, las posiciones y las valoraciones de las carteras son de confianza. Es probable que quiera aprovechar la interfaz programática que diseñó en el ejercicio 5 y testear la GUI por separado de manera ad hoc.


Debería entregar las siguientes herramientas:


(a) Un código del modelo de objeto. [Una página] Un modelo de objeto que resuma el estado interno de la aplicación. Debería incluir tanto los objetos primarios de la GUI, como los objetos que usted ha utilizado en la implementación de la API.

(b) Diagrama de dependencia de módulos. [Una página] Un diagrama de dependencia de módulos de toda la aplicación. Añada una nota breve si quiere explicar algo acerca de técnicas especiales o abstracciones que elaboró para el desacoplamiento u otros propósitos.

(c) Código. El código para la implementación del backend de su API y cualquier otro código de testeo que usted haya escrito. Debería incluir especificaciones en los módulos de su implementación cuando fuese pertinente (es decir, para métodos públicos y para cualquier método privado que sea poco conocido).

(d) Testeo. [Una página o menos] Una visión de conjunto, sucinta pero convincente, de su estrategia de testeo, qué tipos de testing empleó y qué casos de prueba ejecutó.


Erratas

Comprobación del formato del valor por el QuoteServer
El código del QuoteServer intentó comprobar erróneamente el formato del valor devuelto. Sin embargo, esto causaba problemas si las comas formaban parte del formato del número devuelto (por ejemplo NASDAQ => "2,494.00"). Hemos quitado el código de verificación y hemos corregido la especificación de getLastValue() para que pueda permitir comas.

Preguntas & respuestas

Esta sección enumerará las aclaraciones y respuestas a preguntas frecuentes. Intentaremos mantenerla lo más actualizada posible, por lo que le sugerimos que consulte este apartado en primer lugar (después de haber repasado detenidamente la hoja) ante cualquier duda que le surja.

P: ¿Cómo podemos obtener el nombre de la empresa si tenemos un símbolo de transacción?

R: Reuben Sterling sugirió una buena solución para esto. ¡Gracias, Reuben!

Información: getNameFromTicker2() es el método que en estos momentos se comunica con el sitio web. getNameFromTicker() es el método que debería ser invocado, ya que lleva un registro de los símbolos de transacción que han sido consultados con anterioridad, por lo que potencialmente se ejecuta más deprisa.

Añada al QuoteServer.
:
protected static final String _NAME_LOOKUP_URL = "http://quote.fool.com/lookup.asp?
company="; protected static final String _TOKEN3 = "currticker="; protected static final String _TOKEN4 = "&symbols="; protected static final String _TOKEN5 = "mw_symbollookup_standard"; protected static HashMap names = new HashMap(); public static String getNameFromTicker(String tickerSymbol) throws WebsiteDataException,
NoSuchTickerException { String name = (String)QuoteServer.names.get(tickerSymbol); if (name == null) { name = QuoteServer.getNameFromTicker2(tickerSymbol); QuoteServer.names.put(tickerSymbol, name); } return name; } private static String getNameFromTicker2(String tickerSymbol) throws WebsiteDataException,
NoSuchTickerException { tickerSymbol = tickerSymbol.toUpperCase(); String strURLStart = _NAME_LOOKUP_URL; URL urlWebPage = null; InputStreamReader isr = null; BufferedReader brWebPage = null; String nameLookupToken = _TOKEN3+tickerSymbol+_TOKEN4+tickerSymbol; String strStockName; // abra la página web para leer try { urlWebPage = new URL(strURLStart + tickerSymbol); isr = new InputStreamReader(urlWebPage.openStream()); brWebPage = new BufferedReader(isr); } catch(Exception e) { throw new WebsiteDataException(); } // encuentre la línea que tiene la cotización de la acción String strLine = null; try { while(true) { strLine = brWebPage.readLine(); if(strLine == null) { throw new WebsiteDataException("Parse failed!"); } if(strLine.indexOf(nameLookupToken) != -1) break; } } catch(IOException e) { throw new WebsiteDataException(); } // encuentre la cotización de la acción en la línea StringTokenizer strtok = new StringTokenizer(strLine, _DELIMITER); while(true) { if(strtok.hasMoreTokens() == false) { throw new NoSuchTickerException(); } if(strtok.nextToken().compareTo(_TOKEN5) == 0) { strStockName = strtok.nextToken(); if (strStockName.substring(0, 5).compareTo("nbsp;") == 0) break; } } strStockName = strStockName.substring(5); return strStockName; }
Volver arriba

Información Jurídica | Privacidad
Todo uso del sitio de MIT OpenCourseWare y sus materiales de curso queda sujeto a las condiciones y términos de uso detallados
en la sección sobre Información Jurídica
Contacta con nosotros: Usuarios | Empresas-Instituciones-Medios comunicación
Código Ético | Aviso Legal | Política de confidencialidad | Quiénes somos: Sala de Prensa