バケツ!

英語表記ではBucketというらしい。バケツは日本語だが、もとは英語からきている。

そんなことはどうでもよい。プログラミングで使われる変数の話である。変数はバケツに例えられることがある。入れ物だからね。コードを書いている時、そのバケツに文字列や数値などをいれておき、あとで使うということが必然的に行われている。なぜかって?便利だし。

では、バケツに入れておかないとどうなるのか、ということを考えてみよう。たとえば、日付をコードの中に直接書いておいたとしよう。書いた数は10箇所あるとする。年度が変わったときどうなるのか、当然、10箇所を書き換えることになる。では、バケツ(変数のことだよ)に入れておいたとしよう。日付のところはバケツ(わかっていると思うが変数だよ)を使っておくと、最初のバケツ(変数ね)の中身を書き換えてしまえば、1箇所の変更だけで済む。あとから利用するならバケツ(変数!)に入れておくと、幸せになるのである。

さて、プログラミング言語には、バケツにいれるデータを厳しく取り決めているものがある。つまり、このバケツにはコレ、あのバケツにはアレというぐあいである。気を利かして余計なことをすると怒られたりする。たとえば、水しか入れてはいけないバケツに、ガソリンを入れて、あとから炎上しては困るのである。厳しさの代表がC/C++やJavaなどのプログラミング言語だ。反対にバケツにはなんでも入れてもいいよというプログラミング言語もある。バケツに水を入れようが、ガソリン入れようがお構いなしというやつだ。PHPやPythonが、その代表になる。

どちらがよいかということはない。が、しかし、世の中にはなんでも構わないことより、厳しさを好むプログラマー達がいる。やっぱりきちんとしていたほうがいいよねというやつだ。あらかじめきちんとデータ型を定義しておき、バケツに整数型と書いたりする。データ型には、整数型のほかに文字列型、単精度型、倍精度型などがある。

逆にバケツに何も書かないで、入れたときにデータ型がきまるというのもある。好きなものぶち込めというやつだ。使い方によっては非常に便利なんだが、昔のBASIC言語を思い出してしまうのは、なぜなんだろうか。BASICでは、倍精度は#記号、単精度は!記号か何もつけない、文字型には$記号を変数名のあとにつけていた。まだ、このほうがマシである。PHPやPythonはイケてないなあ、と思ったりする。いっておくがディスっているのではない。

バケツに型を書いていなければ、その取り扱いには注意が必要である。整数を入れておいたのに文字型だったということが起きてしまう。バグを引き起こしやすいのである。変数をきちんと管理するのは、どのプログラミング言語でも同じだが、きちんと定義してあると、変数に値を代入するコードを記述しただけで、実行しなくともエディタ上でエラーとなる。

定義していないと、比較的い小さなプログラムなら発見しやすいが、大きなプログラムになると、値がおかしいね、どこが悪いの?ということになってしまう。エラーが発生しないのである。エラーメッセージが発生していれば、発見も早く問題も解決しやすい。もちろん、エラーが発生しないバグが一番困難なのだ。まあ、これはどのプログラミング言語も同じなんだけどね。

そういえば、Pythonには型ヒントがあるらしい。使い方によっては便利だとわかるのだが、嫌がらせ的にコードを書いてみた。

# こんな感じに記述するらしい
def outputStrLength(s: str) -> int:
    return len(s)


# main()
s: int  = 'Hello world'

print(outputStrLength(s))

すこし、試してみただけだが、よくわからないシロモノと言える。コメントつけて書き直してみた。

# 機 能:文字数を返す
# 引 数:s 文字列
# 戻り値:文字数を整数型で返す
def outputStrLength(s: str)
    return len(s)


# main()
s: int  = 'Hello world'

print(outputStrLength(s))

これではダメなのだろうか(注: s: intと記述しているのはミスでも何でもなく、わざと記述している)。

型ヒントは、C/C++やJavaのような型定義ではないので、勘違いしないようにするべきだろう。型ヒント付けたからといって、バケツの中には何でも入れることができるのは変わらないのである。ただ、なにもしないことと較べて、型ヒント付けたほうがわかりやすくなるのは確かなことである。もっと使いこなしていけば見方が変わるかもしれない。

最後にまとめておこう。

型定義あり
・使用する変数にすべて型を付ける
・変数が多すぎるとメンドイ

型定義なし
・いつでもどこでも、自由に変数を作って何でも入れることができる
・バグの温床になりやすい