¡No te olvides de las fundas Edge!

Imagine un escenario en el que desea escribir la siguiente función como parte de un proyecto más grande:

Escribe una función para devolver el tipo de un triángulo basado en el valor de la longitud de 3 lados de un triángulo. Hagámoslo un poco más fácil, asumiendo que la prueba para el tipo de datos de entrada ya está en su lugar, por lo que solo recibe valores numéricos para trabajar.

La situación parece fácil, sigue adelante y escribe la función que se parece a esto:

Algoritmo:  

Input : 3 numeric values
Output : 1 string stating type of triangle
Function : triangleType(side1, side2, side3)
Start :
1. If side1 == side2 == side3
   Then Return “Equilateral Triangle”
2. Else if side1 == side2 or side1 == side3 or side2 == side3
   Then Return “Isosceles Triangle”
3. Else
   Return “Scalar Triangle”
Stop

Después de completar la función, se le dan un par de aserciones para realizar. Y para su sorpresa, encuentra que solo el 50% de los casos pasaron. 

Veamos las declaraciones de prueba. Los que pasan son:
1. Afirmar si (String_toLowerCase(triangle_type(6,7,8))==”triángulo escalar”) = Correcto 
2. Afirmar si (String_toLowerCase(triangle_type(6,6,6))==” triángulo equilátero”) = Correcto 
3. assert(String_toLowerCase(triangle_type(6,7,6))==”triángulo isósceles”) = Correcto 
Bueno, las cosas se ven bien hasta aquí. Pero los que fallan son:
4. Afirmar si (String_toLowerCase(triangle_type(0,0,0))==”no es un triángulo”) = Incorrecto 
5. Afirmar si (String_toLowerCase(triangle_type(-6,-7,-8 ) ))==”no es un triángulo”) = Incorrecto 
6. Comprueba si (String_toLowerCase(triangle_type(5,3,8))==”no es un triángulo”) = Incorrecto 

  • En la cuarta declaración, los valores de entrada son (0,0,0). Ahora sabemos que (0,0,0) forman un punto y no un triángulo. De hecho, si cualquier valor de entrada es cero, el triángulo no es posible. ¡Pero en nuestro caso, devolverá un triángulo equilátero!
  • Además, la quinta declaración nos recuerda que la longitud nunca puede ser un valor negativo. Ves una escala que mide -30 cm de largo. Por lo tanto, si tenemos incluso un valor -ve de longitud, el triángulo no es posible. Pero en nuestro caso dependiendo del valor puede devolver cualquiera de los 3 resultados. Aquí devuelve un escalar.
  • Ahora, ¿qué pasa con la sexta declaración. Todos los valores son >= 0, y seguramente es un triángulo escalar. ¿O es eso? Recuerda la regla de que en un triángulo la suma de 2 lados siempre es mayor que el 3ro.

Aquí vemos para:  

8 + 3 > 5
8 + 5 > 3
5 + 3 > 8

Producción :  

True
True
False

No pasa la prueba de triangularidad. Por lo tanto, las longitudes (3,5,8) no forman un triángulo.

Entonces, lo que necesitamos es una especie de validación de triángulo, que nos diga si lo que tenemos es un triángulo o no. Como parte de la solución, escribe otra función que se parece a:

Algoritmo:  

Input : 3 sides of the triangle 
Output : Boolean value: True if 3 sides form a triangle, false otherwise
Function : triangleValidator(side1, side2, side3)
Start
1. If (side1 <= 0 or side2 <= 0 or side3 <= 0) and
      (side2 + side3 > side1) and
      (side3 + side1 > side1)
   then return True
3. Return False
Stop

Nuestra función anterior ahora incluye 2 líneas adicionales al principio y wola! todas son pruebas están pasando ahora.

Este es solo un escenario de ejemplo simple para recordarnos que cuando escribimos código de nivel de producción, debemos tener cuidado incluso con las cosas simples. Al tener en cuenta los casos extremos simples y verificar con casos de strings uniformes, aumentamos la cobertura de nuestra prueba e hicimos que nuestro programa arrojara resultados matemáticamente más correctos.

A continuación se muestra la implementación del enfoque anterior:  

Python3

# Check if given sides form a triangle or not
def triangleValidator(side1, side2 , side3):
     
    if side1 <= 0 or side2 <= 0 or side3 <= 0:
        return False
         
    elif (side1 + side2 > side3) and\
         (side2 + side3 > side1) and\
         (side3 + side1 > side2):
        return True
    return False
 
# Return the type of triangle
def triangleType(side1, side2, side3):
     
    # If not a triangle, return "Not a triangle"
    if triangleValidator(side1, side2, side3) == False:
        return "Not A Triangle"
         
    # Else perform type checking
    if side1 == side2 == side3:
        return "Equilateral Triangle"
         
    elif (side1 == side2) or\
         (side2 == side3) or\
         (side3 == side1):
        return "Isosceles Triangle"
         
    return "Scalar Triangle"
 
assert (triangleType(6,7,8).lower() == "scalar triangle")
assert (triangleType(6,6,6).lower() == "equilateral triangle")
assert (triangleType(6,7,6).lower() == "isosceles triangle")
assert (triangleType(0,0,0).lower() == "not a triangle")
assert (triangleType(-6,-7,-8).lower() == "not a triangle")
assert (triangleType(5,3,8).lower() == "not a triangle")

Una vez finalizado con éxito, no se devuelve ningún resultado, lo que indica que se han superado todas las pruebas.

Producción : 

No output

Publicación traducida automáticamente

Artículo escrito por Sarah Masud y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *