継ぎ接ぎのコードにサヨナラを。VB.NETで実現する「変更に強い」設計の極意
こんにちは。現場で長年、複雑怪奇なスパゲッティコードと戦い、それを保守性の高い堅牢なシステムへと昇華させてきたアーキテクトです。
VB.NETを触り始めたばかりの頃、多くの人が「とにかく動くもの」を作ろうとします。しかし、業務システムにおいて「動く」ことは最低条件に過ぎません。真に価値があるのは、「3年後の仕様変更でも、たった数行の修正で対応できるコード」です。
今回は、その土台となる「インターフェイス」と「抽象クラス」という強力な武器について、現場の知見を交えて解説します。これらを使いこなせれば、あなたは「ただのコーダー」から「設計者」へと進化できます。
—
1. なぜ「設計」が必要なのか?(脱・マクロ思考)
Excel VBAの「マクロの記録」から脱却できない人のコードは、処理とデータが密接に絡み合い、どこを直しても別の場所が壊れる「結合地獄」に陥りがちです。
これを解決するのが「疎結合(コンポーネント同士を直接繋がない)」という考え方です。
VB.NETの「インターフェイス」と「抽象クラス」は、まさにこの疎結合を実現するための「契約書」や「設計図」なのです。
—
2. インターフェイス(Interface) :「何をやるか」の契約書
インターフェイスは、「これを持つクラスは、必ずこのメソッドを実装しなければならない」という約束事です。中身の実装は一切書きません。
コード例:請求処理のインターフェイス
‘ どんな請求書クラスも、この「IInvoice」という契約に従う必要がある
Public Interface IInvoice
‘ 請求書を発行する能力を強制する
Sub Issue()
End Interface
これを使うことで、メインの処理側は「それが何というクラスか」を気にせず、「Issueメソッドが使える」ことだけを信頼して処理を進められます。これが疎結合の第一歩です。
—
3. 抽象クラス(MustInherit) :「共通の骨格」を作る
抽象クラスは、「共通部分は作り込んでおいて、詳細な処理は継承先(子クラス)に任せる」という手法です。インターフェイスと違い、一部の処理(メソッドやプロパティ)を自分で実装できます。
コード例:共通のログ機能を備えた抽象クラス
‘ MustInheritをつけると、このクラス単体ではインスタンス化できない
Public MustInherit Class DataProcessor
‘ 共通のログ出力機能(すべての処理で同じ動きをする)
Public Sub Log(message As String)
Console.WriteLine($”[LOG]: {message}”)
End Sub
‘ 具体的な処理内容は子クラスで決めてもらう(MustOverride)
Public MustOverride Sub Execute()
End Class
—
4. 現場で「インターフェイス」と「抽象クラス」を使い分ける判断基準
初心者がよく迷うのが「どちらを使うべきか」という点です。私の現場での判断基準を教えましょう。
- インターフェイスを使うべき時:
- 全く異なる動作をするクラス同士に、共通の操作を与えたい時。
- 「プラグイン」のように、機能単位で差し替えたい時。
- 抽象クラスを使うべき時:
- 「ほとんど同じ」処理だが、一部だけカスタマイズしたい時。
- 継承関係が明確で、コードの重複を避けたい時。
—
5. 実践:保守性の高い基盤コード
これらを組み合わせると、驚くほど美しいコードが書けます。
‘ 1. インターフェイス定義
Public Interface IReport
Sub Print()
End Interface
‘ 2. 抽象クラスで共通の型と処理を定義
Public MustInherit Class BaseReport
Implements IReport
Public Sub Print() Implements IReport.Print
‘ 共通のヘッダー処理
Console.WriteLine(“— レポート開始 —“)
‘ 個別の処理を呼び出す
PrintBody()
‘ 共通のフッター処理
Console.WriteLine(“— レポート終了 —“)
End Sub
‘ 子クラスで実装すべき具体的な内容
Protected MustOverride Sub PrintBody()
End Class
‘ 3. 具体的な実装クラス
Public Class SalesReport : Inherits BaseReport
Protected Overrides Sub PrintBody()
Console.WriteLine(“売上データを印刷します。”)
End Sub
End Class
なぜこれが「最強」なのか?
もし将来「PDF出力」や「メール送信」が必要になっても、`BaseReport`を継承して`PrintBody`の中身を変えるだけで済みます。既存のメイン処理を一行も書き換える必要がないのです。これが「変更に強い設計」の正体です。
—
最後に:コードは「読み手」のために書く
VB.NETは初心者にも優しい言語ですが、それゆえに「誰が読んでも理解できるコード」を書く責任が伴います。インターフェイスや抽象クラスを使うことは、未来の自分やチームメンバーへの「ラブレター」です。
「ここをクリアすれば、VB.NETの基本はバッチリですよ」。
まずは小さなクラスからで構いません。`Interface`キーワードを一行、コードに書き込んでみてください。そこから、あなたのエンジニアとしての景色が一変するはずです。
何か分からないことや、「もっと現場のリアルな設計論が聞きたい!」ということがあれば、いつでも聞いてくださいね。応援しています。
