Сложность программного обеспечения относится к различным измеримым метрикам программного модуля или исходных файлов, таких как количество линий, количество путей, количество функций или сложность дерева вызова функции. Средства проверки сложности программного обеспечения Polyspace® повышены, когда эти метрики превышают порог. Высокая сложность программного обеспечения может указать, что ваш код затрудняет в чтение, поймите, и отладка. Более эффективно обеспечить допустимый уровень сложности программного обеспечения во время разработки вместо того, чтобы осуществить рефакторинг комплексные проекты позже. Используйте средства проверки сложности программного обеспечения, чтобы обнаружить комплексные модули рано в цикле разработки, чтобы уменьшать позже осуществляющие рефакторинг усилия.
Можно также вычислить абсолютные значения метрик сложности кода для всех файлов и функций. Смотрите Вычисляют Метрики сложности кода.
Каждое средство проверки сложности программного обеспечения соответствует метрике сложности. Polyspace повышает средство проверки сложности программного обеспечения, когда соответствующая метрика сложности кода превышает порог.
Пороги по умолчанию этих средств проверки следуют стандарту Сложности кода Hersteller Initiative Software (HIS). Смотрите Метрики сложности кода HIS. Для средств проверки, которые не присутствуют в стандарте HIS, пороги по умолчанию достаточно высоки, что метрики сложности кода вашего кода могут всегда быть ниже порога. Чтобы использовать эти средства проверки эффективно, задайте соответствующий порог для них.
Определите соответствующий набор порогов для этих средств проверки в зависимости от лучшой практики для вашего варианта использования. Например, при анализе новых проектов или недавно разработанного кода, вы можете хотеть уменьшать использование GOTO
операторы путем устанавливания порога Number of goto statements exceeds threshold
обнулять. При анализе модулей, содержащих устаревшие библиотеки, вы можете хотеть установить порог к более высокому номеру.
В зависимости от вашего Продукта polyspace используйте пользовательский интерфейс или интерфейс командной строки, чтобы задать порог. Например:
В десктопных решениях Polyspace или Серверных продуктах, в окне выбора Средств проверки, перешли к Guidelines> Software Complexity и задают порог. В командной строке используйте опцию анализа Check Guidelines (-guidelines)
. Смотрите проверку на кодирование стандартных нарушений.
В Polyspace как Вы Расширение кода запустите окно выбора Средств проверки и задайте пороги в Guidelines> узел Software Complexity.
В Eclipse™, открытом окно выбора Средств проверки из окна Configure Project. Смотрите Конфигурируют Средства проверки для Polyspace, когда Вы Кодируете в Eclipse (Polyspace Bug Finder Access).
В Visual Studio, открытой окно выбора Средств проверки от Polyspace> вершина Project Окна настроек. Смотрите Конфигурируют Средства проверки для Polyspace, когда Вы Кодируете в Visual Studio (Polyspace Bug Finder Access).
В Коде Visual Studio откройте окно выбора Средств проверки из палитры команды. Смотрите Конфигурируют Средства проверки для Polyspace, когда Вы Кодируете в Коде Visual Studio (Polyspace Bug Finder Access).
В командной строке откройте окно выбора Средств проверки путем выполнения команды polyspace-checkers-selection
. Смотрите конфигурируют средства проверки для Polyspace, когда вы кодируете в командной строке (Polyspace Bug Finder Access).
Чтобы идентифицировать сложность программного обеспечения, сконфигурируйте пороги средств проверки. Например, установите пороги средств проверки, перечисленных в этой таблице.
Средство проверки | 'Порог' |
---|---|
Comment density below threshold | 20 |
Call tree complexity exceeds threshold | 10 |
Number of call occurrences exceeds threshold | 10 |
Language scope exceeds threshold | 400 |
Пороги указывают на допустимый уровень сложности программного обеспечения. Чтобы идентифицировать проблемы в вашем коде, который может привести к более высокому уровню сложности после конфигурирования средств проверки сложности программного обеспечения, запускают анализ Polyspace Bug Finder. Рассмотрите этот код:
long long power(double x, int n){ long long BN = 1; for(int i = 0; i<n;++i){ BN*=x; } return BN; } double AppxIndex(double m, double f){//Noncompliant double U = (power(m,2) - 1)/(power(m,2)+2); double V = (power(m,4) + 27*power(m,2)+38)/(2*power(m,2)+3); return (1+2*f*power(U,2)*(1+power(m,2)*U*V+ power(m,3) /power(m,3)*(U-V)))/( (1-2*f*power(U,2)*(1+power(m,2)*U*V + power(m,3)/power(m,3)*(U-V)))); }
AppxIndex
кажется комплексным. Не очевидно, как вы можете уменьшать сложность. Средства проверки сложности программного обеспечения помогают вам идентифицировать источники сложности.После анализа Bug Finder повышены сконфигурированные средства проверки:
Comment density below threshold
: Функции в коде не содержат пояснительных текстов.
Call tree complexity exceeds threshold
и Number of call occurrences exceeds threshold
: Существует слишком много вызовов функции по сравнению с количеством функциональных определений. Эти проверки указывают, что можно группировать некоторые выражения в отдельные функции.
Language scope exceeds threshold
: Тот же операнд несколько раз повторяется. Можно уменьшать часть повторения. Например, функциональный power
несколько раз вызывается теми же аргументами.
Эти проверки указывают что функциональный AppxIndex
может сделать код трудным считать, изучить, и отладить. Чтобы уменьшать сложность кода, обратитесь к повышенным проверкам.
Уменьшайте сложность своего кода путем решения идентифицированных проблем. В этом случае первопричина повышенных проверок состоит в том что функциональный AppxIndex
выполняет несколько задач вместо того, чтобы выполнить одну одну задачу. Например, функция сначала вычисляет U
, затем это вычисляет V
, и наконец это выполняет долгое выражение, содержащее оба U
и V
. Чтобы решить эти проблемы, осуществите рефакторинг функциональный AppxIndex
так, чтобы каждая задача была делегирована к отдельной функции. Вы можете сломать долгое выражение в меньшие части. Например:
// This code calculates effective index of materials as described in // the formula in 10.1364... // power(x,n) returns the nth power of x (x^n) // n is an integer // x is a double // return type is long long long long power(double x, int n){//Compliant long long BN = 1; for(int i = 0; i<n;++i){ BN*=x; } return BN; } // CalculateU(m) calculates the first intermediate variable // required to calculate polarization // m is the relative refractive index // return type is double; double CalculateU(double m){//Compliant return (power(m,2) - 1)/(power(m,2)+2); } // CalculateV(m) calculates the second intermediate variable // required to calculate polarization // m is the relative refractive index // return type is double; double CalculateV(double m){//Compliant return (power(m,4) + 27*power(m,2)+38)/(2*power(m,2)+3); } // CalculateMid(m,f) calculates the large term present // in both numerator and denominator // of the effective index calculation // m is the relative refractive index // f is the fillfactor // return type is double; double CalculateMid(double m, double f){//Compliant double U = CalculateU(m); double V = CalculateU(m); return 2*f*power(U,2)*(1+power(m,2)*U*V + power(m,3)/power(m,3)*(U-V)); } //AppxIndex(m,f) calculates the approximate effective index // m is the relative refractive index // f is the fillfactor //return type is double double AppxIndex(double m, double f){//Compliant return (1+CalculateMid(m,f))/( (1-CalculateMid(m,f))); }
Зарегистрируйте код с достаточными комментариями.
Сломайте большую комплексную задачу, выполняемую AppxIndex
в меньшие и более простые задачи, которые затем делегированы к отдельным функциям, таким как CalculateU
, CalculateV
и CalculateMid
. Функциональный power
теперь называется менее часто. Если вы позже реализуете различную функцию, чтобы вычислить степень и хотеть использовать новую функцию вместо текущей, необходимо сделать меньше замен.
Запишите новые функции, чтобы выполнить одну определенную задачу с как можно меньше перекрытием их функциональностей. В результате эти функции содержат меньше повторения тех же операндов.
Для получения дополнительной информации об обращении к проверке сложности программного обеспечения, см. документацию средства проверки.
В случаях, когда вы будете не мочь осуществить рефакторинг код, обратитесь к проверкам через аннотации кода. Например, если вы пользуетесь комплексной библиотекой, вы можете принять решение аннотировать проверки, которые повышены на библиотеке. Смотрите Аннотируют Код и Скрывают Известные или Приемлемые результаты. Когда вы аннотируете файл или функциональную метрику кода, соответствующее средство проверки сложности программного обеспечения также аннотируется тем же комментарием.