📜  不要忘记边缘案例!

📅  最后修改于: 2021-05-20 05:57:40             🧑  作者: Mango

想象一下一个场景,您想将以下函数作为某个较大项目的一部分来编写:

W¯¯RITE一个函数返回一个三角形的基于三角形的3个边的长度的值的类型。通过假设已经对输入数据类型进行了测试,让我们更容易一些,因此您仅收到要使用的数字值。

这种情况看起来很容易,您可以继续编写如下所示的函数–

算法 :

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

完成该函数,将给您执行几个断言。令您惊讶的是,您发现只有50%的案件通过了。

让我们看一下测试语句。通过的是:

1.断言(String_toLowerCase(triangle_type(6,7,8))==“标量三角形”)=正确
2.断言(String_toLowerCase(triangle_type(6,6,6))==“等边三角形”)=正确
3. assert(String_toLowerCase(triangle_type(6,7,6))==“等腰三角形”)=正确

好吧,直到现在一切都很好。但是失败的是:

4.断言(String_toLowerCase(triangle_type(0,0,0))==“非三角形”)=不正确
5.断言(String_toLowerCase(triangel_type(-6,-7,-8))==“不是三角形”)=不正确
6.断言(String_toLowerCase(triangle_type(5,3,8))==“非三角形”)=不正确

  • 在第4条语句中,输入值为(0,0,0)。现在我们知道(0,0,0)形成一个点而不是一个三角形。实际上,如果任何输入值为零,则三角形是不可能的。但是在我们的情况下,它将返回等边三角形!
  • 同样,第5条语句提醒我们长度不能为负值。您会看到一个-30厘米长的刻度。因此,如果我们甚至有一个-ve的长度值,三角形是不可能的。但是在我们的例子中,根据值的不同,它可能会返回3个结果中的任何一个。在这里,它返回一个标量。
  • 现在,第六条语句呢?所有值均> = 0,并且肯定是一个标量三角形。还是吗?请记住以下规则:在2个边的三角形总和中,总是大于第3个。

在这里,我们看到:

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

输出 :

True
True
False

它没有通过三角性检验。因此,长度(3,5,8)不会形成三角形。

因此,我们需要一种适当的三角形验证,它可以告诉我们所拥有的甚至不是三角形。作为解决方案的一部分,您编写了另一个函数,如下所示:

算法 :

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

我们以前的函数现在在开头和wola中包括2条额外的行!现在所有的测试都通过了。

这只是一个简单的示例场景,提醒我们在编写生产级代码时,即使是简单的事情也必须要小心。通过牢记简单的边缘情况并使用统一的字符串情况进行检查,我们增加了测试范围,并使程序在数学上返回更正确的结果。

下面是上述方法的实现:

# 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 trinagle
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 "Isoceles 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() == "isoceles 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")

成功完成后,不会返回任何输出,表明所有测试均已通过。

输出 :

No output