TGViewer
Точка входа в программирование Точка входа в программирование @prog_point · 17.9K subscribers
Post #5198 280
Инварианты: какие состояния объекта должны быть невозможны

У дроби не может быть нулевого знаменателя. Можно также договориться о едином представлении: знаменатель положительный, дробь сокращена, а ноль записывается как 0/1.

from math import gcd

def normalize(n, d):
if d == 0:
raise ValueError("zero denominator")
if d < 0:
n, d = -n, -d
g = gcd(n, d)
return n // g, d // g

print(normalize(2, -4)) # (-1, 2)


Для целых n и d функция возвращает согласованное представление. Но если дробь хранится в объекте, его методы тоже должны сохранять эти правила. Проверка только в конструкторе не поможет после изменения состояния.

Материал об инвариантах показывает, как формулировать такие условия. Для проверки внешнего ввода используйте явные исключения: assert может быть отключён запуском Python с -O.
  • ❤ 1
More from @prog_point
  1. Oct 17, 2026Коллизии хеш-таблицы: почему удаление ломает поиск Представьте таблицу из пяти ячеек и уче…
  2. Oct 17, 2026Копия есть, а вложенные объекты всё ещё общие Вы скопировали настройки для теста, поменяли…
  3. Oct 16, 2026Что Big O говорит о скорости, а что скрывает Два вложенных цикла не обязательно выполняют…
  4. Oct 16, 2026Рекурсия: базового случая недостаточно У функции есть условие остановки, но выполнение до…
  5. Oct 15, 2026SQL CASE: превращаем категории товаров в подписи CASE выбирает значение для вывода. В учеб…
  6. Oct 14, 2026Как убрать файл из будущего коммита и сохранить правки После git add изменения попадают в…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →