PHPのプログラムを改善しながらローカル変数酷使度を理解する

PHPのローカル変数酷使度を計測するツールを作ってます。この記事で記載されているローカル変数酷使度は、このツールで計測しました。

プログラムの可読性や保守性を向上させるためには、ローカル変数の適切な管理が重要です。特に、「ローカル変数を酷使しすぎるとコードが複雑になり、可読性や修正のしやすさが低下する」 という問題が発生します。

本記事では、PHPでCSVの1行を生成する関数を例に取り、ローカル変数酷使度 を段階的に改善しながら、その有用性を示していきます。

ローカル変数酷使度とは?

ローカル変数酷使度 とは、関数内の変数のスコープの広さや更新頻度を数値化した指標です。変数の使用範囲が広く、更新回数が多いほど値が大きくなり、コードの可読性が低下しやすくなります。

今回の例では、以下の関数を順番に改善しながら、ローカル変数酷使度を減らしていきます。


改善のステップ

ステップ 1: 初期状態(ローカル変数酷使度: 131)

<?php

/** ローカル変数酷使度: 131 */
function createCsvLine1($values) {
    $result = "";
    $count = count($values);

    for ($i = 0; $i < $count; $i++) {
        $value = $values[$i];

        // 文字列なら " で囲む
        if (is_string($value)) {
            $formattedValue = '"' . $value . '"';
        } else {
            $formattedValue = $value;
        }

        if ($i == 0) {
            $result .= $formattedValue;
        } else {
            $result .= "," . $formattedValue;
        }
    }

    return $result;
}

問題点:

  • $result を直接操作しており、条件分岐 if ($i == 0) によってコードが複雑化
  • $formattedValue という変数を毎回生成し、ローカル変数の使用が増加
  • for ループを使っているが、foreach の方が適切

ステップ 2: foreach に置き換え(ローカル変数酷使度: 106)

<?php

/** ローカル変数酷使度: 106 */
function createCsvLine2($values) {
    $result = "";

    foreach ($values as $value) {
        // 文字列なら " で囲む
        if (is_string($value)) {
            $formattedValue = '"' . $value . '"';
        } else {
            $formattedValue = $value;
        }

        if (empty($result)) {
            $result .= $formattedValue;
        } else {
            $result .= "," . $formattedValue;
        }
    }

    return $result;
}

改善点:

  • for ループを foreach に置き換え、ループの変数 $i を削減
  • empty($result) により、最初の要素かどうかを判定(ただし $result の操作は続く)
まだ問題がある点:
  • $result を直接操作するため、文字列連結処理のコストが高い

ステップ 3: 配列を活用(ローカル変数酷使度: 45)

<?php

/** ローカル変数酷使度: 45 */
function createCsvLine3($values) {
    $columns = [];

    foreach ($values as $value) {
        // 文字列なら " で囲む
        if (is_string($value)) {
            $formattedValue = '"' . $value . '"';
        } else {
            $formattedValue = $value;
        }

        $columns[] = $formattedValue;
    }

    return implode(',', $columns);
}

改善点:

  • $result の文字列連結を implode() に置き換え、可読性と効率を向上
  • 変数 $columns を使うことで ローカル変数の酷使を軽減

ステップ 4: 変数のスコープをさらに縮小(ローカル変数酷使度: 15)

<?php

/** ローカル変数酷使度: 15 */
function createCsvLine4($values) {
    $columns = [];

    foreach ($values as $value) {
        $columns[] = is_string($value) ? '"' . $value . '"' : $value;;
    }

    return implode(',', $columns);
}

改善点:

  • formattedValue という不要な変数を削除し、変数のスコープを縮小
  • コードが簡潔に

ステップ 5: array_map() を活用し、最適化(ローカル変数酷使度: 9)

<?php

/** ローカル変数酷使度: 6 + 3 = 9 */
function createCsvLine5($values) {
    return implode(',', array_map(function ($value) {
        return is_string($value) ? '"' . $value . '"' : $value;
    }, $values));
}

最適化のポイント:

  • foreach すら不要になり、関数のスコープを最小限に抑えた
  • コード量を削減しながら、ローカル変数の酷使度を大幅に改善

まとめ

ステップ 方法 ローカル変数酷使度
1 for を使用、文字列連結あり 131
2 foreach を使用、文字列連結あり 106
3 配列を活用し implode() を使用 45
4 formattedValue を削除し簡潔化 15
5 array_map() を活用し最適化 9
ローカル変数酷使度を適切に管理することで、よりシンプルで読みやすいコードを書くことが可能 になるということがわかって貰えたのではないでしょうか?ぜひ、あなたのコードでも試してみてください!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

This site uses Akismet to reduce spam. Learn how your comment data is processed.