メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

言語スコープ

関数の保守または変更にかかるコスト

説明

このメトリクスは関数の保守または変更にかかるコストを測定します。次のように算出します。

(N1 + N2)/(n1 + n2)
ここで、

  • N1 は演算子の発生数。

    識別子 (変数名または関数名) とリテラル定数を除く他のすべては演算子としてカウントされます。

  • N2 はオペランドの発生数。

  • n1 は個別の演算子の数。

  • n2 は個別のオペランドの数。

    このメトリクスでは、接尾辞のあるリテラル定数を接尾辞のない定数とは異なると見なします。たとえば、0 と 0U は異なると見なされます。

Polyspace® はこのメトリクスをレポートする際に、計算された言語スコープを小数第 1 位に丸めます。このメトリクスの目的は関数の保守性を示すことであるため、ローカル クラス内に定義されている関数の言語スコープは計算されません。

ヒント

N1 + N2 を求めるには、トークンの合計数をカウントします。n1 + n2 を求めるには、一意のトークンの数をカウントします。

このメトリクスの推奨上限は 4 です。関数の保守コストを抑えるには、このメトリクスの上限を適用するようにしてください。たとえば、同じオペランドが何度も使用されている場合、オペランド名を変更するには、何度も置換しなければなりません。

メトリクスに制限を適用するには、Polyspace を使用したコード複雑度メトリクスの計算を参照してください。

すべて展開する

int g(int);
int f(int i)
{
    if (i == 1)
        return i;
    else
        return i * g(i-1);
}

この例では以下のようになります。

  • N1 = 19.

  • N2 = 9.

  • n1 = 12.

    個別の演算子は int(){if==returnelse*-;} です。

  • n2 = 4.

    個別のオペランドは fi1 および g

f の言語スコープは (19 + 9) / (12 + 4) = 1.8 です。

namespace std {
  int func2() {
    return 123;
  }
};

namespace my_namespace {
  using namespace std;

  int func1(int a, int b) {
    return func2();
  }
};

この例では、名前空間 std は暗黙的に func2 と関連付けられています。言語スコープ計算では、func2()std::func2() として扱います。同様に、この計算では func1()my_namespace::func1() として扱います。

たとえば、func1 の言語スコープ値は 1.3 です。この計算を細分化するには、以下のようにします。

  • N1 + N2 = 20.

  • n1 + n2 = 15.

    個別の演算子は int::(、コンマ、){return;、および } です。

    個別のオペランドは my_namespacefunc1abstd、および func2 です。

メトリクス情報

グループ: 関数
頭字語: VOCF
HIS メトリクス:はい

バージョン履歴

すべて展開する