0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><strong>Guard Expression - подход, который в некоторых случаях помогает снизить уровень вложенности функции и сэкономить ресурсы - сделать так, чтобы программа не выполнялась при пограничных случаях. На примерах разбираем, в чем суть подхода и в каких случаях его можно применять. Стоит отметить, что этот текст предназначен для тех, кто уже умеет создавать функции.</strong></p>
1
<p><strong>Guard Expression - подход, который в некоторых случаях помогает снизить уровень вложенности функции и сэкономить ресурсы - сделать так, чтобы программа не выполнялась при пограничных случаях. На примерах разбираем, в чем суть подхода и в каких случаях его можно применять. Стоит отметить, что этот текст предназначен для тех, кто уже умеет создавать функции.</strong></p>
2
<p>В этой статье мы сосредоточимся на основных моментах, которые характеризуют этот подход: в частности, на возможности отсекать крайние случаи и снижать уровень вложенности.</p>
2
<p>В этой статье мы сосредоточимся на основных моментах, которые характеризуют этот подход: в частности, на возможности отсекать крайние случаи и снижать уровень вложенности.</p>
3
<h2>Содержание</h2>
3
<h2>Содержание</h2>
4
<ul><li><a>Цикломатическая сложность</a></li>
4
<ul><li><a>Цикломатическая сложность</a></li>
5
<li><a>Отсечение пограничных случаев</a></li>
5
<li><a>Отсечение пограничных случаев</a></li>
6
</ul><h2>Цикломатическая сложность</h2>
6
</ul><h2>Цикломатическая сложность</h2>
7
<p>Сложность функций может сильно отличаться: чем больше в ней проверок и условий, тем сложнее стороннему программисту ее читать и понимать. Сложность бывает разных типов: например, необходимая (когда без большого количества независимых условий не обойтись) и случайная (когда она зависит от навыков программиста и нужен рефакторинг).</p>
7
<p>Сложность функций может сильно отличаться: чем больше в ней проверок и условий, тем сложнее стороннему программисту ее читать и понимать. Сложность бывает разных типов: например, необходимая (когда без большого количества независимых условий не обойтись) и случайная (когда она зависит от навыков программиста и нужен рефакторинг).</p>
8
<p>Частично оценить их позволяет цикломатическая сложность - количество линейно независимых маршрутов через программный код. Эта мера была разработана Томасом Дж. Маккейбом в 1976 году. Если исходный код не содержит никаких точек ветвления или циклов, то сложность равна единице, поскольку есть только один маршрут следования через код. Но в ситуации, когда используются условия и циклы, цикломатическая сложность будет выше единицы.</p>
8
<p>Частично оценить их позволяет цикломатическая сложность - количество линейно независимых маршрутов через программный код. Эта мера была разработана Томасом Дж. Маккейбом в 1976 году. Если исходный код не содержит никаких точек ветвления или циклов, то сложность равна единице, поскольку есть только один маршрут следования через код. Но в ситуации, когда используются условия и циклы, цикломатическая сложность будет выше единицы.</p>
9
<p>В этом случае на помощь приходит Guard Expression. Этот подход (или паттерн), помогает лучше структурировать код, сделать его более простым и понятным, иногда снизить цикломатическую сложность. В качестве примера рассмотрим функцию, которая принимает на вход пол и возраст. Для людей старше 18 в зависимости от пола она возвращает строку yes или no. Для всех остальных - null:</p>
9
<p>В этом случае на помощь приходит Guard Expression. Этот подход (или паттерн), помогает лучше структурировать код, сделать его более простым и понятным, иногда снизить цикломатическую сложность. В качестве примера рассмотрим функцию, которая принимает на вход пол и возраст. Для людей старше 18 в зависимости от пола она возвращает строку yes или no. Для всех остальных - null:</p>
10
<p>Эту функцию можно сделать проще, разбив ее и добавив условие "вернуть null, если младше 18 лет". Оно гораздо более простое и очевидное, потому поставим его первым:</p>
10
<p>Эту функцию можно сделать проще, разбив ее и добавив условие "вернуть null, если младше 18 лет". Оно гораздо более простое и очевидное, потому поставим его первым:</p>
11
<p>Уровень вложенности снизился. В такой реализации функции сложнее ошибиться: все, что пишется ниже guard expression (первая проверка в данном случае), попадает под требование "от 18 и старше". В первом примере код для этого условия нужно не забывать вставить внутрь соответствующего условия.</p>
11
<p>Уровень вложенности снизился. В такой реализации функции сложнее ошибиться: все, что пишется ниже guard expression (первая проверка в данном случае), попадает под требование "от 18 и старше". В первом примере код для этого условия нужно не забывать вставить внутрь соответствующего условия.</p>
12
<h2>Отсечение пограничных случаев</h2>
12
<h2>Отсечение пограничных случаев</h2>
13
<p>Вторая задача Guard Expression - сразу же обработать пограничные случаи. Речь идет о дополнительных проверках, которые могут усложнить и удлинить код, но не позволят функции или программе выполняться при определенных условиях.</p>
13
<p>Вторая задача Guard Expression - сразу же обработать пограничные случаи. Речь идет о дополнительных проверках, которые могут усложнить и удлинить код, но не позволят функции или программе выполняться при определенных условиях.</p>
14
<p>Рассмотрим это на примере решения задачи по проверке числа на простоту. Ее условие звучит так: простое число - это натуральное число, которое делится только на 1 и себя. 0 и 1 - не простые числа.</p>
14
<p>Рассмотрим это на примере решения задачи по проверке числа на простоту. Ее условие звучит так: простое число - это натуральное число, которое делится только на 1 и себя. 0 и 1 - не простые числа.</p>
15
<p>0 и 1 - это и есть крайние случаи: в функции нужно написать правило проверки только тех чисел, которые выше единицы. В коде это будет выглядеть так:</p>
15
<p>0 и 1 - это и есть крайние случаи: в функции нужно написать правило проверки только тех чисел, которые выше единицы. В коде это будет выглядеть так:</p>
16
<p>Еще один пример: в проекте<a>Hexlet SICP</a>есть функция, которая отмечает прохождение пользователем упражнения. Она работает только для авторизованных пользователей, которые ранее не выполняли упражнение. Крайние случаи - отсутствие авторизации и прохождение упражнения два и более раз:</p>
16
<p>Еще один пример: в проекте<a>Hexlet SICP</a>есть функция, которая отмечает прохождение пользователем упражнения. Она работает только для авторизованных пользователей, которые ранее не выполняли упражнение. Крайние случаи - отсутствие авторизации и прохождение упражнения два и более раз:</p>
17
17