狠狠撸

狠狠撸Share a Scribd company logo
わんくま同盟 名古屋勉強会 #37 1
C# での
リファクタリング
TDD 道場 #25
BluewaterSoft 2015/11/14 biac
わんくま同盟 名古屋勉強会 #37 2
スピーカー紹介: biac as 山本 康彦
? 宇宙世紀以前の生まれ
スプートニク1号より3ヶ月ほど前
? 最初は HONDA
クルマの設計/研究を10年くら
いやってた
? 今は BluewaterSoft
を名乗ってアプリ開発とか技術
解説記事とか
? 「NUnitの全貌」?
CodeZine 2012/4
わんくま同盟 名古屋勉強会 #37 3
【CM】 C#で始めるテスト駆動開発入門
? CodeZine 連載再開?
? #08「ユニバーサル
Windowsアプリのユニット
テスト(前編)」
? #09「ユニバーサル
Windowsアプリのユニット
テスト(後編)」
? #10「状態を持つクラスを
テストファーストする」
わんくま同盟 名古屋勉強会 #37 4
TDD = テスト ファースト + リファクタリング
?テスト ファースト: RED と GREEN の繰り返し
?リファクタリング: GREEN を維持したまま実装を
改善
失敗するはずのユニット テストを1つ書き、
失敗することを確認 (=RED)
ユニット テストに通るだけの実装を追加し、
成功することを確認 (=GREEN)
わんくま同盟 名古屋勉強会 #37 5
TDD 3原則 by Robert C Martin
?ArticleS.UncleBob.TheThreeRulesOfTdd (2005) より。
※ 実質は「テスト ファースト 3原則」
1. 失敗するユニットテストを成功させるためにしか、
プロダクトコードを書いてはならない。
2. 失敗させるためにしか、ユニットテストを書いて
はならない。コンパイルエラーは失敗に数える。
3. ユニットテストを1つだけ成功させる以上に、プロ
ダクトコードを書いてはならない。
わんくま同盟 名古屋勉強会 #37 6
TDD MANTRA
? 『Test-Driven
Development: By
Example』からの引用
? テスト駆動開発において
我々は、
?自動テストが失敗してい
る場合に限り、 新しい
コードを書く
?重複を取り除く
? OneDrive で公開
http://1drv.ms/1uz3Z2P
わんくま同盟 名古屋勉強会 #37 7
今年のテーマ
?TDDの半分はテスト ファースト。
残り半分は…
リファクタリング
(refactoring)
わんくま同盟 名古屋勉強会 #37 8
リファクタリング by Martin Fowler
?「リファクタリングとは、コードの外的な振る舞
いを変更せずに、内部の構造を作りかえること」
http://refactoring.com/
Refactoring is … altering its internal structure
without changing its external behavior.
わんくま同盟 名古屋勉強会 #37 9
リファクタリングを学ぶには?
?「リファクタリング ― 既
存のコードを安全に改善
する ―」
by Martin Fowler
http://amzn.to/1C6rzHL
※ 原書は 1999/6 発行
わんくま同盟 名古屋勉強会 #37 10
「リファクタリング」 は造語
?「リファクタリング」は造語
?考案者は不明。Fowler ではない
(例: 1992年の論文)
The refactorings are defined to be behavior
preserving, (リファクタリングは、振る舞いを
維持するように定義される…)
わんくま同盟 名古屋勉強会 #37 11
リファクタリング本にない
リファクタリング
?リファクタリングを学ぶには、「リファクタリング本」?
?でも、原著は J2SE 1.2 時代のもの
?今どきの Java では?
?今どきの C# では?
わんくま同盟 名古屋勉強会 #37 12
原著のリファクタリング例
?「コレクションのカプセル化」より(新版p.210)
class Person …
private Set _courses;
public void setCourses(Set arg) {
_courses = arg;
}
class Person …
…
public void initializeCourses(Set arg) {
Assert.isTrue(_coursec.isEmpty());
Iterator iter = arg.Iterator();
while(iter.hasNext()) {
addCourse((Course)iter.next());
}
}
?意図を明確化
?安全性を向上
でも、このへんは
ダサイよね?
わんくま同盟 名古屋勉強会 #37 13
今どきの Java なら
?新版 p.423 より
class Person …
…
public void initializeCourses(Set arg) {
Assert.isTrue(_course.isEmpty());
Iterator iter = arg.Iterator();
while(iter.hasNext()) {
addCourse((Course)iter.next());
}
}
J2SE 5 で
再リファクタリング
ジェネリクスと for each
class Person …
…
public void
initializeCourses(Set<Course> arg) {
assert _course.isEmpty();
for(Course aCourse : arg) {
addCourse(aCourse));
}
}
わんくま同盟 名古屋勉強会 #37 14
今どきの C# なら
?当然、ジェネリクスと foreach 使え
class Person …
…
public void
InitializeCourses(IEnumerable<Course> arg)
{
Debug.Assert(_course.Count == 0);
foreach(var aCourse in arg)
{
AddCourse(aCourse);
}
}
わんくま同盟 名古屋勉強会 #37 15
今どきの C# の
リファクタリング
今どきの C# でのリファクタリングをいくつか紹介
?ループ
?null チェック
?画面のデータ
?テンプレート パターン
わんくま同盟 名古屋勉強会 #37 16
C# : ループをLINQにリファクタリング
?コレクションに対するループ処理
public bool HasAdvancedCourse
{
get
{
foreach (var c in Courses)
if (c.IsAdvanced)
return true;
return false;
}
}
C# 6で
リファクタリング
LINQ (+ラムダ式)
public bool HasAdvancedCourse
=> Courses.Any(c => c.IsAdvanced);
わんくま同盟 名古屋勉強会 #37 17
C# : ガード節を null propagation 演算子に
?null チェック
(リファクタリング本では null オブジェクトを導入)
public string Foo(SampleClass arg)
{
if(arg == null
|| arg.Bar == null)
return null;
return arg.Bar.Buz();
}
C# 6で
リファクタリング
null propagation 演算子
public string Foo(SampleClass arg)
{
return arg?.Bar?.Buz();
}
わんくま同盟 名古屋勉強会 #37 18
C# : 画面のデータをデータバインディングで分離
? 「観察されるデータの複製」(複製されたデータが画面にある)
? データバインディングでロジック側のデータと同期
(リファクタリング本ではObserverパターンの導入)
? データバインディングは、.NET では汎用的なスキル
Windows Forms / WPF / ストアアプリ / UWP アプリ
わんくま同盟 名古屋勉強会 #37 19
C# : テンプレートパターン ? ラムダ式 (その1)
?似た処理を同じ順序で実行する2つのクラス
(リファクタリング本ではテンプレートパターンを導入)
public class SampleClass
{
// テンプレートメソッド
public int Calc(int x)
{
var work = Foo(x);
work = Bar(work); // ? この中身だけがちょっと違う2つの処理
return Buz(work);
}
private SampleClass() {
// 外部からのインスタンス化を禁止
}
わんくま同盟 名古屋勉強会 #37 20
C# : テンプレートパターン ? ラムダ式 (その2)
?問題の本質は、安全にメソッドを差し替えること
// テンプレートメソッド内で使うメソッド定義
int Foo(int x) => x % 7;
Func<int, int> Bar; // 差し替え可能
int Buz(int x) => x + 1;
// Bar メソッドを確定してインスタンスを生成
public static SampleClass CreateInstanceA() {
return new SampleClass() { Bar = (x) => x * 2, };
}
public static SampleClass CreateInstanceB() {
return new SampleClass() { Bar = (x) => x * 3, };
}
}
わんくま同盟 名古屋勉強会 #37 21
まとめ : リファクタリング マスターへの道
?基礎 : 「リファクタリン
グ ― 既存のコードを安全
に改善する ―」
by Martin Fowler
http://amzn.to/1C6rzHL
?
?最新の開発環境に合った
リファクタリングの研究
わんくま同盟 名古屋勉強会 #37 22
Visual Studio Community 2015
?無償の Visual Studio
?ライセンス制限アリ (個人利用なら無条件でOK!)
詳細は?http://www.microsoft.com/ja-jp/dev/products/community.aspx
?Professionalとほぼ同等
?ダウンロード
https://www.visualstudio.com/products/visual-studio-community-vs
Visual Studio Community は、個人の開発者、オープン ソース プロジェクト、アカデミックな研究、教育、中小企業の専門家チームのための無料のコミュニティです。
わんくま同盟 名古屋勉強会 #37 23
ご清聴ありがとうございました

More Related Content

What's hot (20)

PDF
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
Osamu Monoe
?
PDF
Universal Apps (UWP)
Shin-ya Koga
?
PPTX
鲍飞辫ハンズオン参加レポート
Makoto Nishimura
?
PPTX
.NET vNext
信之 岩永
?
PDF
Empower every App and every Developer in a Mobile-first, Cloud-first World.
Akira Inoue
?
PPTX
新しい Visual Studio & .NET と新時代のアーキテクチャ
慎一 古賀
?
PPTX
いまさら学ぶ惭痴痴惭パターン
Yuta Matsumura
?
PPTX
その後のBash on windows
Kazushi Kamegawa
?
PDF
WebRTC開発者向けプラットフォーム SkyWayの裏側
Yusuke Naka
?
PDF
笔测迟丑辞苍で始める奥别产アプリケーション开発
Takahiro Kubo
?
PPTX
JavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップ
慎一 古賀
?
PPTX
笔测迟丑辞苍を中心としたチーム开発
Ryo Takahashi
?
PDF
あるゲームアプリケーションの构成とアップデートサイクル
Kentaro Iizuka
?
PPTX
C++からC#まで Visual Studio 縛り (で死ぬ実験)
Takashi Kawasaki
?
PDF
Visual Studio Code #phpcon2015
Aya Tokura
?
PDF
Win32 APIをてなずけよう
Kouji Matsui
?
PDF
.NET の今と今後に思うこと (Tokyo Ver.)
Akira Inoue
?
PDF
Introducing Fluent Design
c-mitsuba
?
PDF
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
Yasuhiko Yamamoto
?
PDF
Silverlight to Next オンライン セミナー
インフラジスティックス?ジャパン株式会社
?
Visual Studio 2013 と HTML5 で実現するマルチデバイス/マルチプラットフォーム アプリの開発
Osamu Monoe
?
Universal Apps (UWP)
Shin-ya Koga
?
鲍飞辫ハンズオン参加レポート
Makoto Nishimura
?
.NET vNext
信之 岩永
?
Empower every App and every Developer in a Mobile-first, Cloud-first World.
Akira Inoue
?
新しい Visual Studio & .NET と新時代のアーキテクチャ
慎一 古賀
?
いまさら学ぶ惭痴痴惭パターン
Yuta Matsumura
?
その後のBash on windows
Kazushi Kamegawa
?
WebRTC開発者向けプラットフォーム SkyWayの裏側
Yusuke Naka
?
笔测迟丑辞苍で始める奥别产アプリケーション开発
Takahiro Kubo
?
JavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップ
慎一 古賀
?
笔测迟丑辞苍を中心としたチーム开発
Ryo Takahashi
?
あるゲームアプリケーションの构成とアップデートサイクル
Kentaro Iizuka
?
C++からC#まで Visual Studio 縛り (で死ぬ実験)
Takashi Kawasaki
?
Visual Studio Code #phpcon2015
Aya Tokura
?
Win32 APIをてなずけよう
Kouji Matsui
?
.NET の今と今後に思うこと (Tokyo Ver.)
Akira Inoue
?
Introducing Fluent Design
c-mitsuba
?
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?
Yasuhiko Yamamoto
?
Silverlight to Next オンライン セミナー
インフラジスティックス?ジャパン株式会社
?

Similar to わんくま名古屋 #37 (20151114) TDD道場 #25 (20)

PPTX
わんくま名古屋 #32 (20140823) TDD道場 #20
Yasuhiko Yamamoto
?
PDF
わんくま名古屋#31(20140524) TDD道場 #19
Yasuhiko Yamamoto
?
PDF
TDD を自分の道具にしよう
yujiorama
?
PPT
タダで始めるテストファースト入門 ~ C# Express + NUnit
Yasuhiko Yamamoto
?
PDF
わんくま名古屋#33(20141115) TDD道場#21
Yasuhiko Yamamoto
?
PDF
わんくま名古屋#34(20150214) TDD道場#22
Yasuhiko Yamamoto
?
PDF
C# から java へのプログラム移植で体験したtddの効果は?
Shinichi Hirauchi
?
PPTX
わんくま名古屋#28(20130824) c#で、ライフゲームを高速化してみるよ
Yasuhiko Yamamoto
?
PDF
TDDの原理 ~ スペック?ファースト
Yasuhiko Yamamoto
?
PDF
C#coding guideline その2_20130325
Yoshihisa Ozaki
?
PPTX
罢顿顿をやってみた
Yuta Kawadai
?
PPTX
Visual Studio による開発環境?プログラミングの進化
Fujio Kojima
?
PDF
わんくま名古屋#25(20121201) TDD道場#13 ~ Metroアプリをテストファーストするときのポイント
Yasuhiko Yamamoto
?
PDF
テストコードの定型化
Shinichi Hirauchi
?
PDF
Modeling Workshop
You&I
?
PDF
C# コーディングガイドライン 2013/02/26
Yoshihisa Ozaki
?
PPTX
Test Manager + Team Foundation Server /Visual Studio Team Services 手順書(共有パラメー...
Masaki Takeda
?
PDF
知って得する颁#
Shota Baba
?
PPTX
CLRH_120414_WFTDD
Tomoyuki Obi
?
PDF
オブジェクト指向できていますか?
Moriharu Ohzu
?
わんくま名古屋 #32 (20140823) TDD道場 #20
Yasuhiko Yamamoto
?
わんくま名古屋#31(20140524) TDD道場 #19
Yasuhiko Yamamoto
?
TDD を自分の道具にしよう
yujiorama
?
タダで始めるテストファースト入門 ~ C# Express + NUnit
Yasuhiko Yamamoto
?
わんくま名古屋#33(20141115) TDD道場#21
Yasuhiko Yamamoto
?
わんくま名古屋#34(20150214) TDD道場#22
Yasuhiko Yamamoto
?
C# から java へのプログラム移植で体験したtddの効果は?
Shinichi Hirauchi
?
わんくま名古屋#28(20130824) c#で、ライフゲームを高速化してみるよ
Yasuhiko Yamamoto
?
TDDの原理 ~ スペック?ファースト
Yasuhiko Yamamoto
?
C#coding guideline その2_20130325
Yoshihisa Ozaki
?
罢顿顿をやってみた
Yuta Kawadai
?
Visual Studio による開発環境?プログラミングの進化
Fujio Kojima
?
わんくま名古屋#25(20121201) TDD道場#13 ~ Metroアプリをテストファーストするときのポイント
Yasuhiko Yamamoto
?
テストコードの定型化
Shinichi Hirauchi
?
Modeling Workshop
You&I
?
C# コーディングガイドライン 2013/02/26
Yoshihisa Ozaki
?
Test Manager + Team Foundation Server /Visual Studio Team Services 手順書(共有パラメー...
Masaki Takeda
?
知って得する颁#
Shota Baba
?
CLRH_120414_WFTDD
Tomoyuki Obi
?
オブジェクト指向できていますか?
Moriharu Ohzu
?
Ad

More from Yasuhiko Yamamoto (16)

PDF
わんくま名古屋 #40 (20161217) Xamarinで自動化テストしよう
Yasuhiko Yamamoto
?
PDF
わんくま名古屋 #38 (20160521) Xamarin入門
Yasuhiko Yamamoto
?
PDF
わんくま名古屋#33(20141115) モノ作り半生
Yasuhiko Yamamoto
?
PDF
開発ツールを買わずに作る? ユニバーサルWindowsアプリ!
Yasuhiko Yamamoto
?
PDF
わんくま名古屋#31(20140524) ユニバーサルWindowsアプリ開発の勧め
Yasuhiko Yamamoto
?
PDF
Windows ストア アプリでスレッド間排他処理
Yasuhiko Yamamoto
?
PPTX
Windows 8.1 Update 1 の噂をまとめてみた
Yasuhiko Yamamoto
?
PPTX
わんくま名古屋 #29 (2013/11/23) TDD道場 #17
Yasuhiko Yamamoto
?
PPTX
Windows 8.1 ストア アプリ first look for 8.0 developers! [ss]
Yasuhiko Yamamoto
?
PPTX
Windowsストアアプリでウイルスを作るには!? cod2013名古屋
Yasuhiko Yamamoto
?
PPTX
わんくま名古屋#27(20130518) データバインディングを極める
Yasuhiko Yamamoto
?
PDF
プログラマとデザイナで時計を作るVisual studioハッカソン ~ TDDの考え方を開発全体に応用してみよう!
Yasuhiko Yamamoto
?
PDF
わんくま名古屋#25(20121201) 「Win8ストア?アプリ WP8アプリ、両面撃破作戦」
Yasuhiko Yamamoto
?
PDF
わんくま名古屋#25(20121201) LT:「開発体験テンプレートを使ったストアアプリの作成」
Yasuhiko Yamamoto
?
PPTX
テンプレートを使ったストアアプリの作成
Yasuhiko Yamamoto
?
PDF
Metroアプリの作り方 (COD2012)
Yasuhiko Yamamoto
?
わんくま名古屋 #40 (20161217) Xamarinで自動化テストしよう
Yasuhiko Yamamoto
?
わんくま名古屋 #38 (20160521) Xamarin入門
Yasuhiko Yamamoto
?
わんくま名古屋#33(20141115) モノ作り半生
Yasuhiko Yamamoto
?
開発ツールを買わずに作る? ユニバーサルWindowsアプリ!
Yasuhiko Yamamoto
?
わんくま名古屋#31(20140524) ユニバーサルWindowsアプリ開発の勧め
Yasuhiko Yamamoto
?
Windows ストア アプリでスレッド間排他処理
Yasuhiko Yamamoto
?
Windows 8.1 Update 1 の噂をまとめてみた
Yasuhiko Yamamoto
?
わんくま名古屋 #29 (2013/11/23) TDD道場 #17
Yasuhiko Yamamoto
?
Windows 8.1 ストア アプリ first look for 8.0 developers! [ss]
Yasuhiko Yamamoto
?
Windowsストアアプリでウイルスを作るには!? cod2013名古屋
Yasuhiko Yamamoto
?
わんくま名古屋#27(20130518) データバインディングを極める
Yasuhiko Yamamoto
?
プログラマとデザイナで時計を作るVisual studioハッカソン ~ TDDの考え方を開発全体に応用してみよう!
Yasuhiko Yamamoto
?
わんくま名古屋#25(20121201) 「Win8ストア?アプリ WP8アプリ、両面撃破作戦」
Yasuhiko Yamamoto
?
わんくま名古屋#25(20121201) LT:「開発体験テンプレートを使ったストアアプリの作成」
Yasuhiko Yamamoto
?
テンプレートを使ったストアアプリの作成
Yasuhiko Yamamoto
?
Metroアプリの作り方 (COD2012)
Yasuhiko Yamamoto
?
Ad

Recently uploaded (13)

PDF
渔船に搭载されている电子装备と渔法について冲痴搁颁海洋学研究会冲海の尝罢会発表资料
Yuuitirou528 default
?
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
?
PDF
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
?
PDF
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
?
PDF
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
?
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
?
PDF
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
?
PDF
第3回テ?シ?タル理学疗法学会のシンポジウム「デジタル理学疗法の组织活用:教育?管理?研究を繋ぐ新たな地平」での话题提供
Matsushita Laboratory
?
PDF
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
?
PDF
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
?
PDF
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
?
PDF
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
?
PDF
第3回デジタル理学疗法研究会学术大会シンポジウム「デジタル理学疗法の组织活用:教育?管理?研究を繋ぐ新たな地平」の讲演资料.
Matsushita Laboratory
?
渔船に搭载されている电子装备と渔法について冲痴搁颁海洋学研究会冲海の尝罢会発表资料
Yuuitirou528 default
?
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
?
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
?
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
?
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
?
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
?
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
?
第3回テ?シ?タル理学疗法学会のシンポジウム「デジタル理学疗法の组织活用:教育?管理?研究を繋ぐ新たな地平」での话题提供
Matsushita Laboratory
?
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
?
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
?
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
?
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
?
第3回デジタル理学疗法研究会学术大会シンポジウム「デジタル理学疗法の组织活用:教育?管理?研究を繋ぐ新たな地平」の讲演资料.
Matsushita Laboratory
?

わんくま名古屋 #37 (20151114) TDD道場 #25

  • 1. わんくま同盟 名古屋勉強会 #37 1 C# での リファクタリング TDD 道場 #25 BluewaterSoft 2015/11/14 biac
  • 2. わんくま同盟 名古屋勉強会 #37 2 スピーカー紹介: biac as 山本 康彦 ? 宇宙世紀以前の生まれ スプートニク1号より3ヶ月ほど前 ? 最初は HONDA クルマの設計/研究を10年くら いやってた ? 今は BluewaterSoft を名乗ってアプリ開発とか技術 解説記事とか ? 「NUnitの全貌」? CodeZine 2012/4
  • 3. わんくま同盟 名古屋勉強会 #37 3 【CM】 C#で始めるテスト駆動開発入門 ? CodeZine 連載再開? ? #08「ユニバーサル Windowsアプリのユニット テスト(前編)」 ? #09「ユニバーサル Windowsアプリのユニット テスト(後編)」 ? #10「状態を持つクラスを テストファーストする」
  • 4. わんくま同盟 名古屋勉強会 #37 4 TDD = テスト ファースト + リファクタリング ?テスト ファースト: RED と GREEN の繰り返し ?リファクタリング: GREEN を維持したまま実装を 改善 失敗するはずのユニット テストを1つ書き、 失敗することを確認 (=RED) ユニット テストに通るだけの実装を追加し、 成功することを確認 (=GREEN)
  • 5. わんくま同盟 名古屋勉強会 #37 5 TDD 3原則 by Robert C Martin ?ArticleS.UncleBob.TheThreeRulesOfTdd (2005) より。 ※ 実質は「テスト ファースト 3原則」 1. 失敗するユニットテストを成功させるためにしか、 プロダクトコードを書いてはならない。 2. 失敗させるためにしか、ユニットテストを書いて はならない。コンパイルエラーは失敗に数える。 3. ユニットテストを1つだけ成功させる以上に、プロ ダクトコードを書いてはならない。
  • 6. わんくま同盟 名古屋勉強会 #37 6 TDD MANTRA ? 『Test-Driven Development: By Example』からの引用 ? テスト駆動開発において 我々は、 ?自動テストが失敗してい る場合に限り、 新しい コードを書く ?重複を取り除く ? OneDrive で公開 http://1drv.ms/1uz3Z2P
  • 7. わんくま同盟 名古屋勉強会 #37 7 今年のテーマ ?TDDの半分はテスト ファースト。 残り半分は… リファクタリング (refactoring)
  • 8. わんくま同盟 名古屋勉強会 #37 8 リファクタリング by Martin Fowler ?「リファクタリングとは、コードの外的な振る舞 いを変更せずに、内部の構造を作りかえること」 http://refactoring.com/ Refactoring is … altering its internal structure without changing its external behavior.
  • 9. わんくま同盟 名古屋勉強会 #37 9 リファクタリングを学ぶには? ?「リファクタリング ― 既 存のコードを安全に改善 する ―」 by Martin Fowler http://amzn.to/1C6rzHL ※ 原書は 1999/6 発行
  • 10. わんくま同盟 名古屋勉強会 #37 10 「リファクタリング」 は造語 ?「リファクタリング」は造語 ?考案者は不明。Fowler ではない (例: 1992年の論文) The refactorings are defined to be behavior preserving, (リファクタリングは、振る舞いを 維持するように定義される…)
  • 11. わんくま同盟 名古屋勉強会 #37 11 リファクタリング本にない リファクタリング ?リファクタリングを学ぶには、「リファクタリング本」? ?でも、原著は J2SE 1.2 時代のもの ?今どきの Java では? ?今どきの C# では?
  • 12. わんくま同盟 名古屋勉強会 #37 12 原著のリファクタリング例 ?「コレクションのカプセル化」より(新版p.210) class Person … private Set _courses; public void setCourses(Set arg) { _courses = arg; } class Person … … public void initializeCourses(Set arg) { Assert.isTrue(_coursec.isEmpty()); Iterator iter = arg.Iterator(); while(iter.hasNext()) { addCourse((Course)iter.next()); } } ?意図を明確化 ?安全性を向上 でも、このへんは ダサイよね?
  • 13. わんくま同盟 名古屋勉強会 #37 13 今どきの Java なら ?新版 p.423 より class Person … … public void initializeCourses(Set arg) { Assert.isTrue(_course.isEmpty()); Iterator iter = arg.Iterator(); while(iter.hasNext()) { addCourse((Course)iter.next()); } } J2SE 5 で 再リファクタリング ジェネリクスと for each class Person … … public void initializeCourses(Set<Course> arg) { assert _course.isEmpty(); for(Course aCourse : arg) { addCourse(aCourse)); } }
  • 14. わんくま同盟 名古屋勉強会 #37 14 今どきの C# なら ?当然、ジェネリクスと foreach 使え class Person … … public void InitializeCourses(IEnumerable<Course> arg) { Debug.Assert(_course.Count == 0); foreach(var aCourse in arg) { AddCourse(aCourse); } }
  • 15. わんくま同盟 名古屋勉強会 #37 15 今どきの C# の リファクタリング 今どきの C# でのリファクタリングをいくつか紹介 ?ループ ?null チェック ?画面のデータ ?テンプレート パターン
  • 16. わんくま同盟 名古屋勉強会 #37 16 C# : ループをLINQにリファクタリング ?コレクションに対するループ処理 public bool HasAdvancedCourse { get { foreach (var c in Courses) if (c.IsAdvanced) return true; return false; } } C# 6で リファクタリング LINQ (+ラムダ式) public bool HasAdvancedCourse => Courses.Any(c => c.IsAdvanced);
  • 17. わんくま同盟 名古屋勉強会 #37 17 C# : ガード節を null propagation 演算子に ?null チェック (リファクタリング本では null オブジェクトを導入) public string Foo(SampleClass arg) { if(arg == null || arg.Bar == null) return null; return arg.Bar.Buz(); } C# 6で リファクタリング null propagation 演算子 public string Foo(SampleClass arg) { return arg?.Bar?.Buz(); }
  • 18. わんくま同盟 名古屋勉強会 #37 18 C# : 画面のデータをデータバインディングで分離 ? 「観察されるデータの複製」(複製されたデータが画面にある) ? データバインディングでロジック側のデータと同期 (リファクタリング本ではObserverパターンの導入) ? データバインディングは、.NET では汎用的なスキル Windows Forms / WPF / ストアアプリ / UWP アプリ
  • 19. わんくま同盟 名古屋勉強会 #37 19 C# : テンプレートパターン ? ラムダ式 (その1) ?似た処理を同じ順序で実行する2つのクラス (リファクタリング本ではテンプレートパターンを導入) public class SampleClass { // テンプレートメソッド public int Calc(int x) { var work = Foo(x); work = Bar(work); // ? この中身だけがちょっと違う2つの処理 return Buz(work); } private SampleClass() { // 外部からのインスタンス化を禁止 }
  • 20. わんくま同盟 名古屋勉強会 #37 20 C# : テンプレートパターン ? ラムダ式 (その2) ?問題の本質は、安全にメソッドを差し替えること // テンプレートメソッド内で使うメソッド定義 int Foo(int x) => x % 7; Func<int, int> Bar; // 差し替え可能 int Buz(int x) => x + 1; // Bar メソッドを確定してインスタンスを生成 public static SampleClass CreateInstanceA() { return new SampleClass() { Bar = (x) => x * 2, }; } public static SampleClass CreateInstanceB() { return new SampleClass() { Bar = (x) => x * 3, }; } }
  • 21. わんくま同盟 名古屋勉強会 #37 21 まとめ : リファクタリング マスターへの道 ?基礎 : 「リファクタリン グ ― 既存のコードを安全 に改善する ―」 by Martin Fowler http://amzn.to/1C6rzHL ? ?最新の開発環境に合った リファクタリングの研究
  • 22. わんくま同盟 名古屋勉強会 #37 22 Visual Studio Community 2015 ?無償の Visual Studio ?ライセンス制限アリ (個人利用なら無条件でOK!) 詳細は?http://www.microsoft.com/ja-jp/dev/products/community.aspx ?Professionalとほぼ同等 ?ダウンロード https://www.visualstudio.com/products/visual-studio-community-vs Visual Studio Community は、個人の開発者、オープン ソース プロジェクト、アカデミックな研究、教育、中小企業の専門家チームのための無料のコミュニティです。
  • 23. わんくま同盟 名古屋勉強会 #37 23 ご清聴ありがとうございました