Practice/Lisp, Scala

간단한 데이타베이스를 TDD 로 개발하기 3회: add-record

이번 강의에서는 CD 레코드를 DB에 추가하는 함수 add-record를 개발한다. 이 함수는 인자로 CD 레코드를 받는다.

비어있는 DB에 add-record로 레코드를 추가하면,

(add-record (make-cd "Home" "Dixie Chicks" 9 t))

dump-db는 다음과 같은 결과를 출력한다.

'((:title "Home" :artist "Dixie Chicks" :rating 9 :ripped t))

1차 테스트의 구현과 통과는 쉽고 간단함으로 빠르게 진행하자.

(define-test add-record-test
  (add-record (make-cd "Home" "Dixie Chicks" 9 t))
  (assert-equal '((:title "Home"
                   :artist "Dixie Chicks"
                   :rating 9
                   :ripped t))
                (dump-db)))

위 테스트는 레코드를 리스트로 만듬으로 쉽게 통과했다.

(defun add-record (cd) (list cd))

add-record 테스트를 여러개의 레코드를 추가하도록 수정해보자.

(define-test add-record-test
  (add-record (make-cd "Home" "Dixie Chicks" 9 t))
  (assert-equal '((:title "Home"
                   :artist "Dixie Chicks"
                   :rating 9
                   :ripped t))
                (dump-db))
  (add-record (make-cd "Roses" "Kathy Mattea" 7 t))
  (assert-equal '((:title "Home"
                   :artist "Dixie Chicks"
                   :rating 9
                   :ripped t)
                 (:title "Roses"
                  :artist "Kathy Mattea"
                  :rating 7
                  :ripped t))
                (dump-db)))

어떠한 문제가 있을까? 레코드를 저장하는 DB가 존재하지 않는다.

  • DB를 저장하는 전역 변수를 추가하고, 이에 따라 add-record와 dump-db 함수를 수정한다.
  • 이전 테스트가 다음의 테스트에 영향을 주지 않도록, DB 상태를 초기화하는 drop-db 함수를 추가한다.
  • DB를 비교할 때, 레코드의 순서와 상관없이 비교할 수 있도록 DB의 레코드를 정렬해주는 sort-db 함수를 추가한다.

아래는 위 문제를 해결한 코드이다.

(defpackage :cd-db
  (:use :common-lisp)
  (:export #:dump-db
	   #:drop-db
	   #:make-cd
	   #:add-record))

(in-package :cd-db)

(defvar *db* nil)

(defun dump-db () *db*)

(defun drop-db () (setq *db* nil))

(defun make-cd (title artist rating ripped)
  (list :title title :artist artist :rating rating :ripped ripped))

(defun add-record (cd) (push cd *db*))

더불어, 지금까지 작성된 전체 테스트는 아래와 같다.

(defpackage :cd-tests
  (:use :common-lisp :lisp-unit :cd-db))

(in-package :cd-tests)

(define-test make-cd-test
  (assert-equal '(:title "Home"
		  :artist "Dixie Chicks"
		  :rating 9
		  :ripped t)
		(make-cd "Home" "Dixie Chicks" 9 t))
  (assert-equal '(:title "Roses"
		  :artist "Kathy Mattea"
		  :rating 7
		  :ripped t)
		(make-cd "Roses" "Kathy Mattea" 7 t)))

(defun sort-db (db) (sort db #'string< :key #'cadr))

(define-test add-record-test
  (drop-db)
  (add-record (make-cd "Home" "Dixie Chicks" 9 t))
  (assert-equal (sort-db '((:title "Home"
			    :artist "Dixie Chicks"
			    :rating 9
			    :ripped t)))
		(sort-db (dump-db)))
  (add-record (make-cd "Roses" "Kathy Mattea" 7 t))
  (assert-equal (sort-db '((:title "Roses"
			    :artist "Kathy Mattea"
			    :rating 7
			    :ripped t)
			   (:title "Home"
			    :artist "Dixie Chicks"
			    :rating 9
			    :ripped t)))
		(sort-db (dump-db))))


알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

Today : 10
Yesterday : 147
Total : 202,573