Language scope exceeds threshold

Область видимости функции языка больше заданного порога

Описание

Осциллограф языка представляет стоимость поддержания или обновления функции. Например, если операнд много раз происходит в функции, то изменять название операнда является дорогостоящим. Осциллограф языка такой функции был бы высок. Этот дефект повышен, когда область видимости функции языка превышает заданный порог. Для получения дополнительной информации о том, как Polyspace вычисляет осциллограф языка, смотрите Language Scope.

Примечание

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

Polyspace использует порог по умолчанию 400, если вы не задаете порог. Чтобы задать файл выбора, где можно установить порог, используйте Set checkers by file (-checkers-selection-file). Также смотрите Сложность Reduce Software при помощи Средств проверки Polyspace.

Когда вы импортируете комментарии из предыдущих исследований при помощи polyspace-comments-import, Polyspace копирует любую информацию об анализе о метрике кода Language Scope в предыдущем результате к этому средству проверки в текущем результате. Если текущий результат содержит ту же метрику кода, информация об анализе копируется в метрику кода также.

Риск

Нарушение этого средства проверки может указать что:

  • Изменение в операнде может потребовать, чтобы многие изменились в функции.

  • Функциональная сила выполнить несколько задач целиком.

  • Функциональная сила имеет высокую степень взаимозависимости с другими функциями.

Эти факторы делают модуль трудным обеспечить и отладить.

Фиксация

Чтобы зафиксировать эту проверку, или осуществить рефакторинг ваш код или изменяют порог средства проверки. При рефакторинге кода спроектируйте функции в коде так, чтобы:

  • Каждая функция выполняет одну определенную задачу.

  • Функции имеют минимальные побочные эффекты на других функциях.

Лучшая практика состоит в том, чтобы проверять сложность модуля рано в разработке, чтобы избежать дорогостоящего рефакторинга постразработки.

Примеры

развернуть все

 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))));
 }

В этом примере, В этой функции, операнд power много раз повторяется. Любое изменение в power требует, чтобы тщательное изучение функции убедилось, что неожиданные поведения не введены. Осциллограф языка функционального AppxIndex is700, который является выше осциллографа языка по умолчанию 400. Polyspace отмечает функцию как несовместимую

Коррекция — осуществляет рефакторинг код

Одна возможная коррекция должна осуществить рефакторинг код так, чтобы операнды много раз не повторялись. В этом примере, функциональном AppxIndex пересмотрен так, чтобы несвязанные задачи были выполнены независимыми функциями. Эти функции совместимы.

// This code calculates effective index of materials  as decribed 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)));
}

Проверяйте информацию

Группа: сложность программного обеспечения
Язык: C | C++
Акроним: SC18
Порог по умолчанию: 400
Введенный в R2021a