Bắt đầu Kata Game of Life như thế nào

Game of Life

Bạn có thể đọc chi tiết về kata này ở bài viết này. Và đây là một kata rất thú vị và thách thức. Một không gian hai chiều rộng vô hạn, với các cell nằm ở một trong hai trạng thái “sống” hay “chết”, và 3 luật nhân quả đơn giản. Nhưng việc triển khai hoàn thiện trong khoảng thời gian của một phiên Coding Dojo (25 phút) hay Coderetreat (45 phút) là không hề dễ dàng, điều đó loại bỏ mọi áp lực phải xong và giúp người tập đặt chú ý vào kỹ năng và cách làm.

Sự thú vị của GoL còn nằm ở chỗ, không như nhiều kata khác vốn có cách giải quyết khá đơn điệu, GoL có vô số các cách để thiết kế và triển khai. Sự khác nhau giữa thiết kế ở một vài ca kiểm thử đầu tiên có thể tạo nên quá trình phát triển cũng như kết quả cuối cùng khác biệt hoàn toàn.

Bài viết này gợi ý một thiết kế ban đầu mà người tham gia Coding Dojo hay Coderetreat lần đầu có thể dễ dàng tiếp cận. Thiết kế ở đây xoay quanh ý tưởng chính

  • Một universe để mô phỏng trạng thái của toàn bộ thế không gian trò chơi. Không gian có kích thước giới hạn. Và mọi cell nằm ngoài không gian mặc nhiên được coi là cell “chết”.
  • Đầu vào của chương trình là thông tin về tập các cell sống ban đầu, thông tin này có thể được mô tả bằng nhiều cách, chẳng hạn bằng những giá trị true trong một mảng boolean[][], hoặc bằng cách chỉ định mỗi cell sống bằng một lần gọi hàm bless() như dưới đây
  • Một chức năng để để chuyển tất cả các cell của universe sang trạng thái tiếp theo.
  • Một chức năng để cho biết trạng thái của một cell tại một vị trí bất kỳ.

Theo đó, kịch bản kiểm thử trông có thể như sau:

before
  universe = new Universe(4, 8)
  
testEmptyUniverseHasNoLivingCell
  universe.neighborsAt(1, 1) shouldBe 0

testFoundOneLivingNeighbor
  universe.bless(0, 1)
  universe.neighborsAt(0, 0) shouldBe 1

testFoundTwoLivingNeighbors
  universe.bless(0, 0)
  universe.bless(0, 2)
  universe.neighborsAt(0, 1) shouldBe 2

// ...

testLonelyCellDies
  universe.bless(0, 0)
  universe.bless(0, 2)
  universe.evolve()
  universe.isAlive(0, 0) shouldBe false

Bộ API này có thể đáp ứng mọi nhu cầu tái cấu trúc cũng như mở rộng về sau. Mọi tái cấu trúc sẽ nằm ở bên trong các thiết kế theo mẫu, ở các layer đằng sau trong các layer của phần mềm.

Loading

Leave a Reply

Your email address will not be published. Required fields are marked *