SlideShare a Scribd company logo
1
リファクタリング
概要
 リファクタリングとは何かを学習します。
2
目次
 リファクタリングとは
 可読性の高いコードの書き方
 リファクタリング
3
リファクタリングとは
4
リファクタリングとは
 リファクタリングとは
• 外から見た振る舞いを変えずに、中身のソースコードを修正すること。
• リファクタリングの目的のほとんどは、可読性の悪いコードをきれいに
整えること。
• 実行結果は変わらないが、可読性が上がるようにソースコードをいい感
じに最適化しましょう!というのがリファクタリング。
7
そもそもの話
そもそも
現状動いてるシステムに対して
可読性の低いソースコードは修正した方が良いのか?
8
そもそもの話
どんなに汚いコードでも
動いているコードは修正せずに
そっとしておこう…
というのがというのが一般的に正しいとされていた。
(一昔前の話)
9
そもそもの話
ところが
いや、外から見た動作を変更せずに、
コードを洗練させていこう!!
という考え方出てきた。
10
そもそもの話
それが
「リファクタリング」
という手法
11
可読性の高い
コードの書き方
12
可読性の高いコードを書く
そもそも
プログラムを作るとき、
最初から可読性の高いコードを書けるのであれば、
リファクタリングは不要です。
リファクタリングの手法を知る前に
まずは可読性の高いコードを書くための考え方を身につけましょう。
13
可読性の高いコードを書く
 コードは必ず変更される
• プログラミングのソースコードは一度書いたらもう終わりということは
ほとんどありません。
• 必ず変更されると心得ておきましょう。
• そのため、変更に強いコードを書くことを意識する必要があります。
14
可読性の高いコードを書く
 コードは読まれる時間の方が長い
• ソースコードは、一般的に書いている時間よりも読まれる時間の方が長
いです。
• そのため、プログラミングをするときは「書きやすさ」よりも「読みや
すさ」を優先する必要があります。
15
可読性の高いコードを書く
 KISSの原則
• Keep It Simple, Stupid.または Keep It Short and Simple. の略です。
• 直訳すると「シンプルにしておけ、愚か者よ」。または「簡潔かつ単純
にしておけ」。
• 「将来に備えて」などと考えて本当は必要のない余計なコードを書いて
しまうと、コードはどんどん複雑になっていきます。
• 余計なことはせず、シンプルなコードを保つように心掛けましょう。
16
可読性の高いコードを書く
 DRY原則
• Don't Repeat Yourself. の略で、直訳すると「繰り返してはいけない。」
• コードをコピペして重複させないようにしましょうということです。
• 重複は、バグ修正、機能追加の際のリスクになります。
• 処理だけでなく、定数やリテラルも重複しないように注意しましょう。
• また、コードをそのまま説明しているコメントも重複と同じです。
17
可読性の高いコードを書く
 名前重要
• プログラミングは、コードの命名が最重要課題だとも言われています。
• 変数名、メソッド名、クラス名、などプログラミングでは必ず名前を付
ける場面が多くあります。
• 名前が適切かどうかを常に意識してプログラムを書くことを心がけま
しょう。
18
可読性の高いコードを書く
 コメントの書き方
• コメントの目的は、書き手の意図を知らせること。
• 読み手がコードの理解に役に立つことを書く。
• コードからすぐにわかることは、コメントには書かない。
19
可読性の高いコードを書く
 コメントを多く書かない理由
• コードが修正されたときに、コメントも同時に修正されるとは限らない。
• コードを読めばわかること、特に処理の説明などはコメントには書かな
いようにする。
20
可読性の高いコードを書く
 メソッドの行数
• 一つのメソッドは何行以内に収めたほうが良いか?
• Java 1.6 の標準パッケージで4000のメソッドを調べたところ
9割のメソッドは20行以下とこのこと。
• 一概には言えないが、20行というのが一つの目安になる。
21
可読性の高いコードを書く
 優れたプログラマーになるために
• プログラマーとして身に付けて
おきたい考え方が多く載っています。
22
可読性の高いコードを書く
 変数名の付け方
• この本が参考になります。
• 変数名など、名前を付けるのが苦手
だと感じる方は一読してみましょう。
23
可読性の高いコードを書く
 まとめ
• ソースコードは、読まれる時間が長く、必ず変更されるものと心得る。
• 重複を排除して読みやすいソースコードを書く。そして余計なソースは
記述しない。
• 分かりやすい名前をつける。
• コメントは必要最低限にする。
24
リファクタリング
25
リファクタリングの定義
 リファクタリングの定義
• リファクタリングの定義は「外部から見たプログラムの振る舞いを変え
ずに、プログラムの内部構造を改善すること」
• バグを修正することはリファクタリングとはなりません。
• また、機能の追加もリファクタリングには含まれません。
リファクタリングをすると、結果的にバグ修正や機能追加が行いや
すくなる。これがリファクタリングの目的
26
リファクタリングの注意点
 リファクタリングの注意点
• リファクタリングと機能追加を同時に行ってはいけない。
• テストが用意されているか確認する。
• できるかぎり頻繁にテストを行う。
• 作業を小さな単位にまとめて、慎重に作業を行う。
27
リファクタリングの対象
 リファクタリングの対象
• 二重化しているコードを発見した(DRY原則に反している)
• 関係ないもの同士が影響し合っている。
• 時代遅れの技術が使われている。
• パフォーマンスが悪い
28
リファクタリングの対象
 不吉な匂い
「Java言語で学ぶリファクタリング入門」の中で紹介されているものです。
• コードが重複している
• メソッドが長すぎる
• クラスの持つフィールドやメソッドが多すぎる
• メソッドの引数が多すぎる
• 仕様変更の修正箇所があちこちに散らばっている
• あるクラスを修正すると、他のクラスも修正しなければならない
• 他のクラスの中身をいじっているクラスがある
• まとめて扱うべきデータが1つのクラスにまとまっていない
• クラスを使わず、int型のような基本データ型ばかり使っている
• switch文やif文を使って振る舞いを分けている
• サブクラスを作ると、別のところにもサブクラスを作らなければならな
い
29
リファクタリングの対象
 不吉な匂い
• クラスが大して仕事をしていない
• 拡張するだろうと期待して、クラスが一般化しすぎている
• 一時的にしか使わないフィールドがある
• メソッド呼び出しの連鎖が多すぎる
• 委譲ばかりしていて、自分では仕事をしていないクラスがある
• 必要のない双方向リンクや、IS-A関係の成り立たない継承がある
• クラスのインターフェースが不適切
• 既存のクラスライブラリが使いにくい
• フィールドとアクセッサしかもっていないクラスがある
• 継承しているメソッドなのに、それを呼ぶと問題が起きる
• コードの不備を補うために、詳しいコメントがある
30
リファクタリングの対象
 不吉な匂い
全部で22個が紹介されています。かなりたくさんありますが、
ざっくりまとめると
• 理解しにくい
• 修正しにくい
• 拡張しにくい
と感じる部分がリファクタリングの対象になります。
31
リファクタリングの手順
 リファクタリングの手順
1. テストを実施してテストを通ることを確認
テストが用意されていない場合は、テストの作成から行う。
テストがないコードに関しては、リファクタリングはするべきではない。
2. コードの修正を実施
3. テストを実施してテストが通ることを確認
4. 2と3の手順を繰り返す。
たくさんのコードを一気に修正しないように注意する。
リファクタリングは「小さな修正 ⇒ テスト」のサイクルを多く繰り返し、
少しずつ実施していく。
32
まとめ
56
全体のまとめ
 リファクタリングは必ずしも実施したほうが良いわけではありま
せん。状況に応じて適切な判断を下しましょう。
 リファクタリングの必要がない、読みやすい、かつ拡張しやすい
コードを書けるように心がけましょう。
 時間と心に余裕があればリファクタリング積極的にリファクタリ
ングしていきましょう。
 リファクタリングは繰り返しテストしながら小さく進めましょう。
57

More Related Content

More from keki3

Computer terminology
Computer terminologyComputer terminology
Computer terminology
keki3
 
Introduction to programming
Introduction to programmingIntroduction to programming
Introduction to programming
keki3
 
2019年度 若手技術者向け講座 デザインパターン 演習問題
2019年度 若手技術者向け講座 デザインパターン 演習問題2019年度 若手技術者向け講座 デザインパターン 演習問題
2019年度 若手技術者向け講座 デザインパターン 演習問題
keki3
 
2019年度 若手技術者向け講座 デザインパターン
2019年度 若手技術者向け講座 デザインパターン2019年度 若手技術者向け講座 デザインパターン
2019年度 若手技術者向け講座 デザインパターン
keki3
 
2019年度 若手技術者向け講座 UML
2019年度 若手技術者向け講座 UML2019年度 若手技術者向け講座 UML
2019年度 若手技術者向け講座 UML
keki3
 
2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向
keki3
 
Wakatemukekouza2019 web
Wakatemukekouza2019 webWakatemukekouza2019 web
Wakatemukekouza2019 web
keki3
 
2019 若手技術者向け講座 DB設計
2019 若手技術者向け講座 DB設計2019 若手技術者向け講座 DB設計
2019 若手技術者向け講座 DB設計
keki3
 
2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQL2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQL
keki3
 
2019 若手技術者向け講座 DBMSの機能 演習問題
2019 若手技術者向け講座 DBMSの機能 演習問題2019 若手技術者向け講座 DBMSの機能 演習問題
2019 若手技術者向け講座 DBMSの機能 演習問題
keki3
 
2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能
keki3
 
2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画
keki3
 
2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス
keki3
 
2019年度 若手技術者向け講座 SQL演習
2019年度 若手技術者向け講座 SQL演習2019年度 若手技術者向け講座 SQL演習
2019年度 若手技術者向け講座 SQL演習
keki3
 
2019年度若手技術者向け講座 実践SQL
2019年度若手技術者向け講座 実践SQL2019年度若手技術者向け講座 実践SQL
2019年度若手技術者向け講座 実践SQL
keki3
 
2018年度 若手技術者向け講座 デザインパターン
2018年度 若手技術者向け講座 デザインパターン2018年度 若手技術者向け講座 デザインパターン
2018年度 若手技術者向け講座 デザインパターン
keki3
 
2018年度 若手技術者向け講座 UML
2018年度 若手技術者向け講座 UML2018年度 若手技術者向け講座 UML
2018年度 若手技術者向け講座 UML
keki3
 
2018年度 若手技術者向け講座 オブジェクト指向01
2018年度 若手技術者向け講座 オブジェクト指向012018年度 若手技術者向け講座 オブジェクト指向01
2018年度 若手技術者向け講座 オブジェクト指向01
keki3
 
2018年度 若手技術者向け講座 DB設計・正規化
2018年度 若手技術者向け講座 DB設計・正規化2018年度 若手技術者向け講座 DB設計・正規化
2018年度 若手技術者向け講座 DB設計・正規化
keki3
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
keki3
 

More from keki3 (20)

Computer terminology
Computer terminologyComputer terminology
Computer terminology
 
Introduction to programming
Introduction to programmingIntroduction to programming
Introduction to programming
 
2019年度 若手技術者向け講座 デザインパターン 演習問題
2019年度 若手技術者向け講座 デザインパターン 演習問題2019年度 若手技術者向け講座 デザインパターン 演習問題
2019年度 若手技術者向け講座 デザインパターン 演習問題
 
2019年度 若手技術者向け講座 デザインパターン
2019年度 若手技術者向け講座 デザインパターン2019年度 若手技術者向け講座 デザインパターン
2019年度 若手技術者向け講座 デザインパターン
 
2019年度 若手技術者向け講座 UML
2019年度 若手技術者向け講座 UML2019年度 若手技術者向け講座 UML
2019年度 若手技術者向け講座 UML
 
2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向2019年度 若手技術者向け講座 オブジェクト指向
2019年度 若手技術者向け講座 オブジェクト指向
 
Wakatemukekouza2019 web
Wakatemukekouza2019 webWakatemukekouza2019 web
Wakatemukekouza2019 web
 
2019 若手技術者向け講座 DB設計
2019 若手技術者向け講座 DB設計2019 若手技術者向け講座 DB設計
2019 若手技術者向け講座 DB設計
 
2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQL2019年度 若手技術者向け講座 NoSQL
2019年度 若手技術者向け講座 NoSQL
 
2019 若手技術者向け講座 DBMSの機能 演習問題
2019 若手技術者向け講座 DBMSの機能 演習問題2019 若手技術者向け講座 DBMSの機能 演習問題
2019 若手技術者向け講座 DBMSの機能 演習問題
 
2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能
 
2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画
 
2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス2019年度若手技術者向け講座 インデックス
2019年度若手技術者向け講座 インデックス
 
2019年度 若手技術者向け講座 SQL演習
2019年度 若手技術者向け講座 SQL演習2019年度 若手技術者向け講座 SQL演習
2019年度 若手技術者向け講座 SQL演習
 
2019年度若手技術者向け講座 実践SQL
2019年度若手技術者向け講座 実践SQL2019年度若手技術者向け講座 実践SQL
2019年度若手技術者向け講座 実践SQL
 
2018年度 若手技術者向け講座 デザインパターン
2018年度 若手技術者向け講座 デザインパターン2018年度 若手技術者向け講座 デザインパターン
2018年度 若手技術者向け講座 デザインパターン
 
2018年度 若手技術者向け講座 UML
2018年度 若手技術者向け講座 UML2018年度 若手技術者向け講座 UML
2018年度 若手技術者向け講座 UML
 
2018年度 若手技術者向け講座 オブジェクト指向01
2018年度 若手技術者向け講座 オブジェクト指向012018年度 若手技術者向け講座 オブジェクト指向01
2018年度 若手技術者向け講座 オブジェクト指向01
 
2018年度 若手技術者向け講座 DB設計・正規化
2018年度 若手技術者向け講座 DB設計・正規化2018年度 若手技術者向け講座 DB設計・正規化
2018年度 若手技術者向け講座 DB設計・正規化
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
 

Recently uploaded

遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 

Recently uploaded (8)

遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 

2019年度 若手技術者向け講座 リファクタリング