プログラミングの基本原則:段階的な実装とテスト駆動開発
はじめに
プログラム開発において最も重要なのは、1行変更したらテストを行うという原則です。本記事では、VBAでExcelに九九表を作成する例を通じて、実践的なプログラミング手法を解説します。
プログラミングの4つの基本要素
そもそもプログラムは、以下の4つの要素ができれば、すべてのプログラムを作成することができます。
- 変数定義
- forループ
- if文
- 部分プログラム(関数・サブルーチン)
実装の進め方
1. 完成系をイメージする
まず、実装したいプログラムの完成系をイメージします。
今回の例では、Excelに九九表をVBAで作成することを目標とします。
2. 実装の段階を考える
九九表を作成する段階を以下のように分解します。
段階1: 最小単位のテスト
1つ目のセルに数値を入れるプログラムを作成し、想定通りの値が入るかテスト
段階2: 1行の実装
1行目に「1の段」を打ち込めるプログラムを作成してテスト
段階3: 全体の実装
1行目から9行目までに1から9の段を打ち込めるプログラムを作成してテスト
3. ループは最後の手段
ここまでで重要なのは、ループは使用しないということです。
' 最初はこのように直接記述する
Cells(1, 1) = 1
Cells(1, 2) = 2
Cells(1, 3) = 3
ループを使うのは、あまりにも大変すぎて、これはループにしないとやってられないとなってからです。
ループを避けるべき理由
そもそもループで入れ子などにした瞬間に可読性が著しく低下します。
例えば以下の問いに即答できますか?
「計算を2回されるループが6回あって、このループをさらに10回やったときに合計で何回計算されるのか?」
これが具体的にわからないのであれば、最初はループを使用しないほうが良いでしょう。
10重の入れ子を一瞬で把握できるなら別ですが、そうでなければ段階的に実装すべきです。
実務を意識した設計
仕様変更への対応
これは仕事だということを忘れてはいけません。完成したプログラムを提出すると、以下のような追加依頼が来るでしょう。
- 「セルの3番目からスタートさせたい」
- 「13の段まで作成してほしい」
依頼主は完成したものを見てから、追加の機能が欲しくなることが多いからです。
変数の適切な命名
その時のために、役割の違う変数は別の変数名で定義したほうが良いです。
' 悪い例: 行と列をそのまま計算に使う
Cells(row, col) = row * col
' 良い例: 役割を明確に分ける
Dim startRow As Integer
Dim startCol As Integer
Dim multiplier As Integer
Dim multiplicand As Integer
Dim result As Integer
result = multiplier * multiplicand
Cells(startRow, startCol) = result
九九のプログラムだと、行と列でこの行と列に入れる数値で掛け算するようなプログラムになってしまうのではないでしょうか。
九九で計算されて算出される解は、解として変数定義する必要があります。
関数化の重要性
ループを関数で置き換える
関数を定義することで、ループを使用しなくても関数の引数に数値を入れることでループを1回も使用しなくてもいいように関数を作成するべきです。
' 関数化の例
Sub CreateKukuTable(startRow As Integer, startCol As Integer)
' 九九表作成のロジック
End Sub
依頼主の視点を意識する
依頼主は、関数1つを呼び出すだけで九九が作成されてほしいだけであり、中身は修正するとき以外は興味ありません。
なんなら修正するのは自分の仕事になるでしょう。
' わかりやすい関数名の例
Sub kuku_create()
' 実装
End Sub
' さらに良い例: 開始位置を指定できる
Sub kuku_create(startRow As Integer, startCol As Integer)
' 実装
End Sub
依頼主が分かるような関数名にしておくべきです。
まとめ
- 1行変更したらテストを行う
- ループは最後の手段として使う
- 役割の違う変数は別の変数名で定義する
- 関数化して再利用性と可読性を高める
- 仕様変更を見越した設計をする
これらの原則を守ることで、保守性が高く、拡張しやすいプログラムを作成できます。