Ver Mensaje Individual
  #49 (permalink)  
Antiguo 11/05/2017, 23:09
CalgaryCorpus
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Implementar TablaHash

No te dije que capturaras excepciones, te dije que las arrojaras, sugiero que leas bien las sugerencias. Arrojar y capturar no es lo mismo. Incluso te puse un pseudo codigo antes:

Busca esto antes, para que veas lo que sugiero.

Código C:
Ver original
  1. void asegurar(final boolean condicion) {
  2.    if(condicion == false) {
  3.        <mostrar mensaje de error> o bien
  4.        <arrojar una exception>
  5.    }
  6. }

Como abusas de escribir, mejor olvida que dije que mostraras un mensaje de error. Arroja una excepcion, mejor.
En este momento tus tests no estan probando nada parece. No hay chequeos. Eso esta mal.

No tienes que poner try y catch, tienes que:
- chequear algo, 1 cosa por test y
- si esa condicion no se cumple, entonces se arrojara una excepcion,

si no la capturas, el programa testeador se caera' y solo -sin ayuda - escribira el stacktrace de la ejecucion y se terminara en ese momento.

Necesitas mas? No creo, porque si tienes 1 test malo o 10 malos, los vas resolviendo de a 1.

No le pongas "check" a tu funcion chequeadora, porque claramente en tus versiones anteriores no eras consistente con lo que querias probar. Si se elimina algo, por ejemplo, y yo vuelvo a buscar eso que busque', que esperarias que ocurriera? No me respondas, escribe eso que esperas como la condicion a chequear en la funcion "asegurar" que mostre mas arriba. La puedes renombrar a algo como "comprobar_que", para que el codigo sea facil de leer, si te parece.

Imagina este codigo, inventado por mi, para demostrar el punto.

Código:
inserto(clave, valor, hash)
comprobar_que( hash.get(clave) == valor )
borro(clave, hash )
comprobar_que( hash.get(clave) == null )
estas lineas pueden ser 2 tests, escrito en pseudo pseudo codigo.

Código:
test1: compruebo que lo que inserto, esta en el hash
{
  crear hash
  inserto(clave, valor, hash)
  comprobar_que( hash.get(clave) == valor )
}
Código:
test2: compruebo que despues de borrar, el elemento ya no esta
{
  crear hash
  inserto(clave, valor, hash)
  borro(clave, hash )
  comprobar_que( hash.get(clave) == null )
}
La sintaxis es inventada, solo para demostrar lo que se supone tienes que hacer.

Nota que las primera lineas del test2 es igual que el test1, pero en el test2 no comprobe si la clave estaba en el hash, por que? porque de eso se trataba el test1, no necesito probarlo en el test2.

Ahora, el test1 puede ser uno de varios. Para comprobar que lo que insertas esta, hay que hacer muchas pruebas, no solo 1, pero todas tienen que ser sencillas y suponer o tratar de suponer que las otras pruebas pasan. Es ahi, donde entra a jugar esto de que las claves sean impares, primos, etc. solo para stressar a tu estructura de datos.

Si tuvieras una funcion que inserta los valores de un arreglo al hash, podrias construir tests asi:

crear hash
insertar a hash el contenido del arreglo de primos
recorrer los elementos y comprobar que cada uno de los elementos que provienen del recorrido estan presentes en el arreglo (o al reves, pero para probar el recorrido, mejor usar el recorrido para iterar)

otro test
crear hash
insertar a hash el contenido del arreglo de pares
recorrer los elementos y comprobar que cada uno de los elementos que provienen del recorrido estan presentes en el arreglo .

otro test
crear hash
insertar a hash el contenido del arreglo de impares
recorrer los elementos y comprobar que cada uno de los elementos que provienen del recorrido estan presentes en el arreglo .

otro test
crear hash
insertar a hash el contenido del arreglo de numeros decrecientes
recorrer los elementos y comprobar que cada uno de los elementos que provienen del recorrido estan presentes en el arreglo

bueno y dado que esto parece ser el mismo test, por que no hacer 1 solo test de esto y llamarlo varias veces?

Código:
  probar_insercion( arreglo ){
     crear hash
     // insertar
     para cada elemento del arreglo( a -> hash.insert(a, "valor:" + a) )
     // comprobar
     para cada elemento del hash( k, v -> comprobar_que( k esta en el arreglo ) )
  }
y luego

Código:
probar_insercion( primos )
probar_insercion( pares )
probar_insercion( crecientes )
etc.
Ultima cosa, no pongas ningun mensaje ni hagas ninguna celebracion en el codigo cuando los tests pasan, solo genera una excepcion si un test falla.

Te habia mencionado que no escribas nada? Bueno, ahora te digo que no realices accion alguna si el test pasa exitosamente, nada. nada. nada. Si quieres, al final de toda la ejecucion, dices "Se acabo", "ejecucion terminada" o algo parecido. Todo el resto funciona o arroja una excepcion.
__________________
Visita mi perfil en LinkedIn