付録 : VB で やってみる

同じ課題 "Hello, Java!!" ( 転じて "Hello, ObjectiveVB!!" ) を、 VB5CCE で やってみましょう。

VB には、 クラスも一応ありますし、 Form モジュールは、 フォームを持ったクラスだと考えられます。

そこで、 Sub Main() で、 クラスとフォームをインスタンス化してやる、 というコーディングスタイルにするのです。

したがって、 Sub Main() 以外には、 *.bas モジュールは使いません

ただし、 クラスを継承できないため、 すべて関連だけで 構築しなければならないことや、 ボタンだけを持ったクラスなどは 作れない (ActiveX DLL などにしてしまう手も ありますが) などの、 オブジェクト指向言語では無いがゆえの 欠点はあります。 そこでは、 どうしても理想の設計とは異なった実装を 余儀なくされてしまいます。

しかし、 分析段階では、 どんな言語であろうと、 オブジェクト指向は活かせるのです。

分析・設計

基本的に Java で やったのと同じです。 コンソールクラスは、 ( "Hello, ObjectiveVB!!" を 表示する ) フォームクラスに読み替えてください

ただし、 クラスの継承が使えないので、 挨拶文クラスと フォームクラス の 関係は、 関連 に なります。 また、 GreetString クラスの output メソッドも、 getGreetString メソッドに変えて、 実際の出力は フォームクラスで 行うことになります。

設計の結果は、 次のようになります。 Java の 詳細設計 と 比較してみてください。

+------------------------------------+
| GreetString                        |
|+-----------------+                 |
|| /m_sGreetString |  getGreetString |
||  m_sGreet       |  setGreet       |
||  m_sPerson      |  setPerson      |
|+-----------------+                 |
+------------------------------------+
            |
            |
            |
+------------------+     +-------------------------------------+
| GreetWin         |     | Argments                            |
|+--+              |-----|+-----------------------+            |
||  | output       |     || m_sCommandLineArgments|  getGreet  |
|+--+ GreetWin     |     |+-----------------------+  getPerson |
|     main         |     |                           Argments  |
+------------------+     +-------------------------------------+

なお、 この OMT図 では、 コンストラクタとしてクラス名が書いてありますが、 VB の 実装では、 Initialize メソッドになります。

また、 main メソッドの役割は、 GreetWin を インスタンス化し、 表示し、 output メソッドを呼び出すことになります。

コーディング

'*** GreetWin.bas ***
Option Explicit

Private frmGreet As GreetWinForm

Public Sub Main()
    Set frmGreet = New GreetWinForm
    Call frmGreet.Show
    Call frmGreet.output
End Sub

※ この例題では、 Form が一つしかないので、 Main() を Form_Load に 入れてしまっても良い。

'*** GreetWin.frm ***
'* フォーム上に ラベル Label1 を 配置
Option Explicit

Private m_gs As GreetString
Private m_args As Argments

Public Sub output()
    Call m_gs.setGreet(m_args.getGreet())
    Call m_gs.setPerson(m_args.getPerson())
    Label1.Caption = m_gs.getGreetString()
End Sub

Private Sub Form_Initialize()
    Set m_gs = New GreetString
    Set m_args = New Argments
End Sub

Private Sub Form_Terminate()
    Set m_gs = Nothing
    Set m_args = Nothing
End Sub
'*** GreetString.cls ***
Option Explicit

Private Const DEFAULT_GREET$ = "Hello"
Private Const DEFAULT_PERSON$ = "ObjectiveVB"

Private m_sGreet As String
Private m_sPerson As String

Public Function getGreetString() As String
    getGreetString = m_sGreet & ", " & m_sPerson & "!!"
End Function

Public Sub setGreet(ByVal sGreet As String)
    sGreet = Trim$(sGreet)
    If ("" < sGreet) Then
        m_sGreet = sGreet
    End If
End Sub

Public Sub setPerson(ByVal sPerson As String)
    sPerson = Trim$(sPerson)
    If ("" < sPerson) Then
        m_sPerson = sPerson
    End If
End Sub

Private Sub Class_Initialize()
    m_sGreet = DEFAULT_GREET$
    m_sPerson = DEFAULT_PERSON$
End Sub
'*** Argments.cls ***
Option Explicit

'** コマンドライン引数は、/g オプションと /p オプションで区別する。
'** つまり、
'**     /g 「挨拶」 /p 「相手」
'** ex) /p Altair /g "Good morning"

Private m_sCommandLineArgments() As String
Private Const OPT_HEAD$ = "/"
Private Const OPT_GREET$ = "g"
Private Const OPT_PERSON$ = "p"

Public Function getGreet() As String
    Dim i As Long
    Dim sChr As String
    For i = LBound(m_sCommandLineArgments) To UBound(m_sCommandLineArgments)
        If (OPT_HEAD$ = Left$(m_sCommandLineArgments(i), 1)) Then
            sChr = LCase$(Mid$(m_sCommandLineArgments(i), 2, 1))
            If (OPT_GREET$ = sChr) Then
                If (OPT_HEAD$ <> Left$(m_sCommandLineArgments(i + 1), 1)) Then
                    getGreet = m_sCommandLineArgments(i + 1)
                    Exit Function
                    '*** (not reached) ***
                End If
            End If
        End If
    Next i
End Function

Public Function getPerson() As String
    Dim i As Long
    Dim sChr As String
    For i = LBound(m_sCommandLineArgments) To UBound(m_sCommandLineArgments)
        If (OPT_HEAD$ = Left$(m_sCommandLineArgments(i), 1)) Then
            sChr = LCase$(Mid$(m_sCommandLineArgments(i), 2, 1))
            If (OPT_PERSON$ = sChr) Then
                If (OPT_HEAD$ <> Left$(m_sCommandLineArgments(i + 1), 1)) Then
                    getPerson = m_sCommandLineArgments(i + 1)
                    Exit Function
                    '*** (not reached) ***
                End If
            End If
        End If
    Next i
End Function

Private Sub m_getCommandLineArgments()
'** Command$ を空白文字で分解して m_sCommandLineArgments() に格納する。
'** ただし、前後の「"」は削除する。

	'*** (省略) ***

End Sub


Private Sub Class_Initialize()
    ReDim Preserve m_sCommandLineArgments(0 To 0)
    m_sCommandLineArgments(0) = ""
    Call m_getCommandLineArgments
End Sub

いかがでしたか? VB でも、オブジェクト指向は できる ということが判っていただければ、 と 思います。

なお、 全ソースは VbOop1.lzh (3,370Bytes) を ダウンロードして御覧ください。