CodeZine(コードジン)

特集ページ一覧

「スコープ」
~マンガでプログラミング用語解説

マンガで分かるプログラミング用語辞典(32)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2013/07/16 14:00

解説

 プログラムも行数が大きくなってくると、適切なサイズに分割しなければ把握できなくなってきます。

 そういった際に重要なのは、変数の有効範囲です。ある場所で宣言した変数が、100万行あるプログラムの全ての場所で値を保持したままだった場合、プログラマーがその状態を把握するのは非常に困難です。

 たとえば、100万行のプログラムの中に、変数が1万個あるとします。その全てに違う名前を付けて、その全てを把握しなければならないという状況を考えてください。そういったプログラムを書きたいとは思わないはずです。

 できれば、100行から数100行程度の分かりやすい範囲の間だけで変数が有効で、それ以外の場所には影響が及ばず、別の場所では同じ名前の変数を宣言できる方が、プログラムは書きやすいです。

┏━━━━━┓
┃     ┃
┃変数a  ┃
┃変数b  ┃←┐
┃:    ┃ │
┃     ┃ │
┗━━━━━┛ │
        ├─ それぞれ独立している方が分かりやすい
┏━━━━━┓ │
┃     ┃ │
┃変数a  ┃ │
┃変数b  ┃←┘
┃:    ┃
┃     ┃
┗━━━━━┛

 そういった問題を解決するのが「スコープ」という概念です。多くのプログラム言語では、変数を宣言する場合、その宣言の仕方によって、その変数の有効範囲が決定するようになっています。

 一例として、関数内で宣言した変数は「ローカル変数」となり、関数内だけで有効となります。そして、関数外で宣言した変数は「グローバル変数」となり、プログラム全体で有効になります。

プログラム全体
 グローバル変数a プログラム
 グローバル変数b 全体で有効
 :
┏━━━━━━━━┓
┃関数X {    ┃
┃ ローカル変数a┃関数X内
┃ ローカル変数c┃だけで有効
┃}        ┃
┗━━━━━━━━┛
┏━━━━━━━━┓
┃関数Y {    ┃
┃ ローカル変数b┃関数Y内
┃ ローカル変数d┃だけで有効
┃}        ┃
┗━━━━━━━━┛

 ローカル変数とグローバル変数の名前が同じ場合は、ローカル変数が有効な場合は、ローカル変数が優先されます。ただ、名前は別にしておいた方が、混乱が起きず、分かりやすいです。

 また、プログラム言語によっては、グローバル変数とローカル変数が同じ場合でも、それぞれを利用する方法が用意されています。

 この変数のスコープは、プログラミング言語の基本的な設計思想などに強く関係するため、プログラミング言語によって、その有効範囲は大きく違います。

 プログラムを、どう整理して、分割するかは、プログラミング言語によって大きく違います。そして、その整理方法や分割方法に合わせて、スコープの仕様は設計されます。

 変数がどの範囲有効かは、プログラム言語ごとに、仕様をきちんと確認する必要があります。

サンプル

 変数の有効範囲が分かる処理を、JavaScriptで簡単に書いてみます。

<html>
    <head>
        <title>「スコープ」のサンプル</title>
    </head>
    <body>
        <pre><script type="text/javascript">
            // グローバル変数
            var a = 0;
            var b = 1;

            document.writeln("global a : " + a);
            document.writeln("global b : " + b);

            // 関数1
            function func1() {
                // ローカル変数
                var a = 100;
                var b = 101;

                // ローカル変数が優先される
                document.writeln("func1 local a : " + a);
                document.writeln("func1 local b : " + b);

            }

            // 関数2
            function func2() {
                // ローカル変数
                var a = 200;
                var b = 201;

                // ローカル変数が優先される
                document.writeln("func2 local a : " + a);
                document.writeln("func2 local b : " + b);

            }

            func1();
            func2();

            // グローバル変数とローカル変数は独立している
            document.writeln("global a : " + a);
            document.writeln("global b : " + b);
        </script></pre>
    </body>
</html>
出力結果)
global a : 0
global b : 1
func1 local a : 100
func1 local b : 101
func2 local a : 200
func2 local b : 201
global a : 0
global b : 1
フィードバックお待ちしております!

 ご感想、解説して欲しい用語、解説内容のアドバイスなどございましたら、FacebookTwitterなどでお気軽に編集部までお寄せください。よろしくお願いいたします。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:マンガで分かるプログラミング用語辞典

もっと読む

著者プロフィール

  • 柳井 政和(ヤナイ マサカズ)

    クロノス・クラウン合同会社 代表社員 http://crocro.com/ オンラインソフトを多数公開。 プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。 「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5