TDD with RDD: Clojure/LispのREPLで変わる開発体験

601 Views

January 24, 25

スライド概要

テスト駆動開発(test-driven development)とREPL駆動開発(REPL-driven development)を組み合わせてより快適な開発フローを実現しよう!

profile-image

「楽しく楽にcoolにsmartに」を理想とするprogrammer/philosopher/liberalist/realist。 好きな言語はClojure, Haskell, Python, English, français, русский。 読書、プログラミング、語学、法学、数学が大好き! イルカと海も大好き🐬

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

TDD with RDD の で変わる開発体験 Clojure/Lisp REPL #NextbeatTechBar 1

2.

🐬カマイルカ lagénorhynque 株式会社スマートラウンドのシニアエンジニア スタートアップの起業家と投資家のための業務効 率化/連携プラットフォームを開発している 主要技術スタック: Kotlin & TypeScript Server-Side Kotlin Meetupの運営企業 Clojure, Haskellなどの関数型言語と関数型プログ ラミングの実践が好き Java, Scala, Clojure, KotlinとJVM言語での開発実務 に長く取り組んできた 2

3.

で と のハイブリッドな開発スタイル を実践しよう Clojure RDD TDD 3

4.

と 1. TDD RDD 2. TDD with RDD 3. Clojure での実践例 4

5.

と 1. TDD RDD 5

6.

プログラミングで体感的に大きな割合を占める 対話的プロセス 言語 対話の相手 高度な型システムを持つ 静的 コンパイラ 型付き言語 [IMO] ( ) 高度なREPL開発環境と動的性質 を持つ) Lisp ( REPL 系言語 その他の多くの言語 ユニットテスト or/and ログ付 きの実行を含む デバッガー ( ) 6

7.

対話の延長上にある3種類の開発スタイル コンパイラとの対話 → 型駆動開発(type-driven development) REPL REPL development, RDD) との対話 → 駆動開発(REPL-driven ユニットテストとの対話 → テスト駆動開発(testdriven development, TDD) 7

8.

試行錯誤の探索的なプロセス ツールに助けられたり惑わされたりしながら進む 高速で高頻度なフィードバックループ 反応を見て、書き換えて、反応を見る繰り返し 設計の漸進的改善の機会でもある ユニットテストによるフィードバックと一定の動作 保証は高度なコンパイラやREPLを補完しうる 複数を組み合わせて実践しよう💡 8

9.

2. TDD with RDD 9

10.

テスト駆動開発(TDD) 0. 満たすべき仕様を整理する 1. 🟥 Red: 仕様に対応するテストコードを書いて(想定 通り)テストをパスしないことを確かめる 2. 🟩 Green: テストをパスする最小限の実装を与えて テストをパスすることを確かめる 3. 🟦 Refactor: 内部実装(コード設計)を改善して引き 続きテストをパスすることを確かめる → 再び1.へ 10

11.

REPL (read-eval-print loop) コードを読み取り、評価し、出力する繰り返し 内で素朴なrepl関数を定義し実行してみる ;; [Clojure] REPL user=> (defn repl [] (loop [] (-> (read) (eval) (prn)) (recur))) #'user/repl ; user=> (repl) (+ 1 2) ; 3 ; (map inc [1 2 3]) ; (2 3 4) ; 入力 出力 出力 入力の読み取り 評価 出力 再帰(= ループ) 関数定義式の評価結果 ; ; ; ; 入力 11

12.

駆動開発(RDD) 1. ✍️ Write: 小さなコード(任意の式)を書く 2. 🔍 Eval: 式を評価し結果を確かめる → 再び 1. へ REPL 12

13.

TDD with RDD ✍🔍️ テスト対象の式を書いて評価する ✍🔍 テスト用の式を書いて評価し結果を確かめる 🟥 意図通りでない → 再び 1. へ 🟩 意図通り → (適宜)テストケースに記録する 3. 🟦 内部実装を改善して評価結果が意図通りである (or テストをパスする)ことを確かめる → 再び 1. へ 1. 2. 13

14.

での実践例 3. Clojure 14

15.

事前準備: プロダクトコード用ファイル 名前空間(モジュール)の宣言 (defn fizzbuzz [n]) ; 関数の定義(※ボディはまだ空) (ns clj-tdd-with-rdd.core) ; 15

16.

事前準備: テストコード用ファイル (ns clj-tdd-with-rdd.core-test (:require [clj-tdd-with-rdd.core :as sut] [clojure.test :as t])) ; テスト対象 標準のテストライブラリ (t/deftest test-fizzbuzz ; テスト関数の定義 (t/testing "3の倍数ならFizz") ; テストケースの説明 (t/testing "5の倍数ならBuzz") (t/testing "3の倍数かつ5の倍数ならFizz Buzz") (t/testing "3の倍数でも5の倍数でもなければ整数の文字列")) ; 16

17.

エディタでファイルを開き、REPLに接続する 17

18.

関数の定義と適用の式を評価してみる 18

19.

関数定義を書き換えてそれぞれ評価してみる 19

20.

テストケースに書き換えて評価してみる 20

21.

類似のケースを追加してテスト全体を実行してみる 21

22.

さらに続けて…… 22

23.

プロダクトコードとテストコードを書き上げた 23

24.

リファクタしてみた 24

25.

リファクタリング後もテストをパスする😌 25

26.

リッチなREPLは探索的な開発フローを加速する♾️ Lisp系言語のREPLはいいぞ😈 (他言語でも同じような開発体験がしたい) 26

27.

Further Reading Clojure/ClojureScript 発 『テスト駆動開発』 関連リンク集 > REPL駆動開 Type-Driven Development with Idris cf. Idris: A Language for Type-Driven Development Idris v0.9 型駆動開発|プログラング言語 い( ) に入門させた 27