Visual Basic基礎(3)~言語特有の概念と構文 ~

Visual Basic (VB) は、そのシンプルな構文と柔軟な機能で、多くの開発現場で使用されてきた言語です。

しかし、単にVBの基礎を学ぶだけでは、実際のプロジェクトにおいて真に役立つスキルを身につけることは難しいでしょう。

特に、実務の現場では、再利用性、拡張性、そして保守性を考慮したコード設計が不可欠です。

本講座では、VBの基本構文や関数、オブジェクト指向プログラミングを表面的に学ぶだけでなく、これらの技術を実際の業務シナリオでどのように活用するかを掘り下げて解説します。

1.VBの基礎

実践例で学ぶVBの基本構文

VBの基本構文は、簡単な計算やデータの表示だけでなく、業務アプリケーションの構築にも活用できます。

例えば、以下のような業務アプリケーションの一部を構築するシナリオを考えてみましょう。

シナリオ: 顧客情報管理システムの一部を実装する

  • ユーザー入力を受け取り、それに基づいて処理を行う。
  • 複数行に渡るステートメントを使用して、顧客データを動的に表示する処理を作成。
Dim customerName As String = "山田 太郎"
Dim purchaseHistory As New List(Of String)
purchaseHistory.Add("商品A")
purchaseHistory.Add("商品B")

Console.WriteLine("顧客名: " & customerName & vbCrLf _
                & "購入履歴: " & String.Join(", ", purchaseHistory))

2.関数とメソッド

2-1. 関数の再利用性と拡張性

一般的な関数の説明は多くありますが、現実のプロジェクトで重要になるのは「再利用性」と「拡張性」です。

たとえば、業務アプリケーションでは、顧客データの処理や計算を複数箇所で使用することがよくあります。

これを関数でモジュール化しておくことで、変更時に一箇所の修正で済むようになります。

例: 複数の通貨を処理する関数

国際的な取引を扱うアプリケーションでは、異なる通貨間での変換や計算が必要です。

このような場合、関数を作成して、通貨の変換を自動化し、どの国のユーザーでも対応できるようにします。

Function ConvertCurrency(amount As Decimal, fromCurrency As String, toCurrency As String) As Decimal
    ' 為替レートを取得(仮定)
    Dim conversionRate As Decimal = GetExchangeRate(fromCurrency, toCurrency)
    Return amount * conversionRate
End Function

' 為替レートを取得する関数
Function GetExchangeRate(fromCurrency As String, toCurrency As String) As Decimal
    ' 実際にはAPIを使用して為替レートを取得する処理を実装
    ' 簡易例として固定のレートを返す
    If fromCurrency = "USD" And toCurrency = "JPY" Then
        Return 110.0
    ElseIf fromCurrency = "JPY" And toCurrency = "USD" Then
        Return 0.0091
    Else
        Return 1.0 ' 同じ通貨の場合
    End If
End Function

この関数を利用することで、通貨の処理を一元化し、新しい通貨が追加された場合でも簡単に拡張が可能です。また、API連携に対応する場合は、GetExchangeRate 関数内に外部APIの呼び出しを実装することができます。

2-2. 高度な引数の扱い(オプション引数や引数の型チェック)

業務システムでは、多様な入力に対応するために、引数を柔軟に扱う必要があります。

オプション引数や引数の型チェックを利用することで、エラーを未然に防ぎ、使い勝手の良い関数を設計します。

例: オプション引数を利用した注文処理

Function ProcessOrder(orderID As Integer, Optional customerID As Integer = 0, Optional discount As Decimal = 0.0) As Boolean
    ' 注文処理のロジック
    If customerID > 0 Then
        ' 顧客IDが指定されている場合の処理
        Console.WriteLine("顧客ID: " & customerID & " の注文を処理中")
    End If

    If discount > 0 Then
        ' 割引が適用される場合の処理
        Console.WriteLine("割引: " & discount & "% が適用されました")
    End If

    ' 注文処理が成功したと仮定
    Return True
End Function

このように、複数のケースに対応するためにオプション引数を使い、必要に応じて処理を分岐させることができます。これにより、関数の柔軟性が高まり、さまざまな状況で再利用できます。

2-3. 関数のテストとデバッグの効率化

実務では、関数が正しく動作しているかどうかを効率的にテストする必要があります。

特に、複雑なロジックを含む関数の場合、ユニットテストやデバッグは重要です。

例: ログを活用したデバッグ

Function CalculateTotal(orderAmounts As List(Of Decimal)) As Decimal
    Dim total As Decimal = 0

    For Each amount In orderAmounts
        total += amount
        ' ログ出力
        Debug.WriteLine("現在の合計: " & total)
    Next

    ' 最終的な合計を返す
    Return total
End Function

このように、Debug.WriteLine を使って関数の内部状態を確認しながらデバッグすることで、エラーの原因を特定しやすくなります。

また、複数のテストケースを事前に用意して、関数が期待通りに動作するかどうかを確認します。

3.オブジェクト指向プログラミング(クラスとオブジェクト)

3-1. 実際の業務に役立つOOP設計

オブジェクト指向は、単にクラスやオブジェクトを作成するだけでなく、ソフトウェア開発の現場で「保守性」や「拡張性」を高めるための重要なアプローチです。

ここでは、特定の業務シナリオを基に、OOPの考え方を実際にどう活かすかを掘り下げます。

ケース: 複数の業務プロセスを管理するシステム

企業で顧客管理システムを構築するとき、顧客や注文、支払いなどのデータが増えてくると、それぞれのデータをどのように管理するかが重要になります。

これをうまく設計するために、OOPの抽象化継承を活用します。

例: 抽象クラスとインターフェースの活用

顧客や従業員、サプライヤーといった「人」を扱うクラスがあるとします。

これらは共通の特性を持つため、抽象クラス Person から継承させ、共通のプロパティやメソッドを統一して管理します。

Public MustInherit Class Person
    Public Property Name As String
    Public Property Email As String

    ' コンストラクタ
    Public Sub New(name As String, email As String)
        Me.Name = name
        Me.Email = email
    End Sub

    ' 共通メソッド
    Public MustOverride Sub DisplayInfo()
End Class

Public Class Customer
    Inherits Person
    Public Property CustomerID As Integer

    ' コンストラクタ
    Public Sub New(name As String, email As String, customerID As Integer)
        MyBase.New(name, email)
        Me.CustomerID = customerID
    End Sub

    ' オーバーライドメソッド
    Public Overrides Sub DisplayInfo()
        Console.WriteLine("顧客: " & Name & ", Email: " & Email & ", 顧客ID: " & CustomerID)
    End Sub
End Class

このように、抽象クラスを使って共通の構造を持たせることで、コードの再利用性を高めます。

新たにEmployeeやSupplierクラスを追加したい場合も、基本的な構造が統一されているため、柔軟に拡張が可能です。

3-2. SOLID原則に基づく設計

実務でのOOP活用には、SOLID原則が重要な指針となります。

これらの原則に従うことで、システムの設計を強化し、将来的な変更にも耐えうる拡張性を持たせることができます。

単一責任の原則 (Single Responsibility Principle, SRP) に従い、クラスは一つの責任だけを持つように設計します。

複数の役割を持たせてしまうと、変更が必要な場合にコード全体が影響を受ける可能性があります。

Public Class OrderProcessor
    ' 注文処理に関する責任のみを持つクラス
    Public Sub ProcessOrder(orderID As Integer)
        ' 注文処理のロジック
        Console.WriteLine("注文を処理しました: " & orderID)
    End Sub
End Class

Public Class InvoiceGenerator
    ' 請求書の生成に関する責任のみを持つクラス
    Public Sub GenerateInvoice(orderID As Integer)
        ' 請求書生成のロジック
        Console.WriteLine("請求書を生成しました: " & orderID)
    End Sub
End Class

3-3. 実務で役立つ設計パターンの応用

OOPを活用した設計でよく使われるのが、デザインパターンです。

たとえば、業務システムでは頻繁に使用されるデザインパターンとして、FactoryパターンSingletonパターンがあります。

これらを活用することで、特定の処理を簡潔かつ安全に実装できます。

Factoryパターンの例:

Factoryパターンは、オブジェクトの生成をクラスに隠蔽し、柔軟にインスタンスを生成するための手法です。

たとえば、異なるタイプのデータベース接続を管理する場合に、Factoryパターンを用いることで簡潔に実装できます。

Public Interface IDatabaseConnection
    Sub Connect()
End Interface

Public Class SqlConnection
    Implements IDatabaseConnection
    Public Sub Connect() Implements IDatabaseConnection.Connect
        Console.WriteLine("SQLデータベースに接続しました")
    End Sub
End Class

Public Class OracleConnection
    Implements IDatabaseConnection
    Public Sub Connect() Implements IDatabaseConnection.Connect
        Console.WriteLine("Oracleデータベースに接続しました")
    End Sub
End Class

Public Class DatabaseFactory
    Public Shared Function CreateConnection(dbType As String) As IDatabaseConnection
        Select Case dbType
            Case "SQL"
                Return New SqlConnection()
            Case "Oracle"
                Return New OracleConnection()
            Case Else
                Throw New ArgumentException("無効なデータベースタイプです")
        End Select
    End Function
End Class

このパターンを使うことで、新しいデータベースタイプを追加する場合も簡単に拡張が可能です。

実際のシステムでは、このようなデザインパターンを適切に使用することで、コードの柔軟性と保守性を高めることができます。

まとめ

今回の講座では、Visual Basicの基礎的な概念に加えて、実務で役立つより高度な技術に焦点を当て、単にコードを書くことではなく、将来的な拡張や保守を見据えた設計、そして効率的なコードの再利用性を意識した関数やメソッドの活用方法を紹介しました。

これらの内容を通じて、皆様には単なるVBの知識を超え、現実のプロジェクトで役立つ設計やコードの最適化を考える力を身につけてもらえると嬉しいです。

SHARE
採用バナー