Источник: https://t.me/ntuzov/552
Высокая цикломатическая сложность — это проблема. Guard Expression — одно из её решений, которое хорошо работает в большинстве ситуаций.
Давайте начнём с осознания проблемы. Представим вот такой утрированный пример:
Что здесь не так? Ну то есть, умными словами, без ”…” и “спагетти-код”. А проблема в том, что у этой функции высокая цикломатическая сложность. Чтобы понять что это значит, приведу определение этого термина:
Цикломатическая сложность – это количество возможных путей выполнения кода. Проще говоря, чем больше условий и ветвлений в коде, тем она выше и тем сложнее понять, как именно работает код.
Окей, проблему осознали, но как её решать? А вот тут как раз и приходит на помощь Guard Expression. Суть простая — мы выносим все проверки в начало функции и сразу возвращаем результат, если что-то не так. Смотрите, как преобразится наш код:
Стало намного проще, не так ли? Мы сразу чётко разделяем - вот проверки, вот бизнес-логика. Код читается сверху вниз, плоско, как книга.
К слову, на мой взгляд, else
вообще полезен только в редких случаях. Нет, я не отношусь к радикалам, которые вообще его отрицают, но в большинстве случаев без него действительно лучше, и это тесно связано с темой поста. Задумайтесь 🤓
UPD: в комментариях подсказывают, что многие знакомы с этим подходом под другим названием — early return.
В Go это особенно актуально, так как обработка ошибок у нас явная, и такой подход делает её более понятной.
И бонусом держите линтер gocyclo
, которой проверяет цикломатическую сложность и ругается, если она слишком высокая (да, он есть в golangci-lint
).
📂 Best Practices | Последнее изменение: 02.12.2024 13:19