TDDの勘所とTDD支援超簡易Emacs Lisp

日本PostgreSQLユーザ会北海道支部 / Ruby札幌 合同セミナーに行ってきました。濃い話がいろいろ聴けましたが、今回一番の目的は角谷さんによるRSpecの実演。


人が目の前でコーディングしているのを見るのは勉強になりますね。注目すべきは結果的に入力されたコード以外の部分にあって、キータイプ速度の緩急や、コピペ操作、バックスペースでの修正等を見ていると、そのとき考えていること(考えるべきこと)が浮かび上がってくるような感じがします。


TDD(テスト駆動開発)については、「実際のところ、どこを厳密にやって、どこで手を抜くべきなのか」についてちょっと指針が見えたように思います。
今回一番厳密に守っていたのは「Think」「Red」「Green」「Refactoring」のモード切り替え。今どこのモードで作業をしているのかを意識して、例えばテストNGが残っている状態(Red)では絶対にリファクタリングをしない、というような進め方をしていました。このとき4つのモードを明示するために、コーディングしている横でそのときのモードを示すカラーボードを掲げていたのはちょっと面白かった。


このカラーボードみたいなことが個人レベルでもできないかなあ、と考えて下のプログラムを作ってみました。C-c mキーを押すとエディタの背景色が次々と変わるEmacs Lispです。モードラインにも[Think]などのモード名を表示します。


tdd-bgcolor.el

;; C-c m でTDDのモード切替え

(defvar tdd-bgcolor-alist
      '(("Think"      ."snow")
	("Red"        ."#ff4444")
	("Green"      ."#44dd44")
	("Refactoring"."#ffaa44")))

(defvar tdd-bgcolor-mode 3)
(defvar tdd-bgcolor-mode-name "")
(let (
      (cell (or (memq 'mode-line-position mode-line-format) 
		(memq 'mode-line-buffer-identification mode-line-format))) 
      (newcdr 'tdd-bgcolor-mode-name)) 
  (unless (member newcdr mode-line-format) 
    (setcdr cell (cons newcdr (cdr cell)))))

(defun tdd-bgcolor-rotate ()
  (interactive)
  (let (pair)
    (if (>= tdd-bgcolor-mode 3)
	(setq tdd-bgcolor-mode 0)
      (setq tdd-bgcolor-mode
	    (+ tdd-bgcolor-mode 1)))
    (setq pair
      (nth tdd-bgcolor-mode tdd-bgcolor-alist))
    (setq tdd-bgcolor-mode-name (format "[%s]" (car pair)))
    (message tdd-bgcolor-mode-name)
    (set-background-color (cdr pair))))

(global-set-key "\C-cm" 'tdd-bgcolor-rotate)