Refactoring
Refactoringって聞いたことあります? いくつかの面白い記事がありますが,
- <./RefactoringRuby_CodeSmell.pdf>
- <./HeadFirst_SoftwareDevelop_Appenndix1.pdf>
一文でまとめると,
振る舞いを変えることなく,中身をかえること
です.
これ以降は先ほどのFowlerのRefactoring in Rubyに従ってrefactoringをして行きます.まず,理解して欲しいことは次の3点です.
- codeは動けばいい,
- どれほどかっこいいcodeでもやっている中身は同じ,
- でもcodeがかっこいいと後で読みやすい
です.一度書いたコードで二度と読まないのって,現場のコードではあり得ません.さらにみんなにreviewされることになります.それがあなた自身の評価になるだけではなく,何週間か後で,もう一度codeを使いまわししようとした時の,ベースになるのですが,その時に
「誰や?こんなxxみたいなコード書いたんは?!」
ってなります.
「お前や」
ってわかっているのですが.読み直せないコードはすぐにrefactoringして隠蔽しましょう.
ここで活躍するのが,今まで,強調してきた,
- emacs の編集機能
- test first
です.
sample codes
これからしばらくは
- <../refactoring/Refactoring2-1.pdf>
- <../refactoring/Refactoring2-2.pdf>
- <../refactoring/Refactoring2-3.pdf>
を読み進めて行きます.
grad_lecture_2018のdirectoryにいるとして作業を記述します.まずはサンプルコードのコピーです.
$ mkdir ./members/MY_DIRECTORY/refactoring
$ cp -r ./docs/refactoring/refactoring_codes/ members/daddygonogon/refactoring/
として自分のdirectoryにcopyしてください.
tree -L 2
.
├── lib
│ ├── customer.rb
│ ├── movie.rb
│ └── rental.rb
├── movie_spec.rb
├── revised_libs
│ ├── lib_28
... 中略 ...
│ ├── lib_69
│ ├── lib_71
│ └── lib_final
├── spec
│ ├── customer_spec.rb
│ ├── movie_spec.rb
│ ├── rental_spec.rb
│ ├── spec_helper.rb
│ └── statement.html
└── spec_final
├── customer_spec.rb
├── movie_spec.rb
├── rental_spec.rb
├── spec_helper.rb
└── statement.html
となっています.
test
「テストを書くべし」という指示がありますが,どう書いていいか全然わからないでしょう.テストは用意しています.
refactoring directoryで
rspec spec/init_spec
としてみてください.greenになってますでしょう?ダメな時は,
sudo gem install rspec
しましょう.
. rspec spec
Customer
should hold customer name
Rental Record for bob
Gundom 3.5
Eva 12
Totoro 4.5
Star Wars 8.0
Amount owed is 28.0
You earned 5 frequent renter points
should print statement with correct amounts
should print html_statement (PENDING: after added html_statement, this :skip should change false)
Movie
should hold on the title
should return the correct price_code
Rental
should hold on the movie
should hold on the rented movie title
should hold on the days rented
Pending: (Failures listed here are expected and do not affect your suite's status)
1) Customer should print html_statement
# after added html_statement, this :skip should change false
# ./spec/customer_spec.rb:39
Finished in 0.0035 seconds (files took 0.12459 seconds to load)
8 examples, 0 failures, 1 pending
p
綺麗な出力を得るために,
> cat .rspec
--format documentation
--color
でcolorとdocumentationを指定しています.specの中身をみて,どんな振る舞いを期待しているかを理解してください.
refactoring
これ以降は,libにある
├── lib
│ ├── customer.rb
│ ├── movie.rb
│ └── rental.rb
を修正していきます.
作業手順は,
- rspec specで動作を確認
- テキストの左右見開きに従って書き換え
この作業の繰り返しです.
- テキストをじっくり読んで,
- でも理解できなくて,
- で,編集してみて,
- 動きを理解する.
- 書いてある意味を理解する
という繰り返しです.
参考になる資料を見ながら,少しづつ修正していってください.lib_revisedにpage数を振って,修正後のサンプルをおいています.少し,違うところもあるので注意してください.気がついたらpull requestで投げてくれると嬉しいです.
とっかかりのURL図は,
- <../refactoring/HeadFirst_SoftwareDevelop_Appenndix1.pdf>
で理解できるでしょう.
これをgithubにあげて,自動的にチェックするのを誰か作ってくれへんかな...卒論になるんやけど...
refactoring注意事項
いくつか記述が曖昧なところがありますので,codesを参照してください.
- 少し違う記法
- p.43 class Rentalの中のMovie.NEW_RELEASE -> Movie::NEW_RELEASE
- 今まで気づかなかったバグ
- CHILDREN -> CHILDRENS
- each(in Customer::statement) -> element p.38以降すべて
- テキスト修正
- p.54 html_statement用にspec/statement_spec.rbを書き換え
- p.54のresultの"\t"は削除
- specではfileとの比較を例示
- p.65 : -> ;
- p.71 DefaultPrice -> Price
- p.73 attr_writer -> attr_accessor
- spec 修正
- polymorphismの導入に伴いspecを大幅に書き換える
- spec/final_specのspecs記述.~rspec spec/final_spec~ とする.
- 最後の書き換えはすごい大幅なんで,lib/movie.rbを参照
- final_spec/movie_spec.rbもだいぶ書き換えているので参照
- specではbe_aというのを例示
- source ~/Desktop/lecture_22f/multi_scale_22_text/d7_9_refactoring_tsutaya/README.org