HTML Diff
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>