• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Tokyo Rubykaigi 01 t-wada
 

Tokyo Rubykaigi 01 t-wada

on

  • 4,015 views

 

Statistics

Views

Total Views
4,015
Views on SlideShare
4,014
Embed Views
1

Actions

Likes
6
Downloads
19
Comments
0

1 Embed 1

http://s.deeeki.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Tokyo Rubykaigi 01 t-wada Tokyo Rubykaigi 01 t-wada Presentation Transcript

    • それRubyでも やりたい ライブラリ移植と機能拡張のためのパターンランゲージ 和田 卓人 (a.k.a id:t-wada) Aug, 21, 2008 @TokyoRubyKaigi 01
    • 多様性
    • 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
    • 続け!
    • ご清聴 ありがとう ございました