Уменьшайте сложность программного обеспечения при помощи средств проверки Polyspace

Сложность программного обеспечения относится к различным измеримым метрикам программного модуля или исходных файлов, таких как количество линий, количество путей, количество функций или сложность дерева вызова функции. Средства проверки сложности программного обеспечения Polyspace® повышены, когда эти метрики превышают порог. Высокая сложность программного обеспечения может указать, что ваш код затрудняет в чтение, поймите, и отладка. Более эффективно обеспечить допустимый уровень сложности программного обеспечения во время разработки вместо того, чтобы осуществить рефакторинг комплексные проекты позже. Используйте средства проверки сложности программного обеспечения, чтобы обнаружить комплексные модули рано в цикле разработки, чтобы уменьшать позже осуществляющие рефакторинг усилия.

Можно также вычислить абсолютные значения метрик сложности кода для всех файлов и функций. Смотрите Вычисляют Метрики сложности кода.

Сконфигурируйте пороги для средств проверки сложности программного обеспечения

Каждое средство проверки сложности программного обеспечения соответствует метрике сложности. Polyspace повышает средство проверки сложности программного обеспечения, когда соответствующая метрика сложности кода превышает порог.

Пороги по умолчанию этих средств проверки следуют стандарту Сложности кода Hersteller Initiative Software (HIS). Смотрите Метрики сложности кода HIS. Для средств проверки, которые не присутствуют в стандарте HIS, пороги по умолчанию достаточно высоки, что метрики сложности кода вашего кода могут всегда быть ниже порога. Чтобы использовать эти средства проверки эффективно, задайте соответствующий порог для них.

Определите соответствующий набор порогов для этих средств проверки в зависимости от лучшой практики для вашего варианта использования. Например, при анализе новых проектов или недавно разработанного кода, вы можете хотеть уменьшать использование GOTO операторы путем устанавливания порога Number of goto statements exceeds threshold обнулять. При анализе модулей, содержащих устаревшие библиотеки, вы можете хотеть установить порог к более высокому номеру.

В зависимости от вашего Продукта polyspace используйте пользовательский интерфейс или интерфейс командной строки, чтобы задать порог. Например:

Идентифицируйте и уменьшайте сложность программного обеспечения

Идентифицируйте сложность программного обеспечения рабочим анализом Bug Finder

Чтобы идентифицировать сложность программного обеспечения, сконфигурируйте пороги средств проверки. Например, установите пороги средств проверки, перечисленных в этой таблице.

Пороги указывают на допустимый уровень сложности программного обеспечения. Чтобы идентифицировать проблемы в вашем коде, который может привести к более высокому уровню сложности после конфигурирования средств проверки сложности программного обеспечения, запускают анализ 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)));
}
В этом коде ни одно из средств проверки сложности программного обеспечения не повышено, который указывает, что вы уменьшали сложность этого кода к допустимому уровню. Уменьшать сложность программного обеспечения:

  1. Зарегистрируйте код с достаточными комментариями.

  2. Сломайте большую комплексную задачу, выполняемую AppxIndex в меньшие и более простые задачи, которые затем делегированы к отдельным функциям, таким как CalculateU, CalculateV и CalculateMid. Функциональный power теперь называется менее часто. Если вы позже реализуете различную функцию, чтобы вычислить степень и хотеть использовать новую функцию вместо текущей, необходимо сделать меньше замен.

  3. Запишите новые функции, чтобы выполнить одну определенную задачу с как можно меньше перекрытием их функциональностей. В результате эти функции содержат меньше повторения тех же операндов.

Для получения дополнительной информации об обращении к проверке сложности программного обеспечения, см. документацию средства проверки.

В случаях, когда вы будете не мочь осуществить рефакторинг код, обратитесь к проверкам через аннотации кода. Например, если вы пользуетесь комплексной библиотекой, вы можете принять решение аннотировать проверки, которые повышены на библиотеке. Смотрите Аннотируют Код и Скрывают Известные или Приемлемые результаты. Когда вы аннотируете файл или функциональную метрику кода, соответствующее средство проверки сложности программного обеспечения также аннотируется тем же комментарием.

Похожие темы