tddの自殺 #tddex

44
kyon_mm 2013.07 .28 TDDeXchange TDDの自殺 TDDとドメインと仕様と

Upload: kyon-mm

Post on 10-May-2015

4.862 views

Category:

Documents


0 download

DESCRIPTION

2013/07/28 に開催したTDDeXchange の発表スライドです。

TRANSCRIPT

Page 1: TDDの自殺 #TDDeX

kyon_mm 2013.07.28 TDDeXchange

TDDの自殺TDDとドメインと仕様と

Page 2: TDDの自殺 #TDDeX

Self Introduction

きょん(@kyon_mm)

テストエンジニア

Groovy, C#, F#, Scala

SCMBootCamp, Nagoya.Testing, CDStudy, 基礎勉強会, Cafe.Testing, STAR

Page 3: TDDの自殺 #TDDeX

Agenda

TDDの概要

ドメイン

理想のコード

TDDとドメイン

まとめ

Page 4: TDDの自殺 #TDDeX

TDD概要

Page 6: TDDの自殺 #TDDeX

What kind of FW

TDDは次の2点を支援するフレームワーク

「開発者の意図を確認すること」

「開発者が心地よいコードを書き始める事」

Page 7: TDDの自殺 #TDDeX

TDD Foundation

客観的で頻繁にも実施できる検査群

確認し易い検査結果群

RED,GREEN,REFACTORのライフサイクル

Page 8: TDDの自殺 #TDDeX

Agenda

TDDの概要

ドメイン

理想のコード

TDDとドメイン

まとめ

Page 9: TDDの自殺 #TDDeX

ドメイン

Page 10: TDDの自殺 #TDDeX

Domain

ドメインの分け方として2分別する方法がある

アプリケーションドメイン

ソリューションドメイン

Page 11: TDDの自殺 #TDDeX

Application Domain

ソフトウェアシステムの導入によって変化させたい領域のこと。

問題ドメインと呼ばれる事が多いが、必ずしも一致しない。

Page 12: TDDの自殺 #TDDeX

Application Domain

端的な例だと、要求レベルで表現できるユーザーが達成しようとしている内容

Page 13: TDDの自殺 #TDDeX

Solution Domain

ソフトウェアシステムの個々の技術や組み合わせ方。

解決ドメイン、解決領域と翻訳されることもある。

Page 14: TDDの自殺 #TDDeX

Solution Domain

個々の言語、ライブラリ、ミドルウェアなど。

実際のコードや設定やインフラなどによる実装技術。

Page 15: TDDの自殺 #TDDeX

Agenda

TDDの概要

ドメイン

理想のコード

TDDとドメイン

まとめ

Page 16: TDDの自殺 #TDDeX

理想のコード

Page 17: TDDの自殺 #TDDeX

Best Production Code

Application DomainとSolution Domainが同一表現になること。

「やりたいことを書いた」=「実装した」

Page 18: TDDの自殺 #TDDeX

Example

MDA系

一部では概念図からプロダクトコードを自動生成することに注力している

DSL系

アプリケーションドメインをそのままかけるような専用言語によってソリューションドメイン

Page 19: TDDの自殺 #TDDeX

Example

BRMS

システムのロジックの一部をデシジョンテーブルで記述できるようにする

Page 20: TDDの自殺 #TDDeX

Domain Specific Language小休止

Page 21: TDDの自殺 #TDDeX

Real Production Code

アプリケーションドメインの記述のみで全てのソリューションドメインを記述する事はできていない。

DDDはこの2ドメイン間を橋渡しするための方法論

Page 22: TDDの自殺 #TDDeX

Domain Specific Language

DSLを2分別する方法がある

External DSL

Internal DSL

Page 23: TDDの自殺 #TDDeX

ExternalDSL /Internal DSL

ExternalDSL(外部DSL)

一つの言語として確立されているもの

SQL/XML/Regular Expression/Puppet

Page 24: TDDの自殺 #TDDeX

Internal DSL

InternalDSL(内部DSL/Embedded DSL)

ある言語の拡張として作られた言語

フレームワーク/Gradle/Chef

Page 25: TDDの自殺 #TDDeX

Agenda

TDDの概要

ドメイン

理想のコード

TDDとドメイン

まとめ

Page 26: TDDの自殺 #TDDeX

TDDとドメイン

Page 27: TDDの自殺 #TDDeX

Problem

我々の世界はそこまで綺麗にコードをかける実力もツールもない

Page 28: TDDの自殺 #TDDeX

TDD Solution

まずテストコードに達成したい事を表現する

プロダクトコードを実装する

テストが通った状態で綺麗にする

Page 29: TDDの自殺 #TDDeX

Test Code of TDD

TDDはDog Foodingである

テストコードが最初のユーザー

テストコードに要求を書いている

テストコードにアプリケーションドメインがある

Page 30: TDDの自殺 #TDDeX

Production Code of TDD

まずはある範囲で保証できるコードを書く

保証できる中で綺麗にしていく

TDDの中でどうやってテストとプロダクトを綺麗にするかは語られていない。

TDD用のリファクタリングがない

Page 31: TDDの自殺 #TDDeX
Page 32: TDDの自殺 #TDDeX

Best Production Code

アプリケーションドメイン= ソリューションドメイン

Page 33: TDDの自殺 #TDDeX

TDD

テストコード = アプリケーションドメイン

プロダクトコード = ソリューションドメイン

Page 34: TDDの自殺 #TDDeX

Product Refactoring

実際にはなんらかの形でアプリケーションドメインをプロダクトコードに入れている

命名、依存関係整理、レイヤ分割

Page 35: TDDの自殺 #TDDeX

Test Refactoring

DRY...?

Page 36: TDDの自殺 #TDDeX

Domain

テストコードにアプリケーションドメインが残ってしまっている。

アプリケーションドメインが重複している。

Page 37: TDDの自殺 #TDDeX

Domain

重複しているだけならまだいい。

実際には違うものが表現されている。

Page 38: TDDの自殺 #TDDeX

Example

TestDouble

Integration Test

Page 39: TDDの自殺 #TDDeX

Domain

TestDoubleもしくはIntegrationTestのsetupを書く事で、既にある他の機能の劣化コピーもしくは完全なコピーを書く事になる。

Page 40: TDDの自殺 #TDDeX

Domain

ツールとTDDの都合でテストコードもしくはプロダクトコードにあるアプリケーションドメインを変化させてコピーしなければいけない

Page 41: TDDの自殺 #TDDeX

Domain

そのテストを動かすために最短でセットアップできるものを書くのは本当に正しいのかも怪しい。

何よりアプリケーションドメインが重複している。

Page 42: TDDの自殺 #TDDeX

TDD Suicide

プロダクトコードからアプリケーションドメインが漏れたり、埋め込まれないことがある

それを促進する力がTDDにはある

Page 43: TDDの自殺 #TDDeX

TDD Suicide

アプリケーションドメインがないプロダクトコードなんて何やっているかわからない死体と同然である。

TDDは開発の理想を壊す、守るべきプロダクトコードを死体にしてしまう事がある。だが、それに気づきにくい。

Page 44: TDDの自殺 #TDDeX

TDD Suicide

レゾンデートルを自ら破壊してしまうというTDDはまさに自殺しているに等しい。

「ドメインの重複、エセドメインの生産をしてプロダクトコードをダメにしてしまう」というTDDは自殺している。これをTDDの自殺という。