Не забывайте крайние случаи!

Опубликовано: 13 Июля, 2021

Представьте себе сценарий, в котором вы хотите написать следующую функцию как часть более крупного проекта:

Вт обряд функции , чтобы вернуть тип треугольника на основе значения длины 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 (треугольник_тип (6,7,8)) == «скалярный треугольник») = правильно
2. Утвердите, если (String_toLowerCase (треугольник_тип (6,6,6)) == "равносторонний треугольник") = Правильно
3. assert (String_toLowerCase (треугольник_тип (6,7,6)) == «равнобедренный треугольник») = правильно

Ну, до сих пор дела обстоят хорошо. Но вот те, которые терпят неудачу:

4. Утвердите, если (String_toLowerCase (треугольник_тип (0,0,0)) == "не треугольник") = Неверно
5. Утвердите, если (String_toLowerCase (triangel_type (-6, -7, -8)) == "не треугольник") = Неверно
6. Утвердите, если (String_toLowerCase (треугольник_тип (5,3,8)) == "не треугольник") = Неверно

  • В 4-м операторе входные значения (0,0,0). Теперь мы знаем, что (0,0,0) образуют точку, а не треугольник. Фактически, если любое входное значение равно нулю, треугольник невозможен. Но в нашем случае он вернет равносторонний треугольник!
  • Кроме того, пятое утверждение напоминает нам, что длина никогда не может быть отрицательной величиной. Вы видите шкалу длиной -30 см. Таким образом, если у нас есть хотя бы одно -ve значение длины, треугольник невозможен. Но в нашем случае, в зависимости от значения, он может вернуть любой из трех результатов. Здесь он возвращает скаляр.
  • А теперь насчет 6-го утверждения. Все значения> = 0, и это, безусловно, скалярный треугольник. Либо это? Помните правило, что в треугольнике сумма двух сторон всегда больше третьей.

Здесь мы видим:

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

Выход :

Правда
Правда
Ложь

Он не проходит проверку на треугольность. Следовательно, длины (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! все тесты сейчас проходят.

Это простой примерный сценарий, напоминающий нам, что при написании кода производственного уровня мы должны быть осторожны даже с простыми вещами. Помня о простых крайних случаях и проверяя с помощью одинаковых строк, мы увеличили охват тестированием и заставили нашу программу возвращать более математически правильные результаты.

Ниже представлена реализация вышеуказанного подхода:




# 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" )

После успешного завершения никаких выходных данных не возвращается, что означает, что все тесты пройдены.

Выход :

Нет вывода