プログラムの構造を考える

コンテンツ



プログラムの構成要素

 プログラムを実行するには,ステートメント(命令)を一つずつ書いていかなければなりません.プログラミング言語で記述された一連の命令文をソースコードと呼びます.ソースコードには構造があり,所定の場所に適切な命令文を記述する必要があります.Visual Basicでは,関連する複数のステートメントをブロック単位でまとめて,ソースコードを記述していきます.
 このようなブロック単位のまとまりにもいくつか種類があります.この講義では,主に,クラスメソッドプロシージャ)と呼ばれるブロックを扱っていきます.クラスとメソッド(プロシージャ)は入れ子構造で構成することができます.各ブロックをプログラミング言語で記述すると以下のようになります.

  •  クラス
  •  ブロック単位の一番大きなものがクラスです.Visual Basic では,クラスを用いることで,関連する変数やステートメントを一つのグループとして表現できます.
     フォームアプリケーションでのプログラム作成をすると,以下のような Form1 クラスが出てきます.これは Form1 というウィンドウをデザインするために作成されたクラスです.そのため, Button コントロールや Label コントロールを配置すると,各コントロールに関連するイベントハンドラーが Form1 クラス内に記述されます.

    Class Form1
    'ここにステートメントを書く
    End Class

    •  メソッド(プロシージャ)
     クラスの内部には,さらにブロックを細かく入れることができます.メソッド(プロシージャ)は,特定の処理を行うために必要なステートメントを,クラスの中でまとめたブロックのことをいいます.メソッドを記述するためには「Sub」というキーワードを使用しますが,これはサブルーチン(subroutine)という言葉に由来しているようです.

    Sub Proc1
    'ここにステートメントを書く
    End Sub

     これまでの講義で,Button コントロールをクリックした場合のイベントに対して,ステートメントを記述してきましたが,実は上記のような構造に基づいてプログラムを作成していました.以下のコードは, フォーム上の Button コントロールをダブルクリックした際に生成されるイベントハンドラーです.

    Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    'ここにステートメントを書く
    End Sub
    End Class

    ここでは Form1 クラスの中に Button1_Click メソッドが生成されています.
     また,クラスやメソッドの前に「Public」や「Private」というキーワードが修飾されていますが,これらはアクセシビリティの設定に使用されています.詳細は説明しませんが,簡単にいうと, Public は「ブロック外からでも自由にアクセスできる」, Private は「ブロック内からしかアクセスできない」という意味になります.



    ページのトップへ戻る


    変数のスコープ

     変数は宣言さえすれば,ソースコード上のどこからでも使用できるというわけではありません.変数にアクセスすることができる有効範囲をスコープと呼びます.スコープは,ブロック単位に合わせて,以下の四つの種類があります.

    ① プロジェクトスコープ
    •  クラス内部にあるメソッド(プロシージャ)の外で宣言された Public 変数のスコープ
    •  ソースコード内の全体から使用が可能であり,グローバル変数パブリック変数と呼ばれる
    •  使用の有効期間は,プログラムが終了するまで
    ② モジュールスコープ
    •  クラス内部にあるメソッド(プロシージャ)の外で宣言された Private 変数のスコープ
    •  変数が宣言されたクラス内部にある全てのメソッド(プロシージャ)から使用が可能
    •  使用の有効期間は,クラスが終了するまで
    ③ プロシージャスコープ
    •  メソッド(プロシージャ)の内で宣言された変数のスコープ
    •  変数が宣言されたメソッド(プロシージャ)内部のみで使用が可能であり,ローカル変数と呼ばれる
    •  使用の有効期間は,メソッド(プロシージャ)の実行中のみ
    ④ ブロックスコープ
    •  Ifステートメント文などのブロック内で宣言された変数のスコープ
    •  変数が宣言されたブロック内部のみで使用が可能
    •  使用の有効期間は,ブロックの実行中のみ
     
    各スコープの範囲を図示すると以下のようになります.




    クラス,メソッド,ブロックは入れ子構造になっています.グローバル変数とローカル変数が同じ名前になるとバグの原因になりますので,できるだけ違う名前をつけるようにしましょう.
     
     ちなみに,もし同一名で定義するとどうなるのか?以下のプログラムで確認してみてください.
     まず,フォームの上にButtonコントロールを三つ,Labelコントロールを二つ,配置してください.
     次に,以下のコードを記述してください.

    Public Class Form1
        Dim a As Integer = 10    'モジュールスコープの変数

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim a = 1.5              'プロシージャスコープの変数

            Label1.Text = a
            a = a + 10
        End Sub

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Label1.Text = a
            a = a + 10
        End Sub

        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            Label2.Text = a
        End Sub
    End Class

    プログラムを見てもらえばわかりますが,それほど難しいことは書いていません.ただ,ここでは a というInteger型の変数をモジュールスコープで一つ宣言しているのに対して,Button1_Clickメソッドの中でもObject型の変数を一つ宣言しています.
     それぞれのメソッドの中身をみていくと,まず,Button1_Clickメソッドでは,a というObject型の変数を宣言し,さらに 1.5 と初期化した後でLabel1コントロールにその値を表示させています.また,表示させた後で a という変数に 10 を加算しています.
     次に,Button2_Clickメソッドでは,a という変数を宣言することなく,Label1コントロールに値を表示させています.また,その後で,a という変数に 10 を加算しています.
     最後に,Button3_Clickメソッドですが,ここでは単純にLabel2コントロールに a という変数の値を表示させることのみ行っています.

     さて,プログラムを実行して,それぞれのボタンを押してみると結果はどうなるでしょうか?もし出てきた値が予想外だった人は,このような変数の宣言の仕方をできるだけ避けるようにしましょう!




     ページのトップへ戻る