TDDで電卓アプリを実装する日記#1
まえおき
今日から本格的に実装開始。ちょっとTinberbornに時間を取られて開始時間が遅くなった。
はじめに
今回は、TDD(テスト駆動開発)で開発することと、オブジェクト指向エクササイズをやってみるということを目的にしてみる。
オブジェクト指向エクササイズはおそらくTDDのリファクタリング時に主に使うことになるだろうから、まずはTDDに目を向けてみた。
TDDの第一歩:ToDoリスト
TDDで重要なのは、どのような振る舞いをさせたいかをテストの形で示すこと、それに対して実装していくこと、のようだ。
まずはWin+R→calcで電卓を触りながら、直近に実装したいことと将来的な目標を書いてみた。
具体的には下記の通り。
# 電卓アプリのToDoリスト
## 優先するToDo
* [ ] 空=0
* [ ] 1=1
* [ ] 53=53
## 後回し
* [ ] 1+2=3
## 最終的な目標
* [ ] 9桁の整数の四則演算を行う
* [ ] ゼロ除算、オーバーフローを検知できるようにする
* [ ] 3++2=→7,11,15...
まずは最初の2つの実装を目標としよう。
はじめてのテスト
最初の2つのテストを通したい場合、適当なクラスを作ってそこに整数型の数値を入れる処理を作りたいところだ。しかし今回はオブジェクト指向エクササイズもテーマとしているので、整数型の数値は直接は入れることができない。入れる数値を「電卓のキー」に見立てて、「式」に「キー」を登録する形にしよう。
テストとして表現するとこんな感じだろうか。(初期テストのソースはこちら)
public class FormulaTest {
private Formula formula;
@Before
public void InitializeFormula() {
formula = new Formula();
}
@Test
public void SimpleFormulatest() {
// 何も入れなければ0を返す
assertEquals(formula.GetResult(), 0);
// 1のキーを式に送信したら1を返す
formula = formula.AddKey(Key.GetFromString("1"));
assertEwuals(formula.GetResult(), 1);
}
}
ちょっと省略して、上記テストが通る形にしたのがこのコミット。
Formula.java
package personal.mickie.education.calc.cpu;
public class Formula {
public Formula() {
inputtedKey = Key.GetFromString("0");
}
private Key inputtedKey;
public Formula AddKey(Key getFromString) {
inputtedKey = getFromString;
return this;
}
public int GetResult() {
return inputtedKey.GetValue();
}
}
Key.Java
package personal.mickie.education.calc.cpu;
public class Key {
public static Key GetFromString(String keyString) {
int keyValue = Integer.valueOf(keyString);
Key result = new Key(keyValue);
return result;
}
private int value = 0;
private Key(int initialValue) {
value = initialValue;
}
public int GetValue() {
// TODO 自動生成されたメソッド・スタブ
return value;
}
}
かなりシンプル。(もちろん3つめのToDoリストは通らないけど。)
テストその2:2桁の数値を作ってみよう
続いて2桁に挑戦しよう。そのまえに、53→53じゃなくて15→15にしよう。そうすればテストがこうなってすっきりする。
@Test
public void SimpleFormulatest() {
// 何も入れなければ0を返す
assertEquals(formula.GetResult(), 0);
// 1のキーを式に送信したら1を返す
formula = formula.AddKey(Key.GetFromString("1"));
assertEquals(formula.GetResult(), 1);
// 追加で5を押したら15になる
formula = formula.AddKey(Key.GetFromString("5"));
assertEquals(formula.GetResult(), 15);
}
どうせだし、後々のことも考えて、ひとつ入力できた――では足りぬ。すべて入力しよう。
ということでFormulaクラス内にリスト…をラップしたクラスをもたせた。
ここらへんで今日の分は終了。作業用のブランチの内容を成果物用のブランチへsquash mergeして、作業用ブランチを成果物用のブランチとマージさせてbranch treeの形を整えて、githubにpushしておく。
(今回は勉強会用の資料も兼ねているので、作業用のブランチもpushしています)
作業結果
今回のToDoリストはこんな感じ。結果を数値ではなく文字で返すのは、API(表示するテキストボックス)がString型に対応しているから。
流石に外部との通信はプリミティブ型にしておく。
次は四則演算の実装をするか、桁の制限をつくるか、どっちにしようかな。