西脇.rb&神戸.rbでテスト駆動開発とオブジェクト指向プログラミングを学んできた
はじめに
こんにちは。
今回は先々週の土曜日、西脇.rb&神戸.rbの勉強会「手を動かして学ぼう!テスト駆動開発&オブジェクト指向プログラミング」に参加してきたのでその参加レポートを書きたいと思います。
当日の内容
- 問題発表(当日の問題はこちら)
- グループに分かれて回答を実装
- グループ毎の代表者のコードを全体でレビュー
参加してみた感想と勉強になったところ
テスト駆動開発は実装の粒度を小さくして作る
テスト駆動開発に関しては本やブログなどで読んで多少知っていたつもりでいました。
しかし、自分は最初テストケースを全て書いてから実装しようとしていて、そのことに関してAkiさんから注意を受けました。
確かにテストケースを全て書いてから実装していては実装途中で誤って機能を壊してしまっても何が原因かわからないですよね。
それではテスト駆動開発をしている意味がなくなってしまいます。
今回学んだテスト駆動開発の流れは下記の通りです。
- テストケースを1つ書いてテストを実行し、失敗または成功するのを確認する。
- 成功したら次のテストケースを書き、失敗したらまだ実装されていないということなので機能を実装する。
- 実装が完了したらテストをもう一度動かしてみて機能が仕様通り実装されているかどうかということと実装したことにより機能が壊れていないかということをたしかめる。
プログラミングは実際に手を動かす&コードレビューしてもらわないと身につかない
プログラミングは実際に手を動かさないと身につかないということを改めて実感しました。
例えばattr_readerとインスタンス変数の関係。
最初、fareが読み取り専用の場合インスタンス変数にどうやって値を入れるかど忘れしてしまっていきなりハマってしまいました。
正しい書き方は下記のとおり。
class Ticket attr_reader :fare def initialize(fare) @fare = fare end end
attr_readerはクラスの外部からのアクセスを読み取り専用にするのであってクラス内部の場合は単純にインスタンス変数に値を入れればいいだけの話でした。
あとはクラス変数と定数。
最初はJavaのstaticのようにクラス定数にしようとして下記のような書き方をしようとしていました。
class Ticket @@FARES = [150, 180, 210].freeze end Ticket.FARES[0]
しかしRubyではクラス名.定数名という参照の仕方はできません。
またRubyではクラス定数という概念はなく、1文字目が何であるかでローカル変数、インスタンス変数、クラス変数、グローバル変数、定数のいずれかであると認識されます。
https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html
そのため@@変数名という書き方をするとクラス変数として認識されてしまいます。
正しくは下記のように書きます。
class Ticket FARES = [150, 180, 210].freeze end Ticket::FARES[0]
また、コードレビューに関しては今回は同じグループだったしなじゅんさんにお願いしてレビューイ(レビューを受ける人)を譲っていただきました。(しなじゅんさん、ありがとうございました)
コードレビューでも下記のような色々な知見を得ることができました。
- 配列やハッシュの名前は複数形にする
- Rubyのメソッドは必ず戻り値を返すので戻り値としてtrueやfalseを返す場合はreturn trueと書かず式を1行書くだけでいい
- RSpecでテストケースを日本語で書く場合はexampleの方がしっくり来る
今回の勉強会でプログラミングを素早く身につけるためには自分で試行錯誤しながら実装し、実装後にコードをレビューしてもらうのが一番だと改めて感じました。
勉強会後にしなじゅんさんから大阪でアクティブなruby勉強会の話を聞くことができたので、今後はそちらにも参加して自分のコードをレビューしてもらう機会をどんどん増やしていこうと思います。
yuyaさんのプログラミングに対するこだわりが凄かった
yuyaさんがプログラミングに対する並々ならぬこだわりを持たれていて、凄いなと感じました。
ただ、奥が深すぎて途中から自分の理解が追いつかない部分があった。
いつかyuyaさんみたいにプログラミングに対する深い考えを持てればいいなと思いました。
当日の写真
最後に
ここまでお読みいただきありがとうございました。
何かご意見・ご感想あればコメントもらえるとありがたいです。