SlideShare a Scribd company logo
1 of 42
Download to read offline
今日からはじめる 
リファクタリング 
2014.08.30 
kanazawa.rb meetup#24
よろしくお願いします 
• 島津 純哉(しまず じゅんや) 
• DMM.com Labo 
• Linux, Apache, PHP, MySQL, Memcached, 
Javascript, HTML5, Vim, Shell, Git 
@jshimazu0820 Junya Shimazu
こんなコードで困っていませんか? 
• 読みにくい 
• 編集しにくい 
• 複雑
こんなイメージ 
なんで動いてるの?みたいな
コードがモンスター化している!
コードがモンスター化している! 
• メンテナンスしにくい!
コードがモンスター化している! 
• メンテナンスしにくい! 
• 修正したい
コードがモンスター化している! 
• メンテナンスしにくい! 
• 修正したい 
• でも修正するの難しい
コードがモンスター化している! 
• メンテナンスしにくい! 
• 修正したい 
• でも修正するの難しい 
• 現状動いてるので放置・・・
コードがモンスター化している! 
• メンテナンスしにくい! 
• 修正したい 
• でも修正するの難しい 
• 現状動いてるので放置・・・ 
• クソコードが拡大していく
駄目だこのコード、 
早くなんとかしないと・・・ 
リファクタリングをしよう! 
でも、何から手を付ければいいのだろう?
参考文献
リファクタリングの名著 
• リファクタリングを体系化 
• サンプルコードが充実 
• 2000年初版(14年前!) 
• 最近新装版がでた
リファクタリングとは 
「外部から見たときの振る舞いを保ちつつ 
理解や修正が簡単になるように 
ソフトウェアの内部構造を変化させること」 
! 
→ メンテナンスしやすいコードにすること
リファクタリングとは 
「外部から見たときの振る舞いを保ちつつ 
理解や修正が簡単になるように 
ソフトウェアの内部構造を変化させること」 
! 
→ メンテナンスしやすいコードにすること
なぜコードは汚れていくのか? 
仕様追加・変更、バグ修正の繰り返し 
コードがだんだん乱れていくのは自然な事
リファクタリングは 
常に行われていくべきもの
どこを直せばいいの? 
「コードの不吉なにおい」➡22種類 
! 
そのうちよく見かけた5つを紹介
1位 重複したコード
「重複したコード」の特徴 
• 同じようなコードが2カ所以上に存在 
• 2カ所以上変更しなければならない
2位 長すぎるメソッド
「長すぎるメソッド」の特徴 
• メソッドの内部の処理を追うのが大変 
• 一時変数が多くなりがち 
• テスト・デバッグが困難
3位 巨大なクラス
「巨大なクラス」の特徴 
• 仕事をしすぎなクラス 
• いわゆる密結合 
• フィールドが多くなりがち
4位 多すぎる引数
「多すぎる引数」の特徴 
• 引数の意味を理解するのに手間 
• 仕様追加でさらに増える 
• 本来、0~2個にとどめておくのが良い
5位 変更の分散
「変更の分散」の特徴 
• 変更するたびに他の箇所も変更が必要 
• 他方の修正を忘れて問題発生
不吉なにおい=負債 
将来にわたってコードの理解・修正を妨げる 
プログラマーにとっての「負債」
どうやって負債を取り除くか? 
「リファクタリングカタログ」 
わりとすぐに適用できる3種類を紹介
メソッドの抽出
「メソッドの抽出」 
• 最もメジャーなリファクタリング手法 
• コードの断片をわかりやすい名前のメソッド 
にする 
• 「重複したコード」「長すぎるメソッド」 
に有効
クラスの抽出
「クラスの抽出」 
• 本来2つのクラスでやるべきことを 
1つのクラスでやっている場合 
• 「巨大なクラス」に対して有効 
→
委譲の隠蔽
「委譲の隠蔽」 
• 使い手が意識するクラスを2つ→1つに
他にもたくさんあります 
「コードの不吉なにおい」 
「リファクタリングカタログ」 
でググってみよう!
いつやればいいの? 
• 新機能追加・バグ修正・レビューのとき 
• 3度目の法則 
• 不吉なにおい → 1、2回はガマンして 
3回目に感じたときに修正
注意すること 
• 小さい単位で修正・テストしながら進める 
• できれば単体テストコードも用意 
• 機能追加(またはバグ修正)と 
リファクタリングは分けて作業 
• 無理はしない
まとめ 
• リファクタリングは常に行われていくもの 
• 「コードの不吉なにおい」を知る 
• 手法は体系化されている 
「リファクタリングカタログ」
リファクタリングの 
テクニックを身につけて 
幸せなプログラマーライフを!
ご清聴ありがとうございました

More Related Content

What's hot

そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?
takezoe
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
 

What's hot (20)

今さら聞けない人のためのDevOps超入門
今さら聞けない人のためのDevOps超入門今さら聞けない人のためのDevOps超入門
今さら聞けない人のためのDevOps超入門
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
フロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkanフロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkan
 
そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?
 
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
Scrumの紹介とXPプロジェクトへの適用(Scrum and XP)
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
エンジニア必見!Sreへの第一歩
エンジニア必見!Sreへの第一歩エンジニア必見!Sreへの第一歩
エンジニア必見!Sreへの第一歩
 
品質を加速させるために、テスターを増やす前から考えるべきQMファンネルの話(3D版)
品質を加速させるために、テスターを増やす前から考えるべきQMファンネルの話(3D版)品質を加速させるために、テスターを増やす前から考えるべきQMファンネルの話(3D版)
品質を加速させるために、テスターを増やす前から考えるべきQMファンネルの話(3D版)
 
GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
LEANSTARTUPの現場 #leanstartup
LEANSTARTUPの現場 #leanstartupLEANSTARTUPの現場 #leanstartup
LEANSTARTUPの現場 #leanstartup
 
グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
 
つくらない ものづくり ~明日からできるリーンスタートアップ~
つくらない ものづくり ~明日からできるリーンスタートアップ~つくらない ものづくり ~明日からできるリーンスタートアップ~
つくらない ものづくり ~明日からできるリーンスタートアップ~
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 

Viewers also liked

命名の話(ソースコードは読み物です)
命名の話(ソースコードは読み物です)命名の話(ソースコードは読み物です)
命名の話(ソースコードは読み物です)
Akihiro Nakahara
 

Viewers also liked (20)

レガシーコード改善のススメ
レガシーコード改善のススメレガシーコード改善のススメ
レガシーコード改善のススメ
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jpテストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jp
 
レガシーコードを改善した先にあるもの、それは継続的インテグレーション
レガシーコードを改善した先にあるもの、それは継続的インテグレーションレガシーコードを改善した先にあるもの、それは継続的インテグレーション
レガシーコードを改善した先にあるもの、それは継続的インテグレーション
 
『新装版リファクタリング ―既存のコードを安全に改善する―』 のここがすごい
『新装版リファクタリング ―既存のコードを安全に改善する―』 のここがすごい『新装版リファクタリング ―既存のコードを安全に改善する―』 のここがすごい
『新装版リファクタリング ―既存のコードを安全に改善する―』 のここがすごい
 
レガシーコードとの付き合い方とテストでの話
レガシーコードとの付き合い方とテストでの話レガシーコードとの付き合い方とテストでの話
レガシーコードとの付き合い方とテストでの話
 
納品のない受託開発を支える レガシーコードを作らない仕組み
納品のない受託開発を支える レガシーコードを作らない仕組み納品のない受託開発を支える レガシーコードを作らない仕組み
納品のない受託開発を支える レガシーコードを作らない仕組み
 
アジャイルサムライ横浜道場「リファクタリング:技術的負債の返済」
アジャイルサムライ横浜道場「リファクタリング:技術的負債の返済」アジャイルサムライ横浜道場「リファクタリング:技術的負債の返済」
アジャイルサムライ横浜道場「リファクタリング:技術的負債の返済」
 
リファクタリングの実情
リファクタリングの実情リファクタリングの実情
リファクタリングの実情
 
Gaucheで本を作る
Gaucheで本を作るGaucheで本を作る
Gaucheで本を作る
 
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
 
【CyberX読書会】リファクタリング 2012/02/06
【CyberX読書会】リファクタリング 2012/02/06【CyberX読書会】リファクタリング 2012/02/06
【CyberX読書会】リファクタリング 2012/02/06
 
リファクタリング?
リファクタリング?リファクタリング?
リファクタリング?
 
命名の話(ソースコードは読み物です)
命名の話(ソースコードは読み物です)命名の話(ソースコードは読み物です)
命名の話(ソースコードは読み物です)
 
テストコードのリファクタリング
テストコードのリファクタリングテストコードのリファクタリング
テストコードのリファクタリング
 
Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-
 
コーディングスタイル入門~人に伝えるプログラミング~
コーディングスタイル入門~人に伝えるプログラミング~コーディングスタイル入門~人に伝えるプログラミング~
コーディングスタイル入門~人に伝えるプログラミング~
 
エクストリームエンジニア5
エクストリームエンジニア5エクストリームエンジニア5
エクストリームエンジニア5
 
第1回JUnit勉強会ハンズオン
第1回JUnit勉強会ハンズオン第1回JUnit勉強会ハンズオン
第1回JUnit勉強会ハンズオン
 
システムアーキテクト~My batis編~
システムアーキテクト~My batis編~システムアーキテクト~My batis編~
システムアーキテクト~My batis編~
 

今日からはじめるリファクタリング