概要
型を宣言することの良い点は、プログラムで表現しようとしている対象を深く考えるきっかけを与えてくれる点だと思います。
私はPythonを書き始めた頃、型宣言する必要がないために、変数の型を意識しませんでした。
最近、型はプログラムを書く際に副操縦士や補助輪としてプログラマーを補佐する効果があると感じています。
たとえ話
プログラムはなにかを表現するものだと思います。
ここではバレーボールを表現してみます。
登場させるのはセッター、スパイカー、バレーボールです。
セッターがボールを上げて、スパイカーが相手コートへ打ちこむ様子を書きます。
例1
ball = "ball"
setter = Setter()
spiker = Spiker()
setter.setup(spiker, ball)
spiker.spike()
これでも一応はバレーボールにおける、セッターがボールを上げて、スパイカーが相手コートへ打ち込むという様子を表現できていそうです。
例2
次の例を見てみます。
ball = "soccer_ball"
setter = Setter()
spiker = Spiker()
setter.setup(spiker, ball)
spiker.spike()
この例ではball
変数にsoccer_ball
が入っています。
にもかかわらず、セッターもスパイカーも気にすることなく競技を続けているようですね。
例3
最後にかなり変な例を書きます。
ball = "water"
setter = Setter()
spiker = Spiker()
setter.setup(spiker, ball)
spiker.spike()
今度はボールではなく**水(water)**になっています。
それでも、セッターとスパイカーは気にしていない様子。
型宣言をしてみる
たとえ話で出てきたサンプルコードは、どこかおかしいものでした。
特に例2と3は変ですね。
ここで考えてみたいことは、何が変だったかということです。
プログラムだけに閉じた話をすれば、何も変ではないです。実際に動作するでしょう。
ただ、バレーボールを表現しようとしたプログラムだとすれば、変です。
この違和感を型宣言をすることで確認しましょう。
ball: str = "ball"
setter: Setter = Setter()
spiker: Spiker = Spiker()
setter.setup(spiker, ball)
spiker.spike()
ボールを表す変数ball
がstr
となっていることに違和感を覚えます。
バレーボールで使うボールは文字列ではなく、本物のボールだからです。
文字列のボールを使っているから、waterというヘンテコな値が入り込みました。
ball: Ball = Ball()
setter: Setter = Setter()
spiker: Spiker = Spiker()
setter.setup(spiker, ball)
spiker.spike()
上記ではball
にBall
型を入れています。
これならば違和感はないですね。
ちょっと状況を変えて、これが球技大会の中の位置種目としてバレーボールがある場合はどうでしょう。
サッカーやバスケットボールもあります。
ただのBall
型だとサッカーボールやバスケットボールと混同しそうです。
ball: VolleyBall = VolleyBall()
setter: Setter = Setter()
spiker: Spiker = Spiker()
setter.setup(spiker, ball)
spiker.spike()
VolleyBall
型を入れることで、サッカーボールでもバスケットボールでもないバレーボールを使っていることがわかります。
まとめ
このように型を意識して書くことで、自分がプログラムで表現しようとしている対象のことを深く考えるようになります。
対象に対する理解が深まるほどに、読んでいて自然なプログラムを書けるようになると感じます。