Upgrade to Pro — share decks privately, control downloads, hide ads and more …

テストのないレガシーなRailsアプリをリファクタした話

 テストのないレガシーなRailsアプリをリファクタした話

Rails Developers Meetup 2018: Day 2( https://techplay.jp/event/655769 )のランチスポンサーセッションで話した資料です。

For Rails Developers Meetup 2018 : Day 2 (03/25) Track A Lunch Session.
Presented by 株式会社スタディスト開発部.

msakanostdst

March 25, 2018
Tweet

Other Decks in Technology

Transcript

  1. テストのない レガシーな Railsアプリを リファクタした話 Rails Developers Meetup 2018 Day 2

    (03/25) トラック A ランチセッション 株式会社スタディスト
  2. 2.開発の背景 • プロジェクト ◦ Ruby/Railsバージョンアップ ◦ 半年強(2017/06〜2018/01/20) ◦ メンバー(3 →

    5人) ▪ 詳細な仕様を知らない ▪ 知見も少ない • システム更改 • プロマネ • ruby経験豊富でない 8
  3. 2.開発の背景 • 既存のソースコード ◦ ドキュメントなし&記憶だより (の割にコードがきたない) ◦ Fat Controller ◦

    コピペの嵐 ▪ 3行上に同じコードが書いてあったり ◦ rubocop導入も静的解析等全OFF ◦ コードレビュー機能せず 10
  4. 3.とりくんだこと 24 scope :match_any, (lambda do |keywords| return match_some(:any, keywords)

    end) scope :match_all, (lambda do |keywords| return match_some(:all, keywords) end) scope :match, ->(keyword) { match_all(keyword) } def self.match_some(anyall, keywords) keywords = all_space_split(keywords) if keywords.is_a?(String) return none if !defined?(self::FIELDS) || !keywords.is_a?(Enumerable) key = anyall == :all ? :and : :or return where(keywords.map { |item| search_conds(item) } .reduce(&key)) end def self.search_conds(keyword) conds = self::FIELDS.map do |field| arel_table[field].matches("%#{keyword}%") end return conds.reduce(&:or) end モデル寄せ・共通化の例)キーワード検索 After:計46行のmodule化(1メソッド4行以下)
  5. 4.結果 • Before → After ◦ stats 31 Before After

    コード(行) 43695 27753 テスト(行数) 6 3085 コード:テスト 1:0.00 1:0.11 36% 減 500 倍