佐々木屋

技術的なことから趣味まで色々書きます

Option Strict Off は悪なのか?

とある方からこんな質問。

「Option Strict Off は使うべきか」

私の判断は、「どちらでも良い」が正解です。
他のWEBや本を見ると、「On」にしないと駄目プラグラマやで~みたいな風潮で洗脳するように書かれていますが・・・。

そもそも、「Option Strict」って実はVB.NET特有の機能です(多分)。C#Javaにはありません。なぜこの機能があるかというと、理由は2つあります。

初心者向けとVB6ユーザーへの忖度

一つは、先日C#とVB.NETの違いでも書きましたがVB.NETは他の言語に比べて文法規制が非常にゆるいです。逆にC#C++などは文法規制が非常に厳しいので、初心者はここでつまづきます。ということは逆に言えば、VB.NETは初心者でも非常に簡単に学習できるということ
にもなります。この差は間違いなく「Option Strict」があるかないかです。

これは悪い意味ではなく、広くプログラミングを学んでもらう、VB6ユーザーがVB.NETへ気楽に移行できるように、という点を考えれば非常に有用であると私は思います。そもそも全員が全員ハイレベルなプログラマになる必要はないので。

言語仕様の問題

もう一つの理由はVB.NET言語仕様です。例えば以下のコードを考えます。

Dim hour1 As Integer = 2
Dim minutes1 As Integer = 45
Dim res As Integer = hour1 * 40 + minutes1 * 2 / 3 'この行が縮小変換でエラー

このコードはVB.NETだと右辺がDouble型と判断され、左辺がInteger型なので縮小変換となってしまいエラーとなります。

ではC#ではどうなるかというと、

int hour1 = 2;
int minutes1 = 45;
int res= hour1 * 40 + minutes1 * 2 / 3; //左辺右辺どちらもint型になる

このように右辺もちゃんとint型と判断されて型変換無しで普通に書くことができます。こういった現象が様々な場所で出てきます。

まとめ?

確かに「型」の認識は正しく身に着けた方が良いですが、VB.NETの言語仕様が少し斜め上を行っているので、状況によっては「Option Strict Off」を利用した方が良いのでは?という考えに達するのも致し方ないと思うのです。

但し、今後他のプログラミング言語を勉強したい、VB.NETプログラマだけどより高みを目指したい、ということであれば「Option Strict On」の方が色々身につくのは間違いないです。

「Option Strict On にすると可読性が落ちてしまうんですけど!」

姉さん事件です(古)。新たな問題です。仮にOption Infer Onした時、以下の質問がありました。

結果、自分の知識が足りないため、異常にコードが長くなってしまい、全体が読みにくくなってしまう傾向にあります。※可読性が落ちて、混乱します。

これはある程度経験が物を言うということもありますが、恐らく「Option Strict On」で発生する問題のほとんどは縮小変換による「型」問題です。これを解消するのは、例えばInteger型の型変換関数を静的クラス(モジュール)に作ってしまってそれをバンバン使う、という事をします。これはクラス関数のお作法としての、

  • 受け入れは心大きく
  • 送り出しは厳密に

にも沿っています。

慣れてくると変数の型設定やクラスの作り方が「正しい型」ありきの設計になってきます(多分)。

本当のまとめ

3行にまとめると、

  • 「Option Strict Off」は一概に悪とは言えない
  • 型の認識がしっかりしているのであればOffでも良い(というかOffせざるを得ない)
  • でも、より高みを目指すならOnの方が後々幸せになれるよ