SlideShare a Scribd company logo
エクストリーム・エンジニアへの道
(Ruby編)第5回
リファクタリング	
  
テクノロジックアート	
  
⻑⾧長瀬  嘉秀	
  
•  リファクタリング	
  
•  設計改善	
内容	
  
リファクタリングとは 	
•  外部から見たときの振る舞いを保ちつつ、	
理解や修正が簡単になるように、ソフトウェアの	
内部構造を変化させること (出典:リファクタリング)	
Aを実現する	
コード	
Bを実現する	
コード	
Cを実現する	
コード	
Aを実現する	
コード	
Bを実現する	
コード	
Cを実現する	
コード	
共通コード	
リファクタリングのイメージ	
振る舞いA	
 振る舞いB	
 振る舞いC	
振る舞いA	
 振る舞いB	
 振る舞いC	
  
リファクタリング前	
 リファクタリング後
•  リファクタリングのきっかけとなる、設計上
の問題	
コードの臭い(code	
  smell)	
  	
  
臭い	
 状態	
重複したコード	
 同じ処理が複数個所に存在する	
長すぎるメソッド	
 一つのメソッドに多くの処理が記述されている	
巨大なクラス	
 あるクラスが、責務を多く持ちすぎている	
多すぎる引数	
 メソッドに渡す引数の数が多すぎる	
変更の発散	
 1つのクラスがさまざまな変更要求の影響を被る	
変更の分散	
 1つの変更要求によって、複数のクラスが影響を被る	
属性、操作の横恋慕	
 自クラスより他クラスの属性、操作と関連が深い	
データの群れ	
 数個のデータがグループとなって各所に現れる	
基本データ型への執着	
 基本データ型を使用し、複雑なロジックが記述されている	
スイッチ文	
 スイッチ文により設計が複雑化、硬直化している	
パラレル継承	
 あるクラスの継承ツリーと、他のクラスの継承ツリーに関連がある。	
表. コードの臭いの例	
出典:リファクタリング
リファクタリングの意義	
  
実装済み	
ツールのサポート	
単純ミスの回避	
自動化	
実装済み	
コード	
臭い	
リファクタリング	
コード	
修正しやすい	
理解しやすい	
カタログ	
臭い	
省力化	
対象の発見	
状態の共有	
解決法の共有	
デザインパターン	
例)Eclipse
リファクタリング	
リファクタリングの位置づけ	
動作しなくなる	
危険性	
自動テスト	
バージョン管理システム	
常に検証	
変更破棄の	
場合もある	
デザインパターン	
指針	
YAGNI原則	
同時に行わない	
 パフォーマンス	
チューニング	
機能の追加	
こまめに	
コミット
進化的設計とリファクタリング	
  
•  進化的設計	
–  仕様・設計の変更にともない、コードの修正が多発する	
•  コストとリスクを抑える必要がある	
– TDD	
  
– リファクタリング	
•  これらの手法を学び、適用することで、「コストとリスクを抑えて」	
  
進化的設計(アジャイル開発)を実現する
オブジェクト指向とカプセル化①	
  
•  オブジェクト指向、非オブジェクト指向のソフトウェアの構成の差異	
データ
処理	
非オブジェクト指向	
 オブジェクト指向	
メッセージ	
カプセル化	
データ	
処理
オブジェクト指向とカプセル化②	
  
•  オブジェクトのカプセル化とは	
データや処理をオブジェクト外部から隠蔽すること	
定められた「可視性」に
よって外部からアクセス
できる。	
エンジン	
色	
車名	
走る	
曲がる	
止まる	
車オブジェクト	
振る舞い	
(処理)	
属性	
(データ)
オブジェクト指向とカプセル化③	
  
•  インターフェースとは	
– オブジェクトが実行できる振る舞いを表明
したもの	
電源を入れる	
電源を入れる	
チャンネルを変える	
メッセージ	
振る舞い	
(処理)
オブジェクト指向とカプセル化④	
  
•  クラスは属性と振る舞い(操作)を持っている	
•  クラスは実体を持たない	
•  オブジェクトはクラスをインスタンス化することで生成される実体	
クラス	
鯛焼きの型	
鯛焼き	
作る	
インスタンス化	
オブジェクト	
(インスタンス)
オブジェクト指向とカプセル化⑤	
  
•  インターフェースと	
  
  実装の分離	
処理1  処理2	
処理3  処理4	
データA	
クラスA	
処理1   	
処理3   	
インターフェース1	
      処理2	
インターフェース2	
クラスB	
クラスC	
処理1、処理3が

できるということ

しか知らない	
処理2ができると

いうことしか

知らない	
クライアント
クライアント	
オブジェクト指向とカプセル化⑥	
  
•  クライアントは、扱うオブジェクトが求める	
  
インターフェースにしたがっている限り、	
  
そのオブジェクトの型を知らなくてすむ。	
•  クライアントは、これらのオブジェクトを実装
しているクラスを知らなくて済む。クライアン
トは	
  
インターフェースについてのみ知っていれば
よい。	
•  当該インターフェースの振る舞いさえ保たれ	
  
れば、クライアントは、オブジェクトの内部実
装が変化しても影響は無い。	
クラスB	
クラスC	
処理1、処理3が

できるということしか

知らない	
処理2ができるというこ
としか知らない	
リファクタリングのポイント	
!
実装	
実装	
オブジェクト指向とカプセル化⑦	
  
•  コンポーネントの形成	
クラスA	
処理1   	
処理3   	
インターフェース1	
      処理2	
インターフェース2	
一つのクラスでもよい	
クラスの集合体でもよい	
または	
コンポーネント
カプセル化とリファクタリング	
  
•  リファクタリングとは	
–  外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、
ソフトウェアの内部構造を変化させること (出典:リファクタリング)	
コンポーネント単位で、これを適用する	
振る舞い:コンポーネントとして提供するインターフェース	
内部構造:クラス構造
臭
い	
きれい	
臭
い	
きれい	
パターン適⽤用の意義①	
  
•  リファクタリングとパターンの関係	
同じようなクラス構造が	
よく出てくる…	
  
・分析・抽出	
・一般化	
・カタログ化	
リファクタリング	
コード	
 臭い	
コード	
 きれい	
リファクタリング	
コード	
 臭い	
コード	
 きれい	
過去	
 現在	
デザインパターン	
指針
•  リファクタリングとパターンの関係	
パターン適⽤用の意義②	
  
リファクタリング規模	
小	
 大	
リファクタリング・	
カタログ	
(出典:リファクタリング)	
デザインパターン	
(GoF)	
・Factory	
  Method	
  
・State	
  	
  	
  	
  	
  	
  	
  	
  	
  など	
領
域
	
   カタログやデザインパターンはリフ
ァクタリング全体の中では一部である	
!
まとめ	
  
• オブジェクト指向	
• カプセル化	
• インターフェースと実装の分離	
• コンポーネントの生成	
• リファクタリング	
• コンポーネント内部のリファクタリング	
• クラス構造のリファクタリング	
デザイン	
パターン	
指針
•  第2回のコード	
例例題	
  
例例題  社⻑⾧長のコード	
  
shain	
  =	
  Tanto.new(100)	
puts	
  shain.standup	
puts	
  "私の給料は#{	
  shain.calculate_salary}円です。"	
  	
  	
 	
shain	
  =	
  Shunin.new(100)	
shain.standup	
puts	
  "私の給料は#{	
  shain.calculate_salary}円です。"	
 	
shain	
  =	
  Bucho.new(100)	
shain.standup	
puts	
  "私の給料は#{	
  shain.calculate_salary}円です。"
•  デザインパターンでリファクタリング	
ファクトリーメソッド	
  
パターンを適⽤用	
  
社⻑⾧長コード	
  
ファクトリーを作成	
  
factory	
  =	
  ShainFactory.new	
  	
  
社員の役職を引数でファクトリークラスに渡す	
 	
shain	
  =	
  factory.create(“Tanto”,100)	
 	
部長の生成	
 	
shain	
  =	
  factory.create(“Bucho”,100)
社員コード	
  
module Salary	
def calculate_salary	
kihon + teate	
end	
def kihon	
@kihonkyu	
end	
def teate	
0	
end	
end	
class Shain	
include Salary	
def initialize(kihonkyu)	
@kihonkyu = kihonkyu	
end	
end	
class Tanto < Shain	
def standup	
"新入社員は慌てて起立しました"	
end	
end	
第2回のコード
•  まずはテストの作成	
  
•  Rspecを使用	
テスト	
  
# -*- coding: utf-8 -*-	
require_relative './shain'	
describe ShainFactory do	
let(:shain_factory) {ShainFactory.new}	
it ' Tantoオブジェクトを生成しているかどうかをチェックする' do	
expect(shain_factory.create('Tanto',100)).to be_an_instance_of Tanto	
end	
  
end
•  ShainFactoryクラスを作っていないのでエラー	
テスト  はじめはエラー	
  
class ShainFactory	
def create(type,kihonkyu)	
shain = nil	
if type == 'Tanto'	
shain = Tanto.new(kihonkyu)	
  
	
  	
  	
  	
  end	
shain	
end	
end
Rspecでテスト	
  
yoshi$	
  rspec	
  -­‐-­‐format=d	
  test_spec.rb	
  
ShainFactory	
  
	
  	
  Tantoオブジェクトを生成しているかどうかをチェックする
•  主任、部長、取締役も作成してください。	
演習	
  
•  車とトラックのクラスがあり、前進させるメソ
ッドを持っています。さらに、タイヤを回転さ
せます。	
  
•  このプログラムをリファクタリングして、重複
をなくしてください。	
演習2	
  
演習2  ⾞車車、トラック、タイヤクラス	
  
class Tire	
def spin_car	
"spinning car tire"	
end	
def spin_truck	
"spinning truck tire"	
end	
end	
class Vehicle	
def initialize	
@tire = Tire.new	
end	
end	
class Car < Vehicle	
def move_forward	
puts "前進する"	
return @tire.spin_car	
end	
end	
class Truck < Vehicle	
def move_forward	
puts "前進する"	
return @tire.spin_truck	
end	
end
演習2  RSpec	
  
# -*- coding: utf-8 -*-	
require_relative './vehicle'	
describe Car do	
let(:car) {Car.new}	
it ' spining car tireを返すかどうかをチェックする' do	
expect(car.move_forward).to eq 'spinning car tire'	
end	
end	
describe Truck do	
let(:truck) {Truck.new}	
it ' spining truck tireを返すかどうかをチェックする' do	
expect(truck.move_forward).to eq 'spinning truck tire'	
end

More Related Content

PDF
20161213_FinTech時代に求められるDB開発とセキュリティ by 株式会社インサイトテクノロジー 阿部健一
Insight Technology, Inc.
 
PDF
ドキュメント自動入力AIプラットフォーム ディープシグマDPAについて
Hirono Jumpei
 
PDF
「俺の背中について来い」アジャイルチームを一気に立ち上げる方法
Hiromasa Oka
 
PPTX
Microsoft AI Solution Update / DLL community Update
Hirono Jumpei
 
PDF
Portfolio for JIRA で"全体計画にコミット"し続けるべし
Hiromasa Oka
 
PDF
異常検知ナイトgLupe発表
Hirono Jumpei
 
PDF
Microsoft の深層学習への取り組み
Hirono Jumpei
 
PDF
深層学習の導入で抱える課題とユースケース実例
Hirono Jumpei
 
20161213_FinTech時代に求められるDB開発とセキュリティ by 株式会社インサイトテクノロジー 阿部健一
Insight Technology, Inc.
 
ドキュメント自動入力AIプラットフォーム ディープシグマDPAについて
Hirono Jumpei
 
「俺の背中について来い」アジャイルチームを一気に立ち上げる方法
Hiromasa Oka
 
Microsoft AI Solution Update / DLL community Update
Hirono Jumpei
 
Portfolio for JIRA で"全体計画にコミット"し続けるべし
Hiromasa Oka
 
異常検知ナイトgLupe発表
Hirono Jumpei
 
Microsoft の深層学習への取り組み
Hirono Jumpei
 
深層学習の導入で抱える課題とユースケース実例
Hirono Jumpei
 

What's hot (20)

PPTX
st2でシステム管理
You&I
 
PPTX
Elastic Team Building
Yuki Nanri
 
PDF
エンタープライズアジャイル内製プロジェクトを立ち上げる前に考慮すべき3つのこと
Hiromasa Oka
 
PDF
Case study of DevOps for Hadoop in Recruit.
Recruit Technologies
 
PPTX
データをどこに溜めよう?ローカル?クラウド?どのデータベース?
- Core Concept Technologies
 
PPTX
IoTデバイスデータ収集の難しい点
Tetsutaro Watanabe
 
PPTX
Microsoft ではじめる AI DLラボ パートナープログラムご紹介
Hirono Jumpei
 
PPTX
IoT導入のお客様要望とその事例(データ取得編)
- Core Concept Technologies
 
PDF
社内問い合わせ&申請・承認業務の 管理方法 - Jira Service Management 事例紹介 -
MicroAd, Inc.(Engineer)
 
PPTX
ビックデータ処理技術の全体像とリクルートでの使い分け
Tetsutaro Watanabe
 
PPTX
早稲田大学 理工メディアセンター 機械学習とAI セミナー: 機械学習中級編
Daiyu Hatakeyama
 
PPTX
IoTで成果を出す
- Core Concept Technologies
 
PDF
【de:code 2020】 Microsoft 365 E5 を活用したセキュア リモート ワーク環境の構築
日本マイクロソフト株式会社
 
PDF
【17-E-4】GitHub Enterpriseユーザ企業登壇!企業文化にイノベーションを起こすモダンなソフトウェア開発環境とは?
Developers Summit
 
PDF
Yahoo! JAPANを支えるビッグデータプラットフォーム技術
Yahoo!デベロッパーネットワーク
 
PPTX
フューチャースタンダードCEO鳥海登壇 【 第103回InfoTalk 】「IoTと画像処理で未来のフツウをつくる」講演資料 (Jul. 21st, 2017)
Future Standard
 
PPTX
Idcfクラウドはこんな人に向いている
Takayuki Saito
 
PPTX
Chainer x Azure Machine Learning service - Hackathon
Daiyu Hatakeyama
 
PDF
【de:code 2020】 Microsoft が考える新しいハイブリッドクラウドの形とは
日本マイクロソフト株式会社
 
PDF
ビッグデータ
Shigeru Kishikawa
 
st2でシステム管理
You&I
 
Elastic Team Building
Yuki Nanri
 
エンタープライズアジャイル内製プロジェクトを立ち上げる前に考慮すべき3つのこと
Hiromasa Oka
 
Case study of DevOps for Hadoop in Recruit.
Recruit Technologies
 
データをどこに溜めよう?ローカル?クラウド?どのデータベース?
- Core Concept Technologies
 
IoTデバイスデータ収集の難しい点
Tetsutaro Watanabe
 
Microsoft ではじめる AI DLラボ パートナープログラムご紹介
Hirono Jumpei
 
IoT導入のお客様要望とその事例(データ取得編)
- Core Concept Technologies
 
社内問い合わせ&申請・承認業務の 管理方法 - Jira Service Management 事例紹介 -
MicroAd, Inc.(Engineer)
 
ビックデータ処理技術の全体像とリクルートでの使い分け
Tetsutaro Watanabe
 
早稲田大学 理工メディアセンター 機械学習とAI セミナー: 機械学習中級編
Daiyu Hatakeyama
 
IoTで成果を出す
- Core Concept Technologies
 
【de:code 2020】 Microsoft 365 E5 を活用したセキュア リモート ワーク環境の構築
日本マイクロソフト株式会社
 
【17-E-4】GitHub Enterpriseユーザ企業登壇!企業文化にイノベーションを起こすモダンなソフトウェア開発環境とは?
Developers Summit
 
Yahoo! JAPANを支えるビッグデータプラットフォーム技術
Yahoo!デベロッパーネットワーク
 
フューチャースタンダードCEO鳥海登壇 【 第103回InfoTalk 】「IoTと画像処理で未来のフツウをつくる」講演資料 (Jul. 21st, 2017)
Future Standard
 
Idcfクラウドはこんな人に向いている
Takayuki Saito
 
Chainer x Azure Machine Learning service - Hackathon
Daiyu Hatakeyama
 
【de:code 2020】 Microsoft が考える新しいハイブリッドクラウドの形とは
日本マイクロソフト株式会社
 
ビッグデータ
Shigeru Kishikawa
 
Ad

Viewers also liked (20)

PDF
エクストリームエンジニア4
T-arts
 
PDF
エクストリームエンジニア3
T-arts
 
PDF
プロダクトマネジメント入門
You&I
 
PDF
しょうぎアプリ
You&I
 
PDF
Pfpws w22 事例紹介_ペアマインドマップ
nishikawa_makoto7
 
PDF
アジャイルサムライ横浜道場「リファクタリング:技術的負債の返済」
Hiroyuki Ohnaka
 
PDF
命名の話(ソースコードは読み物です)
Akihiro Nakahara
 
PPTX
Jackson beyond JSON: XML, CSV
Tatu Saloranta
 
PDF
オブジェクト指向っぽい話
Tomohiro Shinden
 
PDF
レガシーコードを改善した先にあるもの、それは継続的インテグレーション
Masanori Satoh
 
PDF
Perl 6 Object-Oliented Programming
risou
 
PPTX
Officeで使うPerl Excel編
risou
 
PDF
北斗の拳の世界をオブジェクト指向で
yaju88
 
PDF
今日からはじめるリファクタリング
Junya Shimazu
 
PDF
レジリエンスで高める組織づくり
You&I
 
PDF
200円から始めるプロジェクトファシリテーション
Masaya Yamamoto
 
PDF
0410_agilejapan2010_hanyudasan
Akiko Kosaka
 
PPT
ペアプロどうでしょう?
hiroyuki Yamamoto
 
PDF
AgileJapan-Saga-Prefecture
guesta72ed241
 
PDF
第2回勉強会 オブジェクト指向
hakoika-itwg
 
エクストリームエンジニア4
T-arts
 
エクストリームエンジニア3
T-arts
 
プロダクトマネジメント入門
You&I
 
しょうぎアプリ
You&I
 
Pfpws w22 事例紹介_ペアマインドマップ
nishikawa_makoto7
 
アジャイルサムライ横浜道場「リファクタリング:技術的負債の返済」
Hiroyuki Ohnaka
 
命名の話(ソースコードは読み物です)
Akihiro Nakahara
 
Jackson beyond JSON: XML, CSV
Tatu Saloranta
 
オブジェクト指向っぽい話
Tomohiro Shinden
 
レガシーコードを改善した先にあるもの、それは継続的インテグレーション
Masanori Satoh
 
Perl 6 Object-Oliented Programming
risou
 
Officeで使うPerl Excel編
risou
 
北斗の拳の世界をオブジェクト指向で
yaju88
 
今日からはじめるリファクタリング
Junya Shimazu
 
レジリエンスで高める組織づくり
You&I
 
200円から始めるプロジェクトファシリテーション
Masaya Yamamoto
 
0410_agilejapan2010_hanyudasan
Akiko Kosaka
 
ペアプロどうでしょう?
hiroyuki Yamamoto
 
AgileJapan-Saga-Prefecture
guesta72ed241
 
第2回勉強会 オブジェクト指向
hakoika-itwg
 
Ad

Similar to エクストリームエンジニア5 (20)

PDF
デザインパターンを用いたリファクタリング
kei takakuda
 
PPTX
C#とILとネイティブと
信之 岩永
 
PPT
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
PDF
私がドメイン駆動設計をやる理由
増田 亨
 
PPTX
勉強会 - 1
KenjiYamasaki5
 
PDF
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
Rakuten Group, Inc.
 
PPTX
2014 08-30 life with roslyn
shibuki
 
PDF
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
Yahoo!デベロッパーネットワーク
 
PDF
XP祭り関西2011 森崎 修司「プラクティスが有効にはたらく前提は明らかになっていますか?」
Shuji Morisaki
 
PDF
Code for Japan 勉強会 Vol.1 CKAN入門 プロジェクトのFork、デプロイ、CIまで
Naoyuki Yamada
 
PPTX
ドメイン駆動設計の学習曲線とブレークポイント
増田 亨
 
PDF
わかると楽しいInfrastructure as code
Shohei Kobayashi
 
PPTX
Vibe Codingを始めよう 〜Cursorを例に、ノーコードでのプログラミング体験〜
iPride Co., Ltd.
 
PPTX
Visual Studio 2019 Updates Pickup!
Hiroyuki Mori
 
PPTX
C# 3.0 以降
Fujio Kojima
 
PPTX
電光掲示板のコード C#で画像処理
Takuya Negishi
 
PDF
ゼロからのプログラミングRails講座 Codeanywhere版
DIVE INTO CODE Corp.
 
PPTX
広がる .Net
信之 岩永
 
PDF
ソフトウェア工学2023 03 下流工程
Toru Tamaki
 
PDF
DOO-015_Azure/Windows Server 2016 から学ぶ Windows 系インフラ エンジニアのための DevOps
decode2016
 
デザインパターンを用いたリファクタリング
kei takakuda
 
C#とILとネイティブと
信之 岩永
 
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
私がドメイン駆動設計をやる理由
増田 亨
 
勉強会 - 1
KenjiYamasaki5
 
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
Rakuten Group, Inc.
 
2014 08-30 life with roslyn
shibuki
 
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
Yahoo!デベロッパーネットワーク
 
XP祭り関西2011 森崎 修司「プラクティスが有効にはたらく前提は明らかになっていますか?」
Shuji Morisaki
 
Code for Japan 勉強会 Vol.1 CKAN入門 プロジェクトのFork、デプロイ、CIまで
Naoyuki Yamada
 
ドメイン駆動設計の学習曲線とブレークポイント
増田 亨
 
わかると楽しいInfrastructure as code
Shohei Kobayashi
 
Vibe Codingを始めよう 〜Cursorを例に、ノーコードでのプログラミング体験〜
iPride Co., Ltd.
 
Visual Studio 2019 Updates Pickup!
Hiroyuki Mori
 
C# 3.0 以降
Fujio Kojima
 
電光掲示板のコード C#で画像処理
Takuya Negishi
 
ゼロからのプログラミングRails講座 Codeanywhere版
DIVE INTO CODE Corp.
 
広がる .Net
信之 岩永
 
ソフトウェア工学2023 03 下流工程
Toru Tamaki
 
DOO-015_Azure/Windows Server 2016 から学ぶ Windows 系インフラ エンジニアのための DevOps
decode2016
 

エクストリームエンジニア5