2024/03/20

変数宣言 と 暗黙の宣言

以前投稿した ビジネスアプリ開発で大切なこと の記事の中で、コーディングルールについて紹介しました。今回は、変数宣言の必要性についてまとめます。


変数宣言と型

変数とは、プログラムで使用するデータ(値)を保存する器のようなものです。その値を使って集計などの計算をしたり、値を判定して分岐させたり、さまざまな用途で利用します。

通常、この変数を利用するには、”変数宣言” を行って器を準備します。

   Dim i As Integer    ' 整数型
   Dim s As String     ' 文字列型

Dim が変数宣言を行う命令で、i や s が変数名で器の名前ですね。As 以降が型宣言といって、その変数に入る値の種類を宣言します。これをデータ型と言います。

変数に値を代入するには ”=” を使用して値をセットします。

   i = 0
   s = "これは文字列型の変数です"

このように 1 つの変数に特定の 1 つの値を保持する変数をスカラー型変数と総称します。


スカラー型以外としては、オブジェクトを保存する変数があります。

   Dim nd As NotesDocument

さらに、複数のスカラー型変数をまとめて取り扱える配列や List、ユーザ定義のデータ型、ユーザ定義型のクラス(オブジェクト)などさまざまな種類があります。


そして、LotusScript には、どんな型の値でも保持できる Variant 型という特殊なデータ型があります。次のように 1 つの変数の中に違う型のデータを代入することができます。

   Dim v As Variant

   v = 0    ' 数値を代入
   v = "文字列"    ' 値を文字列に変更
   set v = New NotesSession()    ' オブジェクトも入ります



暗黙の宣言

LotusScript のプログラムを見ていると変数宣言がないのに変数を使用しているケースがあります。サンプルとして次のようなエージェントを作成してみました。

変数 s に文字列を代入してメッセージボックスで表示するだけのエージェントです。実行すると『出直し!! ドミノ塾』と正しく表示されます。

デバッグモードで実行すると変数 s が生成され値がセットされていることが確認できます。

これは、暗黙の宣言という機能によるもので、宣言していない変数名を使用すると自動的に変数が生成される機能となります。


暗黙の宣言のデメリット

変数宣言意をいちいちしなくても変数が利用できるなんて、暗黙の宣言て機能は便利だと思いましたか?

でも、この機能がきっかけでバグが出ることもあります。例えば、次のプログラムは実行はできますがメッセージは正しく表示されません。

Sub Initialize
   sText = "出直し!! ドミノ塾"
   MsgBox sTest
End Sub

原因は、変数のタイプミスですね。値をセットした変数と違う名前がメッセージボックスに指定されています。デバッガで実行を確認すると 2 つの変数が生成されていることがわかります。

このようにタイプミスでも設計保存(コンパイル時)にエラーが出ず、気が付かないことがデメリットになります。


暗黙の宣言の禁止

このような問題を排除するために、以下のステートメントを (Options) に記述すると暗黙の宣言を禁止するとができます。

Option Declare

これを記述すると変数宣言が必須となりますので、変数 sText の宣言も追加します。するとタイプミスがエラーとなって表示されます。

なお、Option Declare の代わりに Option Explicit と記述しても同じ効果が得られます。


チーム開発のためには

後任の方がプログラムを確認したとき、コード上に突然登場した変数が、意図したものかタイプミスか判別するすべがありません。このような問題を避けるためにも、暗黙の宣言は一律禁止しておくべきです。

こうしておくことで、そのプログラムは、少なくとも文法的には正しいことが保証されます。問題があるとすれば論理的なバグということで、調査する範囲が限定できますね。


また、暗黙の宣言で作成された変数は Variant 型となります。Variant 型変数はどんな値でもセットできる反面、どのような値が入るべきか?入っているのか?を確認するためには、デバッグモードで確認するか、値を代入しているコードを探し出すしかありません。非常に手間がかかりますので、担当が変わることを前提としたチーム開発では不向きであるといえます。


ちなみに、現在のバージョンでは Option Declare の宣言はデフォルトでセットされ、あえて削除しないと、暗黙の宣言は有効にできません。しかし、少し前のバージョンでは、デフォルトでセットされていませんでした。ですので、過去のプログラムでは、有効になっていないことがあり得ますので注意が必要です。

また、フォームやビュー、アクションボタンなど一部の設計要素では、現在もデフォルトで Option Declare が宣言されません。このような設計要素では意識的にセットするようにしましょう。


0 件のコメント:

コメントを投稿