Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第01章 仮実装 #5

Merged
merged 18 commits into from
Nov 2, 2017
Merged

第01章 仮実装 #5

merged 18 commits into from
Nov 2, 2017

Conversation

at-grandpa
Copy link
Owner

  • どのようなテストを書けば、自信をもってコードが完成したと言えるか

TODO

  • $5 + 10 CHF = $10(レートが2:1に場合)
  • $5 * 2 = $10
  • TODOリスト良いよ
  • やることを太字にする
  • 終わったら打ち消し線で消す
  • テストを思いついたら追加していく
  • 「どんなオブジェクトが必要かな」ではなく「テストから始める!」
    • ひっかけだなぁ
  • TODOを見ると、足し算は複雑だ。もっと小さく始めたい。
  • 掛け算はいけそうだよね
  • 完璧なインターフェースを想像する
  • 理想的なAPIから始めて、逆向きに作業していく

@at-grandpa at-grandpa mentioned this pull request Oct 22, 2017
2 tasks
@at-grandpa
Copy link
Owner Author

at-grandpa commented Oct 22, 2017

  • 副作用あり
  • 金額なのにint
  • 大事なのは小さいステップを踏むこと
  • 全く動かないテスト。コンパイルすら通らない。
  • 早くグリーンにしたい

TODO

  • $5 + 10 CHF = $10(レートが2:1に場合)
  • $5 * 2 = $10
  • amountをprivateにする
  • Dollarの副作用はどうする?
  • Moneyの丸め処理はどうする?

@at-grandpa
Copy link
Owner Author

  • コンパイルエラーを起こしてみる
javac MoneyTest.java                                                                                                                       989ms  月 10/23 05:19:08 2017
MoneyTest.java:3: エラー: パッケージorg.junit.jupiter.apiは存在しません
import org.junit.jupiter.api.Test;
                            ^
MoneyTest.java:4: エラー: パッケージorg.junit.jupiter.apiは存在しません
import static org.junit.jupiter.api.Assertions.*;
                                   ^
MoneyTest.java:10: エラー: シンボルを見つけられません
    @Test
     ^
  シンボル:   クラス Test
  場所: クラス MoneyTest
MoneyTest.java:12: エラー: シンボルを見つけられません
        Dollar five = new Dollar(5);
        ^
  シンボル:   クラス Dollar
  場所: クラス MoneyTest
MoneyTest.java:12: エラー: シンボルを見つけられません
        Dollar five = new Dollar(5);
                          ^
  シンボル:   クラス Dollar
  場所: クラス MoneyTest
エラー5個
  • ちょっと本と違うな
  • 一個ずつ見ていくか
  • パッケージorg.junit.jupiter.apiは存在しません
    • junit5を入れたい
    • vscodeから使いたい

@at-grandpa
Copy link
Owner Author

at-grandpa commented Oct 22, 2017

@at-grandpa
Copy link
Owner Author

  • Dollar クラスが無い
  • コンストラクタが無い
  • times メソッドが無い
  • amount フィールドが無い

@at-grandpa
Copy link
Owner Author

at-grandpa commented Oct 27, 2017

javaの開発環境構築から

  • プロジェクトはvscodeのExtensionからできるか確認
  • jarは ここ にある
  • jarはclasspathの通っているところに置けばok?

@at-grandpa
Copy link
Owner Author

at-grandpa commented Oct 30, 2017

@at-grandpa
Copy link
Owner Author

自分のtwitterより引用。

https://twitter.com/at_grandpa/status/925577111703764992

テスト駆動開発、写経をしようとjava環境作るところで詰まり、twadaさんに相談したら「多言語でやるのもお薦め」とのことで、「確かに自分がやりたいのはテスト駆動開発の勉強であり、javaの勉強ではないな」と気付き、crystalで書くことにしたのでどんどん進めていくぞ!

ということで、crystalに移行する。

@at-grandpa
Copy link
Owner Author

at-grandpa commented Nov 2, 2017

改めてやっていく。

  • どのようなテストを書けば、自信をもってコードが完成したと言えるか

TODO

  • $5 + 10 CHF = $10(レートが2:1に場合)
  • $5 * 2 = $10
  • TODOリスト良いよ
  • やることを太字にする
  • 終わったら打ち消し線で消す
  • テストを思いついたら追加していく
  • 「どんなオブジェクトが必要かな」ではなく「テストから始める!」
    • ひっかけだなぁ
  • TODOを見ると、足し算は複雑だ。もっと小さく始めたい。
  • 掛け算はいけそうだよね
  • 完璧なインターフェースを想像する
  • 理想的なAPIから始めて、逆向きに作業していく

@at-grandpa
Copy link
Owner Author

at-grandpa commented Nov 2, 2017

エラーで落ちる。

> Executing task: sh -c 'cd /home/hoge/src/github-at-grandpa/at-grandpa/study-tdd/chapter01 && crystal spec' <

Error in line 1: while requiring "./spec/chapter01/money_spec.cr"

in spec/chapter01/money_spec.cr:3: undefined constant Chapter01::Money

describe Chapter01::Money do
         ^~~~~~~~~~~~~~~~

TODO

  • $5 + 10 CHF = $10(レートが2:1に場合)
  • $5 * 2 = $10
  • amountをprivateにする
  • Dollarの副作用どうする?
  • Moneyの丸め処理をどうする?

@at-grandpa
Copy link
Owner Author

4つのコンパイルエラー。(crystalの場合は一つずつしか見えないが。)

  • Dollarクラスがない
  • コンストラクタがない
  • timesメソッドがない
  • amountフィールドがない

@at-grandpa
Copy link
Owner Author

コンパイルエラーを解除した

crystal spec' <

F

Failures:

  1) Money multiplication $5 * 2 = 10 になること
     Failure/Error: five.amount.should eq 10

       Expected: 10
            got: 5

     # spec/money_spec.cr:8

Finished in 918 microseconds
1 examples, 1 failures, 0 errors, 0 pending

Failed examples:

crystal spec spec/money_spec.cr:5 # Money multiplication $5 * 2 = 10 になること

@at-grandpa
Copy link
Owner Author

エラーを解除し、すこし前に進んだ。良いことだ。

@at-grandpa
Copy link
Owner Author

読者の皆さんは、これからご覧いただくようなやり方は好きではないかもしれ ない。

わかる!多分好きじゃないと思う。

目標は完璧な解を出すことではなく、テストを通すこと

なるほど

@at-grandpa
Copy link
Owner Author

Greenにした。initializeで何もしていないのではなく、propertyに代入もしていたので、それをなくした。

@at-grandpa
Copy link
Owner Author

Greenになった。

@at-grandpa
Copy link
Owner Author

ここで思うこと。

  • なんか冗長な気がする
  • 「わかりきったことをやっている」感
  • こういう気持ちだから、いろいろすっ飛ばしてしまうんだろうな
  • これだけ細かくやることがなぜ良いのか、がまだ理解できていない

@at-grandpa
Copy link
Owner Author

at-grandpa commented Nov 2, 2017

まだサイクルは一周していない。

  1. 小さいテストを1つ書く
  2. 全てのテストを実行し、ひとつ失敗することを確認する
  3. 小さい変更を行う
  4. 再びテストを実行し、全て成功することを確認する
  5. リファクタリングを行い、重複を排除する

「重複」ってなんだ。

@at-grandpa
Copy link
Owner Author

コラム

  • テストに行く前に重複を除去することによって、たった 1 つの変更だけで次 のテストを通せるようになる確率を最大化しているのだ。

@at-grandpa
Copy link
Owner Author

「重複」ってなんだ。

今回の重複は、テストコードとプロダクトコードの中にある。105*2にするとわかりやすい。これを排除したい。

一気にはできないので、少しずつ進める。

@at-grandpa
Copy link
Owner Author

まだグリーン。

細かいなぁ。

細かいステップを踏むことが大事なのではなく、細かいステップを踏み続けられるようになること。

なるほど。

@at-grandpa
Copy link
Owner Author

at-grandpa commented Nov 2, 2017

普段のわかりきった実装では、ここまで細かくしなくてもよい。しかし、問題が複雑な場合は細くステップを踏んで欲しい。「細かくステップを踏む」という技を身につける。ステップが小さすぎるところまで来たら、それが適切な粒度だ。

@at-grandpa
Copy link
Owner Author

あー重複ってそういうことか。

  • 5がテストコードにもプロダクトコードにもあった
  • 5を何か他の変数に置き換えられないか探る
  • @amountである

@at-grandpa
Copy link
Owner Author

at-grandpa commented Nov 2, 2017

TODO

  • $5 + 10 CHF = $10(レートが2:1に場合)
  • $5 * 2 = $10
  • amountをprivateにする
  • Dollarの副作用どうする?
  • Moneyの丸め処理をどうする?

@at-grandpa
Copy link
Owner Author

一つ目のTODOをチェックできた。

何をしたか。

  • 書くべきテストのリストを作った
  • どうなったら嬉しいかを小さいテストコードで表現した
  • Junitの詳細は後回しにした
  • 空実装を使ってコンパイラを通した
  • 大罪を犯しながらテストを通した
  • 動くコードをだんだんと共通化し、べた書きの値を変数に置き換えた
  • TODOリストに項目を追加するに留め、一度に多くのものを相手にすることを避けた

なるほど~。確かにそうしていた。

@at-grandpa
Copy link
Owner Author

これにて1章は終了。

@at-grandpa at-grandpa merged commit 026dcee into master Nov 2, 2017
@at-grandpa at-grandpa changed the title 第1章 仮実装 第01章 仮実装 Nov 2, 2017
@at-grandpa at-grandpa changed the title 第01章 仮実装 第01章 仮実装 Nov 2, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants