スキップしてメイン コンテンツに移動

「Let's Play TDD #3: Cleaning Up My Mess」の写経

写経すると良いって聞いて...

写経の対象

Let's Play TDD #3: Cleaning Up My Mess - YouTube
http://www.youtube.com/watch?v=jnMMkXzpOS4

最初のコード

  • 前回のコードからクラス名にYearを付けるなどのリネーム
  • SavingAccountYearのコンストラクタに預金と年利を与え、終了残高を求めるテスト:endingBalance()
    • 10000ドル預金して年利10%で残高11000ドルを確認する
    • SavingAccountYearへEclipseのコード補完で追加
      • 引数を渡せるコンストラクタ
      • 終了残高を返すメソッド
      • 追加したものに中身は記述しない

RED

中身の実装

  • SavingAccountYear
    • コンストラクタ
      • 引数をフィールドへ渡す
    • endingBalance()
      • 終了残高を求める

GREEN

最初のテストを削除1

  • depositAndWithdrawal()を削除してとりあえずテスト

GREEN

最初のテストを削除2

  • _negativeBalanceIsJustFine()も削除

翌年の開始残高が今年の終了残高と同じであること

  • _SavingsAccountYearTest
    • nextYear()を書き換え
      • SavingAccountYearはnextYear()で年利を設定していたが、コンストラクタで渡すようになったのでこのメソッドの引数を削除
      • テストのメソッド名を変更→ nextYearsStartingBalanceShouldEqualThisYearEndingBalance()
  • SavingAccountYear
    • 開始残高を受け取るstartingBalance()を追加

RED

先ほどのテストを無視するアノテーションを付ける

  • 最初に開始残高メソッドをTDDで実装するため


GREEN

開始残高メソッドのテスト

  • startingBalance()の中身がある前提で_SavingsAccountYearTestにテストを記述
    • コンストラクタに渡した残高がそのまま返ってくること

RED

開始残高メソッドの中身を実装

  • テストが通るよう中身を実装
    • コンストラクタで保持した値を受け取るだけ

GREEN

ちょっと整理

  • フィールドbalanceをリネーム→startingBalance
  • メソッドstartingBalance()をソースの上の方へ

GREEN

無視するアノテーションを削除

  • @Ignoreを削除するとテストが通る

GREEN

翌年は今年の終了残高でインスタンスを求める

  • 翌年の開始残高は今年の終了残高が同じであることが確認できたので
  • 翌年のインスタンスは終了残高を渡してインスタンスを生成するよう修正
    • 計算式を試行錯誤してnextYear()を実装していたが...

GREEN

翌年と今年の年利は同じであること

  • インスタンス生成に伴い、(おそらく)年利が引き継がれていることを確認

RED

年利が引き継がれてなかったので修正


GREEN

おわり

前回までは、ざっくりやりたい事を元にをテスト駆動開発していたような印象で、タイトルのように今回は不要なものは削除して、役割分担してコードが見やすくなった気がします。どこをテストするかは、プログラマーが不安に思うところと言われますが、特に不安に思っていないので、ちょっとピンと来なていない部分もあります(まだ途中ってのもあると思いますが)。

そろそろ何言ってるほとんど聞き取れない状態での写経がきつくなり、リスニングできるようにとフルハウス〈ファースト〉セット1 [DVD]を買いました。英語音声と英語字幕にして、単語などを調べつつ視聴してるところです。

Gist

PR

コメント

このブログの人気の投稿

GolangでWindows GUIアプリケーション

GUIアプリ作成の前提 社内ツールとしてexeで配布 開発環境はGoLandを使う 社内ツールとしてexeを配布ということであれば、Visual StudioでC#による開発だと思います。しかしながら、Go言語を習得したいのと、GoLandの補完機能が便利で、Android Studio使っていたこともあり、とっつきやすいという点からGo縛りでGUIアプリケーションを考えたいと思います。 lxn/walk Windows application library kit for Go. Windows向けしか考えていないので、まずこのライブラリなのですが、ボタンやコンボボックスが思ったように並ばなかったり、手軽にイメージボタンを配置したりなど、簡単にレイアウトを変更できない課題に直面しました。レイアウト作成だけで時間を取られてしまいます。そう言えば、Androidアプリ開発のときは、XMLでデザイン部分を切り離してたのを思い出して、今回の調査の運びとなりました。 fyne-io/fyne Cross platform native GUIs designed for Go based on Material Design. Supports: Linux, macOS, Windows, BSD, iOS and Android. walkと比べると、クロスプラットフォームで作成できるのですが、こちらもコードの中にデザインを書いていく形でした。 therecipe/qt therecipe/qt allows you to write Qt applications entirely in Go or JavaScript. Qt Creatorなるものがあるようで、デザイン部分を切り離せる印象はあるものの、最新のPCでもビルドに時間がかかるようで、学習コストもかかるという記事を見かけて断念しました。 どうしたものかとツイートしましたら、下記のようにご助言をいただいた。 同じ課題に対し色々試した結果、PWAのフルキャッシュドに落ち着いた。中身はGo+WASMで。 https://t.co/e60whDTV16 — のぼのぼ📡 (@nobonobo) July 21, 2020 PWA 早速調べてみました。Googleが進めているプロジェクトで、ネイティブアプリのよ

Eclipseで一通り基本的なGitを使ってみる

備忘録的にまとめておきたいと思います。おかしな点があればご指摘いただければ幸いです。 目次 環境 プロジェクト作成~初コミットまで コミットの履歴&差分を見る 元に戻す ブランチについて ブランチを作成してみる ブランチを統合するには マージする Rebaseする ローカルリポジトリからプロジェクトを取り込む コミットしたメッセージの修正 環境 Eclipse IDE for Java Developers:Juno Service Release 1 Git:上記Eclipseのプリインストール版

Javaでprivateなfieldやmethodにアクセスする

JUnitでテストしてると、privateなフィールドにアクセスして、値を参照したりセットしたりしたくなるわけですが、よく使うのでメモしておきます。 例えば、次のような対象のクラスがあるとします。 public class ParentClass { private String hoge = "ParentClass!!"; public void dispMsg() { System.out.println("dispMsg:" + hoge); } private void privateDispMsg(String msg) { System.out.println("dispMsg:" + msg); } }