Tokyo Rubykaigi 01 t-wada

Takuto Wada
Takuto WadaChief Executive Programmer at Towersquest
それRubyでも
やりたい
ライブラリ移植と機能拡張のためのパターンランゲージ
和田 卓人 (a.k.a id:t-wada)
Aug, 21, 2008 @TokyoRubyKaigi 01
Tokyo Rubykaigi 01 t-wada
多様性
Regional
RubyKaigi
に光あれ
続け!
自己紹介
名前: 和田 卓人 (わだ たくと)
メール: takuto.wada@towersquest.jp
ブログ: http://d.hatena.ne.jp/t-wada
Twitter: t_wada
Wassr: twada
自己紹介
タワーズ・クエスト株式会社
プログラマ 兼 取締役社長
これまで書いたもの
WEB + DB PRESS
vol.35 「実演! テスト駆動開発」
vol.37 「実演! リファクタリング」
vol.42 「現場で使えるREST」
LifeHacks PRESS
オープンソースマガジン(リレーコラム)
他いろいろ
gihyoコラボ企画
『[動画で解説]和田卓人の テスト駆動開発 講座』
http://gihyo.jp/dev/serial/01/tdd/
全20回すべて動画付き解説
ニコニコ動画でも見れます
WEB+DB過去記事の特設サイトや動画
デブサミ
• デベロッパーテスティング・ライブ - 自信を持ってコードを書
くための心・技・体 -
• 【徹底討論】テストなんていらない?!-テストを、どこ
までやるべきか?
• そしてデブサミ 2009 へ
• テストトラックのコンテンツ委員になりました
よろしく
おねがい
します
Agenda
•移植した中身のこと
•移植する方法のこと
•Q & A
第一部
移植した
中身のこと
背景
始めに問題意識ありき
•複雑な テーブル構造
•既にレールに乗れない
•多くのテーブルを JOIN しな
ければならない要件
餅は餅屋
•CASE句
•UNION ALL
•RDBMS固有の関数
SQL書きたい
S2Dao
•80:20
•2WaySQL
•手書きのSQL をサポート
•SQL を知っていれば書ける
2 Way SQL
代入コメント
(1)
SELECT
*
FROM
emp
WHERE
job = /*ctx[:job]*/'CLERK'
AND
deptno = /*ctx[:deptno]*/20
外部SQL
SELECT
*
FROM
emp
WHERE
job = /*ctx[:job]*/'CLERK'
AND
deptno = /*ctx[:deptno]*/20
からくり
SELECT
*
FROM
emp
WHERE
job = /*ctx[:job]*/'CLERK'
AND
deptno = /*ctx[:deptno]*/20
Given
ctx[:job] = 'MANAGER'
ctx[:deptno] = 30
When
SELECT
*
FROM
emp
WHERE
job = ?
AND
deptno = ?
Then
と、 ['MANAGER', 30]
代入コメント
(2)
SELECT
*
FROM
emp
WHERE
job = /*ctx[:job]*/'CLERK'
AND
id IN /*ctx[:ids]*/(10,11)
Given
ctx[:job] = 'MANAGER'
ctx[:ids] = [30,40,50]
When
SELECT
*
FROM
emp
WHERE
job = ?
AND
ids IN (?, ?, ?)
Then
[ 'MANAGER',
30,
40,
50 ]
IF コメント
SELECT * FROM emp
WHERE
job = /*ctx[:job]*/'CLERK'
/*IF ctx[:age]*/AND age > /
*ctx[:age]*/20/*END*/
Given
ctx[:job] = 'MANAGER'
ctx[:age] = 30
When
SELECT * FROM emp
WHERE
job = ?
AND age > ?
Then
と、 ['MANAGER', 30]
SELECT * FROM emp
WHERE
job = /*ctx[:job]*/'CLERK'
/*IF ctx[:age]*/AND age > /
*ctx[:age]*/20/*END*/
Given
ctx[:job] = 'MANAGER'
ctx[:age] = nil
When
SELECT * FROM emp
WHERE
job = /*ctx[:job]*/'CLERK'
/*IF ctx[:age]*/AND age > /
*ctx[:age]*/20/*END*/
Then
SELECT * FROM emp
WHERE
job = ?
Then
と、 ['MANAGER']
BEGIN
コメント
SELECT * FROM emp
/*BEGIN*/WHERE
/*IF ctx[:job]*/ job = /*ctx[:job]*/'CLERK'/*END*/
/*IF ctx[:age]*/AND age > /*ctx[:age]*/25/*END*/
/*END*/
Given
ctx[:job] = nil
ctx[:age] = 35
When
SELECT * FROM emp
/*BEGIN*/WHERE
/*IF ctx[:job]*/ job = /*ctx[:job]*/'CLERK'/*END*/
/*IF ctx[:age]*/AND age > /*ctx[:age]*/25/*END*/
/*END*/
Then
SELECT * FROM emp
WHERE
age > ?
Then
と、 [35]
SELECT * FROM emp
/*BEGIN*/WHERE
/*IF ctx[:job]*/ job = /*ctx[:job]*/'CLERK'/*END*/
/*IF ctx[:age]*/AND age > /*ctx[:age]*/25/*END*/
/*END*/
Given
ctx[:job] = nil
ctx[:age] = nil
When
SELECT * FROM emp
/*BEGIN*/WHERE
/*IF ctx[:job]*/ job = /*ctx[:job]*/'CLERK'/*END*/
/*IF ctx[:age]*/AND age > /*ctx[:age]*/25/*END*/
/*END*/
Then
SELECT * FROM emp
Then
と、 [ ]
第一部
完
第二部
移植する
方法のこと
検討
本当に移植すべきか?
•定番ライブラリではダメか
•代替案はないのか
•早急に結論を出す前に、定番を
調べるべし
全部移植すべきか?
•対象ライブラリの美点は何か
•既にあるライブラリでも実現で
きることは何か
移植
最初に確認すること
•対象コードのテストはあるか
•対象機能(の美点)は切り出し可
能か
テストが無い場合
• 残念ながら、レガシーコードです
• 本日は詳細は割愛
• WEwLC 読書会を行っています
• http://groups.google.co.jp/group/legacy-code
大原則:
一度に複数を
相手にしない
動作する、きれいなコードへ
きれい
汚い
(すぐには)動かない 動作する
二つの道がある
逐語訳的移植
Context 言語間で移植しようとしている
Force
ともかくまず動くところまで
持っていきたい
Solution
設計や名前を変えずに、まず言
語間の移植のみに集中する
逐語訳的テスト移植
Context
テストコードを移植しようとし
ている
Force
安全に移植したいが、
テストのテストは存在しない
Solution
テストの設計や語彙を変えず
に、まず言語間の移植に集中
変えないもの
•xUnit という共通語彙
•設計
•クラスやメソッドの名前
•クラス構造 (interface除く)
変えたもの
•言語間の違い
•静的型付けから動的型付けへ
•予約語
•xUnit の方言
Java コード
public void testNext() throws Exception {
String sql = "SELECT * FROM emp";
SqlTokenizer tokenizer = new SqlTokenizerImpl(sql);
assertEquals("1", SqlTokenizer.SQL, tokenizer.next());
assertEquals("2", sql, tokenizer.getToken());
assertEquals("3", SqlTokenizer.EOF, tokenizer.next());
assertEquals("4", null, tokenizer.getToken());
}
Ruby コード
def testNext
sql = "SELECT * FROM emp"
tokenizer = SqlTokenizer.new(sql)
assert_equal(SqlTokenizer::SQL, tokenizer.go_next(), "1")
assert_equal(sql, tokenizer.getToken(), "2")
assert_equal(SqlTokenizer::EOF, tokenizer.go_next(), "3")
assert_nil(tokenizer.getToken(), "4")
end
PTSCTCPW
Port The Simplest Case That Could Possibly Work
Context 逐語訳的テスト移植を終えた
Force
グリーンが見たいが、レッドに
なるテストが多すぎる
Solution
最も単純なテストケースから実
装し、それ以外は pending
Context 移行元コードに不明点がある
Force
不明点をおいたまま先に進めた
くない
Solution
移行元コードの現在の振る舞い
を自動テストに落とし込む
Characterization Test
洗練
TDDのサイクル
1. テストを書き
2. そのテストを実行して失敗させ(Red)
3. 目的のコードを書き
4. 1で書いたテストを成功させ(Green)
5. テストが通るままでリファクタリング
を行う(Refactor)
6. 1∼5を繰り返す
TDDとコード
きれい
汚い
(すぐには)動かない 動作する
Red
Green
Refactoring
TDDと黄金の回転
きれい
汚い
(すぐには)動かない 動作する
Red
Green
Refactoring
実装のテストから
仕様のテストへ
Context
移植の最初のステップが終わっ
たので、内部を改善したい
Force 実装内部を思う存分変更したい
Solution
ホワイトボックステストを
ブラックボックステストに変換
例えば、
RSpec を
使ってみる
郷に入っては郷に従え
Context 逐語訳的移植を終えた
Force コードをきれいにしたい
Solution
移植対象言語のイディオム、ベ
ストプラクティスで書き換える
王道を知る
Context 逐語訳的移植を終えた
Force コードをきれいにしたい
Solution
設計の王道を調べ、移植対象言
語に実装が存在したら使用を検
討する
パーサジェネ
レータ
racc
ご存知、な (ry
ごめんなさいごめんなさい
racc
デカルチャー
ごめんなさいごめんなさい
割愛
ごめんなさいごめんなさい
そして
移植の
最後に
恩返し
第二部
完
Q & A
おわりに
大原則:
一度に複数を
相手にしない
TDDと黄金の回転
きれい
汚い
(すぐには)動かない 動作する
Red
Green
Refactoring
続け!
ご清聴
ありがとう
ございました
1 of 85

Recommended

WebOS Open Source Edition を試してみた by
WebOS Open Source Edition を試してみたWebOS Open Source Edition を試してみた
WebOS Open Source Edition を試してみたTetsuyuki Kobayashi
1.7K views21 slides
アジャイルサムライの次に読む技術書 by
アジャイルサムライの次に読む技術書アジャイルサムライの次に読む技術書
アジャイルサムライの次に読む技術書Takuto Wada
25.6K views30 slides
組織にテストを書く文化を根付かせる戦略と戦術 by
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
76.4K views33 slides
Hacking Vox and Plagger by
Hacking Vox and PlaggerHacking Vox and Plagger
Hacking Vox and PlaggerTatsuhiko Miyagawa
2.7K views47 slides
DevLOVE TDD - For Whom the Tests Run by
DevLOVE TDD - For Whom the Tests RunDevLOVE TDD - For Whom the Tests Run
DevLOVE TDD - For Whom the Tests RunTakuto Wada
2.4K views78 slides
DevLOVE TDD : For Whom the Tests Run by
DevLOVE TDD : For Whom the Tests RunDevLOVE TDD : For Whom the Tests Run
DevLOVE TDD : For Whom the Tests Runguest2724dc
291 views78 slides

More Related Content

Similar to Tokyo Rubykaigi 01 t-wada

Rancher と GitLab を使う3つの理由 by
Rancher と GitLab を使う3つの理由Rancher と GitLab を使う3つの理由
Rancher と GitLab を使う3つの理由Tetsurou Yano
4.1K views46 slides
Frequency with nltk by
Frequency with nltkFrequency with nltk
Frequency with nltkAtsushi Hayakawa
3K views45 slides
bicep 0.5 pre by
bicep 0.5 prebicep 0.5 pre
bicep 0.5 preTakekazu Omi
182 views29 slides
TripleO Deep Dive by
TripleO Deep DiveTripleO Deep Dive
TripleO Deep DiveTakashi Kajinami
3K views38 slides
PostgreSQL 9.5 新機能紹介 by
PostgreSQL 9.5 新機能紹介PostgreSQL 9.5 新機能紹介
PostgreSQL 9.5 新機能紹介NTT DATA OSS Professional Services
42.5K views60 slides
scala-kaigi1-sbt by
scala-kaigi1-sbtscala-kaigi1-sbt
scala-kaigi1-sbtKenji Yoshida
5.8K views122 slides

Similar to Tokyo Rubykaigi 01 t-wada(8)

More from Takuto Wada

OSS活動の活発さと評価の関係について by
OSS活動の活発さと評価の関係についてOSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係についてTakuto Wada
14.7K views64 slides
unassert - encourage reliable programming by writing assertions in production by
unassert - encourage reliable programming by writing assertions in productionunassert - encourage reliable programming by writing assertions in production
unassert - encourage reliable programming by writing assertions in productionTakuto Wada
18.1K views36 slides
OSS についてあれこれ by
OSS についてあれこれOSS についてあれこれ
OSS についてあれこれTakuto Wada
41.8K views65 slides
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」 by
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
148.6K views45 slides
power-assert, mechanism and philosophy by
power-assert, mechanism and philosophypower-assert, mechanism and philosophy
power-assert, mechanism and philosophyTakuto Wada
48.4K views29 slides
Test Yourself - テストを書くと何がどう変わるか by
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTakuto Wada
38.3K views49 slides

More from Takuto Wada(20)

OSS活動の活発さと評価の関係について by Takuto Wada
OSS活動の活発さと評価の関係についてOSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係について
Takuto Wada14.7K views
unassert - encourage reliable programming by writing assertions in production by Takuto Wada
unassert - encourage reliable programming by writing assertions in productionunassert - encourage reliable programming by writing assertions in production
unassert - encourage reliable programming by writing assertions in production
Takuto Wada18.1K views
OSS についてあれこれ by Takuto Wada
OSS についてあれこれOSS についてあれこれ
OSS についてあれこれ
Takuto Wada41.8K views
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」 by Takuto Wada
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada148.6K views
power-assert, mechanism and philosophy by Takuto Wada
power-assert, mechanism and philosophypower-assert, mechanism and philosophy
power-assert, mechanism and philosophy
Takuto Wada48.4K views
Test Yourself - テストを書くと何がどう変わるか by Takuto Wada
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada38.3K views
テスト用ライブラリ power-assert by Takuto Wada
テスト用ライブラリ power-assertテスト用ライブラリ power-assert
テスト用ライブラリ power-assert
Takuto Wada12.7K views
Reviewing RESTful Web Apps by Takuto Wada
Reviewing RESTful Web AppsReviewing RESTful Web Apps
Reviewing RESTful Web Apps
Takuto Wada9K views
power-assert in JavaScript by Takuto Wada
power-assert in JavaScriptpower-assert in JavaScript
power-assert in JavaScript
Takuto Wada9K views
TDD のこころ @ OSH2014 by Takuto Wada
TDD のこころ @ OSH2014TDD のこころ @ OSH2014
TDD のこころ @ OSH2014
Takuto Wada15.8K views
テストを書く文化を育てる戦略と戦術 by Takuto Wada
テストを書く文化を育てる戦略と戦術テストを書く文化を育てる戦略と戦術
テストを書く文化を育てる戦略と戦術
Takuto Wada49.4K views
私にとってのテスト by Takuto Wada
私にとってのテスト私にとってのテスト
私にとってのテスト
Takuto Wada16.8K views
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版) by Takuto Wada
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada70.6K views
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 by Takuto Wada
SQLアンチパターン - 開発者を待ち受ける25の落とし穴SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
Takuto Wada17.2K views
愛せないコードを書くには人生はあまりにも短い by Takuto Wada
愛せないコードを書くには人生はあまりにも短い愛せないコードを書くには人生はあまりにも短い
愛せないコードを書くには人生はあまりにも短い
Takuto Wada26.6K views
ペアプログラミング ホントのところ by Takuto Wada
ペアプログラミング ホントのところペアプログラミング ホントのところ
ペアプログラミング ホントのところ
Takuto Wada38.4K views
RESTful Web アプリの設計レビューの話 by Takuto Wada
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
Takuto Wada72.2K views
例外設計における大罪 by Takuto Wada
例外設計における大罪例外設計における大罪
例外設計における大罪
Takuto Wada68.5K views
DevLOVE DDDBC by Takuto Wada
DevLOVE DDDBCDevLOVE DDDBC
DevLOVE DDDBC
Takuto Wada3.1K views

Recently uploaded

Windows 11 information that can be used at the development site by
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development siteAtomu Hidaka
80 views41 slides
JJUG CCC.pptx by
JJUG CCC.pptxJJUG CCC.pptx
JJUG CCC.pptxKanta Sasaki
6 views14 slides
The Things Stack説明資料 by The Things Industries by
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things IndustriesCRI Japan, Inc.
51 views29 slides
Web3 Career_クレデン資料 .pdf by
Web3 Career_クレデン資料 .pdfWeb3 Career_クレデン資料 .pdf
Web3 Career_クレデン資料 .pdfnanamatsuo
16 views9 slides
さくらのひやおろし2023 by
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023法林浩之
94 views58 slides

Recently uploaded(11)

Windows 11 information that can be used at the development site by Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka80 views
The Things Stack説明資料 by The Things Industries by CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.51 views
Web3 Career_クレデン資料 .pdf by nanamatsuo
Web3 Career_クレデン資料 .pdfWeb3 Career_クレデン資料 .pdf
Web3 Career_クレデン資料 .pdf
nanamatsuo16 views
さくらのひやおろし2023 by 法林浩之
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023
法林浩之94 views
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
SSH応用編_20231129.pdf by icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4287 views
SNMPセキュリティ超入門 by mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda301 views
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)

Tokyo Rubykaigi 01 t-wada