初めて来た人へ |
技術的なスタンス
概要 ・初心者の方はここの内容を読んでもあまり理解できない可能性があります。その場合は、後で読み返してみてください。 ・Visual Basic 中学校が採用する技術的なスタンスを説明します。 ・Visual Basic 中学校は「できるだけ楽をする」がモットーです。 ・Option Explicit On、 Option Strict Off、 Disposeしない、OverloadsよりもOptionalなど。 |
1.ここで言う「スタンス」とは
このページで説明する「スタンス」とは「技術的な立場」ということで、変数の名前付けやコメントの書き方などとは異なります。
VBに限らずプログラミングの世界では同じ結果を実現するために無数の異なる方法が存在します。大部分のプログラマはできるだけ楽をしようとするので大体において同じような方法が採用されることが多いのですが、みんながぴったりと同じ方法を採用することにはならないので、大まかに見てもいくつかの立場が存在することになります。
Visual Basic 中学校のスタンスを一言で表すと「できるだけ楽をする。品質はそこそこで満足する。」ということになります。「品質はそこそこ」と聞くと嫌な感じがするかもしれませんが、私の感覚的にはインターネットに出回っているフリーウェアの平均値くらいの質を目指します。
本当に高品質なソフトは多言語に対応可能で、様々な環境で使用可能で、メモリなどのリソース管理も最適であるなどどれも実現できれば素晴らしいものですが、そこまでは追及しません。一般的なWindows環境で一般的な日本人が特に不満なく使えるアプリケーションを作れるようなプログラムを目指します。
なお、Visual Basic 中学校は「VBを勉強する」サイトですから、Visual Basic 中学校を卒業した後でもここで学んだ知識が役に立って応用が利くようなプログラム方法を取り上げたいと思っています。
当サイトで取り上げる知識は一時的な役に立つ知識ではなく、今後VBを勉強していく土台となるような知識でありたいと考えています。
サイト内のスタンスは一貫していることが望ましいのですが、当サイトでは残念ながら一貫したスタンスを採用しているようには見えない部分があります。これは当サイトが数年にわたって書き足されているためで、その間に私のスタンスも変化しているからです。
また、私の知識がなくて特に気にせず書いていた内容を後に知識が増えてから一定の立場で記述するようになった場合もあります。
サイト内のスタンスに一貫性を持たせるように後からでも記述を修正していくのが目標ですが、現在のところそういったことがらの優先順位は低いのでなかなか手が回りません。
さて、以下では当サイトが採用するいくつかの技術的スタンスを説明しますが、ここに挙げてないものでも私が無意識に採用しているスタンスがあると思いますし、特に記述する必要が感じられなかったため省略したスタンスもあります。たとえば、変数の宣言ではできるだけ厳密な型を指定するようなスタンスを採用していますが、ここまで常識的で細かいスタンスは取り上げません。
3.VB.NET2002, VB.NET2003, VB2005のスタンス
ここからは技術的なスタンスを説明します。VBのことをある程度理解していないとここで書いてある内容がわからないと思います。そういう場合はある程度勉強が進んでから再び目を通してみてください。
変数の宣言は強制します。
・私の感覚ではVBの開発者の99%はこのスタンスを採用しています。 ・マイクロソフト社もこのスタンスを採用しています。
・これはインストールした時の設定ですから、はじめてVBをさわるときはみんなこの設定になっています。
強制しない方が一見「楽」に思えますが後々のバグの温床になります。
暗黙の型変換を許可します。
・私の感覚ではVBの開発者の70%はこのスタンスを採用しています。 ・マイクロソフト社はこのスタンスを推奨しているように見えます。
・これはインストールした時の設定ですから、はじめてVBをさわるときはみんなこの設定になっています。
・このスタンスを採用しているプログラマの一部はOption Strict Onを採用しているプログラマから非常識だと思われるのではないかと内心劣等感を感じているようです。(あくまで「一部」です。誤解のないようにお願いします。)
すべての型を明示するのは手間がかかります。ただし、このスタンスでコンパイル時のエラーチェックが不十分になって、プログラムにエラーがあることにすぐに気が付かなかったりします。そういう意味で「質」は低下しますが、私にとってはこのくらいの質の低下は許容範囲です。
次のコードはOption Strict Off状態では問題ありませんが、Option Strict On状態ではビルドエラーになります。
Dim i As Integer i = 627
TextBox1.Text = i
ある種のオブジェクトはDisposeメソッドを備えていますが、このメソッドを「必ず呼び出す」ということはしません。
・私の感覚ではVBの開発者の70%はこのスタンスを採用しています。(ただし、このことの意味を理解した上でそれでもこのメソッドを必ず呼び出すわけではないという人はVB開発者全体の20%くらいでしょうか?) ・マイクロソフト社もこのスタンスを採用しているようです。
・このスタンスを採用しているプログラマの一部は必ずDisposeメソッドを呼び出すスタンスを採用しているプログラマから非常識だと思われるのではないかと内心劣等感を感じているようです。(あくまで「一部」です。誤解のないようにお願いします。)
Disposeメソッドは呼び出しても呼び出さなくてもプログラムの機能には影響ないことが多いのですが、適切に呼び出さないとメモリやその他のリソースを無駄に消費する可能性があります。
当サイトのスタンスではメモリ管理に関しては一切を自動処理に委ねます。プログラマはメモリ管理についてはまったく気にしなくて良いことになるので非常に楽です。ただし、使わなくても良い分のメモリまで消費してしまうのがデメリットです。
メモリ以外のリソースが関連している場合にはDisposeメソッドを呼び出す場合があります。
このスタンスを採用するとフォームに赤い点線を描くプログラムは次のようになります。
Dim g As Graphics = Me.CreateGraphics Dim p As New Pen(Color.Red, 5)
p.DashStyle = Drawing2D.DashStyle.Dot
g.DrawLine(p, 10, 10, 100, 100)
必ずDisposeを呼び出すスタンスを採用すると同じプログラムが次のようになります。
Dim g As Graphics = Me.CreateGraphics Dim p As New Pen(Color.Red, 5)
p.DashStyle = Drawing2D.DashStyle.Dot
g.DrawLine(p, 10, 10, 100, 100)
p.Dispose()
g.Dispose()
ここで挙げた短いサンプルだけを見たり、試したりする限りでは上の例の方がプログラムが単純で優れているようにも思えますが、大きなプログラムの中では上の例では無駄にメモリを使ってしまうという点を覚えておいた方がよいです。
だたし、どちらの例でも実行するのに必要なメモリ量が変るわけではなく、メモリの効率的な使用ができるかできないかが変化するだけです。たとえば、下の例なら実行できるのに上の例ではメモリ不足で実行できないということはありません。
OverloadsとOptionalのどちらでも目的を達成できる場合はほとんどの場合Optionalを使用します。Optionalの方がプログラムが楽になることが多いです。
・私の感覚ではVBの開発者の70%はこのスタンスを採用しています。 ・この件に関するマイクロソフト社のスタンスは不明です。
・オブジェクト指向派のごく一部の開発者は、このスタンスを採用している開発者のことを素人だと感じているようです。(あくまでも「ごく一部」です。誤解のないようにお願いします。)
多くの場合Optionalの方が楽ですが、Overloadsの方が楽な場合もあります。そのような場合はOverloadsを使います。要するにこの件に関してはどっちを使ってもよいので楽な方を使うということです。
ただし、ライブラリを作成する場合や、C#など他の言語との連携を想定している場合、それにクラスの設計上Optionalが好ましくないと判断した場合にはOverloadsを採用するようにします。
変数の宣言は強制します。
・私の感覚ではVBの開発者の80%はこのスタンスを採用しています。 ・マイクロソフト社もこのスタンスを採用しています。
・これはインストールした時の設定ではありません。
・このスタンスを採用している開発者のほとんどは、このスタンスを採用していない開発者のことを非常識だと感じています。
強制しない方が一見「楽」に思えますが後々のバグの温床になります。
VBには省略可能なプロパティが存在しますが、原則として省略しないできちんと書きます。
・私の感覚ではVBの開発者の40%がこのスタンスを採用しています。 ・マイクロソフト社はこのスタンスを推奨しているように思えます。
・このスタンスを採用している開発者の一部は、このスタンスを採用していない開発者のことを非常識だと感じています。
既定のプロパティを省略するとプログラムは多少楽になりますが、プログラムがわかりにくくなりますし、バグの原因となることもあります。そこでこの場面では品質の方を重視して楽ではない方のスタンスを採用します。
たとえば、テキストボックスに値をセットするときには次のように記述することになります。
Text1.Text = "こんにちは"
このスタンスを採用しなければ次のように記述することも可能です。
Text1 = "こんにちは"
ただし、いくつかの場合ではプロパティを省略します。たとえば引数つきのプロパティが省略可能な場合は省略します。この場合は省略によるデメリットがほとんどないからです。たとえば、次のような記述をします。
Dim rs As ADODB.Recordset
'(rsを開く処理は省略)
Text1.Text = rs("住所")この場合に、プロパティを省略せずにすべて記述すると次のようになりますが、当サイトではこのようなスタンスは採用しません。
Dim rs As ADODB.Recordset
'(rsを開く処理は省略)
Text1.Text = rs.Fields.Item("住所").Value※上の例では、同時に引数つきではないプロパティも省略されています。
コレクションの内容にアクセスするときに記号「!」を使用することができますが、当サイトではこの記号は使用しません。
・私の感覚ではVBの開発者の50%がこのスタンスを採用しています。 ・この件に関してのマイクロソフト社のスタンスは不明です。
ほとんどのLetと一部のSetは省略可能です。当サイトでは省略可能な場合はすべて省略します。
・私の感覚ではVBの開発者の95%がこのスタンスを採用しています。 ・マイクロソフト社もこのスタンスを推奨しているように見えます。
このスタンスを採用すると次のようなプログラムが可能です。
Dim FileName As String
FileName = "C:\Sample1.bmp"
Me.Picture = LoadPicture(FileName)このスタンスを採用しない場合は、たとえば次のようになります。
Dim FileName As String
Let FileName = "C:\Sample1.bmp"
Set Me.Picture = LoadPicture(FileName)このスタンスを採用しない開発者の場合でもLetについては省略する人がほとんどです。
Option Baseを使うと配列の添え字の既定の下限値を設定できますが、混乱を招くので絶対に使用しません。
・私の感覚ではVBの開発者の95%がこのスタンスを採用しています。 ・マイクロソフト社もこのスタンスを推奨しているように見えます。
・このスタンスを採用している開発者の多くはOption Baseを見かけるとびっくりします。