| |
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
|