Найпоширенішими показниками для вимірювання складності (або простоти, якщо ви вважаєте, що простота є протилежною складності) - це цикломатична складність МакКейба і метрика складності Халстеда .
Цикломатична складність вимірює кількість різних шляхів через дану одиницю, як правило, метод або функцію, хоча вона також може бути обчислена в класі. Зі збільшенням кількості шляхів стає складніше запам’ятовувати потік даних через заданий модуль, що пов’язано з концепцією робочої пам’яті . Висока цикломатична складність, як правило, свідчить про труднощі у можливості тестування модуля - більше тестових випадків потрібно для покриття різних шляхів через систему. Також були проведені дослідження, які пов'язували високу цикломатичну складність з високою частотою дефектів. Зазвичай циклічна складність 10 вказує на те, що одиницю слід переглянути і, можливо, відновити її.
Заходи складності Галстеда використовують входи загальних та окремих операторів та операндів для обчислення обсягу, складності та зусилля фрагмента коду. Складність, яка полягає в (кількість унікальних операторів / 2) * (загальна кількість операндів / кількість унікальних операндів), пов'язана з можливістю читання та розуміння коду для таких завдань, як вивчення системи або проведення перевірки коду. Знову ж таки, ви можете порахувати це на системному рівні, рівні класу або на рівні методу / функції. Існує кілька публікацій про обчислення цих вимірювань тут і тут .
Просто підрахунок рядків коду також може дати вам уявлення про складність. Більше рядків коду означає, що в модулі можна прочитати і зрозуміти більше. Я б вагався використовувати це як окремий вимір. Натомість я б використав це для інших вимірювань, таких як кількість дефектів у заданому модулі, щоб отримати щільність дефектів. Висока щільність дефектів може вказувати на проблеми при написанні тестів та виконанні перевірок коду, які можуть бути, а можуть бути, не викликані складним кодом.
Fan-in і fan-out - це дві інші показники, пов’язані з потоком даних. Як визначено тут , вентилятор - це сума викликів процедур, зчитуються параметри, а глобальні змінні, що читаються та вивіряються - це сума процедур, які викликають певну процедуру, параметри, записані (піддаються стороннім користувачам, передаються посиланням), і глобальні змінні, записані в. Знову ж таки, високий вентилятор і вентилятор можуть бути свідченням модуля, який може бути важко зрозуміти.
У певних парадигмах можуть бути й інші заходи чи показники, які також є корисними. Наприклад, в об'єктно-орієнтованому світі зв'язок моніторингу (низький бажання), згуртованість (високий рівень бажання) та глибина успадкування (низький рівень бажання) можуть бути використані для оцінки того, наскільки проста чи складна система.
Звичайно, важливо усвідомлювати, що багато заходів та метрик - це просто показники. Вам потрібно скористатися своїм судженням, щоб визначити, чи потрібно рефактор для збільшення простоти або чи не варто докладати зусиль. Ви можете проводити вимірювання, обчислювати показники та дізнаватися про свій код, але не хочете проектувати вашу систему за номерами. Зрештою, робіть те, що має сенс.