Kata #5: TDD cho toàn bộ quy trình - Trò chơi Tictactoe
Mục tiêu: Tại kata này, các bạn luyện dùng TDD cho cả quy trình xây dựng hệ thống nhiều module, bắt đầu từ một hệ thống đơn giản.
Lộ trình thực hiện Kata5
- 3/8: Bắt đầu bài kiểm tra #1 "Họ kick off TDD như thế nào".
- 5/8: Nộp bài kiểm tra #1. Thảo luận. Bắt đầu bài kiểm tra #2 "Chúng ta dự định kick off như thế nào".
- 6/8: Nộp bài kiểm tra #2. Thảo luận. Bắt đầu iteration zero.
- 7/8: Thảo luận và tiếp tục làm cho xong iteration zero.
- 8/8: Tổng kết về iteration zero. Bắt đầu bài kiểm tra #3 "Họ làm iteration 1 như thế nào".
- 9/8: Nộp bài kiểm tra #3. Thảo luận. Bắt đầu iteration 1.
- 12/8: Thảo luận rút kinh nghiệm, làm lại từ đầu (iteration zero)
- 13/8: Thảo luận, tiếp tục với các iteration tiếp theo.
- 14/8: Thảo luận, tiếp tục cho đến hoàn thành dự án.
- 15/8: Tổng kết đánh giá chất lượng hệ thống cuối cùng.
Đề bài:
Dùng TDD để viết trò chơi Tic-tac-toe. Cần có ít nhất 2 mô-đun: UI và GameLogic. UI có thể chạy dạng màn hình console hoặc web, nên đơn giản hết cỡ, chỉ cần đủ để tương tác được theo requirement:
Khi tương tác với trò chơi, người chơi chỉ có các lệnh cơ bản sau:
- Khởi động game mới với thông tin kèm theo là kí hiệu của người đi trước (x hoặc o). Lệnh này chỉ có hiệu lực khi hiện tại không có game đang chơi
- Dừng game hiện tại (nếu nó đã bắt đầu và chưa kết thúc)
- Nhập tọa độ của nước đi tiếp theo (hệ thống tự xác định nước đi tiếp theo là x hay o). Lệnh này chỉ có hiệu lực khi game hiện tại chưa kết thúc. Khi nhận được lệnh này, hệ thống cập nhật nước đi mới, xác định xem game đã kết thúc hay chưa, nếu đã kết thúc thì thông báo kết quả và đợi lệnh 1.
- Yêu cầu xem lịch sử các game đã diễn ra. Các game đã diễn ra cần được hiển thị theo thứ tự thời gian. Thông tin về mỗi game được hiển thị gồm có: kí hiệu của người đi trước, kí hiệu của người đã thắng cuộc (nếu có), chuỗi các nước đi đã diễn ra theo thứ tự (thực chất chỉ cần là 1 chuỗi gồm tối đa 9 chữ số từ 1-9 mã hóa 9 ô của bàn cờ).
Chú ý: để đơn giản, giả thiết người dùng luôn nhập tọa độ hợp lệ (một ô trống nằm bên trong bảng). Tọa độ dòng từ 1-3, tọa độ cột từ 1-3. Chương trình không phải quan tâm đến việc xử lý lỗi input. Không yêu cầu UI có thể hiển thị bảng ra màn hình (tất nhiên ai muốn thì vẫn có thể làm)
Ví dụ đơn giản (mô tả tại tầng UI):(*)
- Hệ thống khởi động
- Người dùng nhập lệnh từ dấu nhắc:
start x
- Game mới bắt đầu với người đi trước sẽ dùng kí hiệu x, người đi sau dùng o
- Người dùng nhập lệnh từ dấu nhắc:
1 1
- Game được cập nhật nước đi x tại tọa độ (1,1)
- Người dùng nhập lệnh từ dấu nhắc:
1 2
- Game được cập nhật nước đi o tại tọa độ (1,2)
- Người dùng nhập lệnh từ dấu nhắc:
2 2
- Game được cập nhật nước đi x tại tọa độ (2,2)
- Người dùng nhập lệnh từ dấu nhắc:
1 3
- Game được cập nhật nước đi o tại tọa độ (1,3)
- Người dùng nhập lệnh từ dấu nhắc:
3 3
- Game được cập nhật nước đi x tại tọa độ (3,3), thông báo x thắng cuộc, game kết thúc, đợi lệnh mới.
(*) Trên đây chỉ là một gợi ý về UI, có thể làm đơn giản hơn nữa, miễn là đủ để nhận lệnh và hiển thị trạng thái kết quả. Chẳng hạn có thể thay việc nhập tọa độ bằng 9 link/button đại diện cho 9 ô có thể đánh.
Gợi ý các user story để TDD dần từng story một (các bạn tự sắp xếp xem nên implement theo thứ tự nào):
người dùng mở game mới, đi cho đến khi một người thắng, game kết thúc.
người dùng mở game mới, đi cho đến khi bàn cờ đầy mà không ai thắng, game kết thúc.
người dùng mở game mới rồi lệnh dừng game.
người dùng mở game mới, đi vài nước, rồi lệnh dừng game.
Tài liệu tham khảo về quy trình: Growing Object-Oriented Software, Guided By Tests