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