Цикломатична складність

Цикломати́чна скла́дність — метрика програмного забезпечення, розроблена Томасом Мак Кабе. Використовується для оцінки складності програм. Обчислює кількість лінійно незалежних шляхів в алгоритмі роботи програми на основі її вихідних текстів.

Концепція метрики, але не метод, в дечому схожа на концепцію метрики загальної складності текстів Флеша-Кінкейда.

Цикломатична складність обчислюється на основі графу, що відображає цикл роботи програми. Вершинам графу зіставляють команди програми. Ребро сполучає дві вершини якщо друга команда може бути виконана одразу після першої.

Визначення ред.

 
Граф потоку керування простої програми. Програма починає виконання в червоній вершині, тоді входить в цикл (група з трьох вершин безпосередньо за червоною). По виході з циклу знаходиться умовний оператор (група наступна за циклом), і насамкінець програма завершується в блакитній вершині. Для цього графу E = 9, N = 8 і P = 1, тобто цикломатична складність цієї програми 3.

Цикломатична складність відтинку початкового коду — кількість лінійно незалежних шляхів в сирцевому коді. Наприклад, якщо початковий код не містить місць прийняття рішень таких як IF тверджень або FOR циклів, складність дорівнює 1, через наявність лиш одного шляху в сирцевому коді. якщо код містить один IF, тоді наявні два шляхи в сирцевому коді, один якщо твердження IF оцінюється як TRUE і другий якщо як FALSE.

Математично, цикломатична складність структурної програми[note 1] визначається за допомогою орієнтованого графу утворенного базовими блоками програми, з ребрами між двома базовими блоками якщо керування може бути передане від першого до другого (граф потоку керування програми). Тоді складність визначається як:[1]

M = EN + 2P

де

M = цикломатична складність
E = кількість ребер в графі
N = кількість вершин в графі
P = кількість компонент зв'язності
 
Із тією самою функцією, що й нагорі, показаний як сильно-зв'зний граф потоку керування, для обрахунку через альтернативний спосіб. Для цього графу E = 10, N = 8 і P = 1, тож цикломатична складність залишається 3.

Альтернативний спосіб це використання графу в якому кінцева вершина зв'язана з вхідною. В цьому випадку, кажуть, що граф є сильно зв'язним, і цикломатична складність програми дорівнює цикломатичному числу графу (також відомому як перше число Бетті), яке визначається як:[1]

M = EN + P

На це можна дивитись як на підрахунок числа лінійно незалежних циклів, що існують в графі. Зауважимо, що з'єднання кінцевої і вхідної вершин програми, гарантує наявність щонайменше одного такого циклу.

Для однієї програми (або підпрограми), P завжди дорівнює 1. Однак, цикломатична складність може бути обчислена і для декількох таких програм або підпрограм одночасно (наприклад, для всіх методів класу), в цьому випадку P буде дорівнювати кількості підпрограм в питанні, кожна підпрограма буде з'являтись як незв'язана підмножина графу.

Можна сказати, що цикломатична складність будь-якої структурної програми тільки з однією точкою входу і однією виходу дорівнює кількості місць прийняття рішень (тобто, IF тверджень або умовних циклів), що містяться в цій програмі плюс один.[1][2]

Цикломатичну складність можна обчислювати і для програм з багатьма точками виходу; в цьому випадку вона дорівнює:

π - s + 2

де π це кількість місць прийняття рішень в програмі, а s це кількість точок виходу.[2][3]

Формальне визначення ред.

Формально, цикломатична складність може бути визначена як відносне число Бетті, розмір відноснооднородної[en] групи:

 

це читається як «перший однорідний граф G, відносно термінальної вершини t». Це технічний шлях сказати «кількість лінійно незалежних маршрутів через граф від входу до виходу».

Етимологія ред.

Назва Цикломатична складність призводить до певної плутанини, через те, що ця метрика не тільки підраховує цикли в програмі. Натомість, ця назва пов'язана з кількістю різних циклів в графі потоку керування програми, після додання уявного переходу із кінцевої вершини до вхідної вершини.[1]

На думку Томаса Мак Кабе кращою назвою для повсюдного використання була б умовна складність (англ. Conditional Complexity).[4]

Див. також ред.

Примітки ред.

  1. Тут "структурність" особливо значить "з єдиним виходом у кожній функції".
  1. а б в г McCabe (December 1976). A Complexity Measure ([недоступне посилання з 01.05.2010]). IEEE Transactions on Software Engineering: 308—320.
  2. а б Belzer, Kent, Holzman and Williams (1992). Encyclopedia of Computer Science and Technology. CRC Press. с. 367—368.
  3. Harrison (October 1984). Applying Mccabe's complexity measure to multiple-exit programs. Software: Practice and Experience. J Wiley & Sons.
  4. McCabe (December 1976). A Complexity Measure. IEEE Transactions on Software Engineering: 315.

Посилання ред.