This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 1 year has passed since last update.

Refactoring Ruby

Last updated at Posted at 2020-12-02

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

を修正していきます.

作業手順は,

  1. rspec specで動作を確認
  2. テキストの左右見開きに従って書き換え

この作業の繰り返しです.

  1. テキストをじっくり読んで,
  2. でも理解できなくて,
  3. で,編集してみて,
  4. 動きを理解する.
  5. 書いてある意味を理解する

という繰り返しです.

参考になる資料を見ながら,少しづつ修正していってください.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
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up