Gần đây tôi đã viết một chương trình Ruby để xác định các giải pháp cho một câu đố "Scramble Squares" ngói:Làm thế nào tôi có thể sử dụng TDD để giải quyết một câu đố với một câu trả lời không xác định?
tôi đã sử dụng TDD để thực hiện hầu hết của nó, dẫn đến kiểm tra mà trông như thế này:
it "has top, bottom, left, right" do
c = Cards.new
card = c.cards[0]
card.top.should == :CT
card.bottom.should == :WB
card.left.should == :MT
card.right.should == :BT
end
Điều này làm việc tốt cho các phương thức "trợ giúp" cấp thấp hơn: xác định "các cạnh" của một ô, xác định xem một lát có thể được đặt hợp lý vào lưới không, v.v.
Nhưng tôi chạy vào một vấn đề khi viết mã thuật toán thực tế để giải câu đố. Vì tôi không biết các giải pháp có thể hợp lệ cho vấn đề này, Tôi không biết cách viết bài kiểm tra trước.
tôi đã kết thúc viết một khá xấu xí, chưa được kiểm tra, thuật toán để giải quyết nó:
def play_game
working_states = []
after_1 = step_1
i = 0
after_1.each do |state_1|
step_2(state_1).each do |state_2|
step_3(state_2).each do |state_3|
step_4(state_3).each do |state_4|
step_5(state_4).each do |state_5|
step_6(state_5).each do |state_6|
step_7(state_6).each do |state_7|
step_8(state_7).each do |state_8|
step_9(state_8).each do |state_9|
working_states << state_9[0]
end
end
end
end
end
end
end
end
end
Vì vậy, câu hỏi của tôi là: làm thế nào để bạn sử dụng TDD để viết một phương pháp khi bạn chưa biết đầu ra hợp lệ?
Nếu bạn quan tâm, mã là trên GitHub:
- Các xét nghiệm: Mã https://github.com/mattdsteele/scramblesquares-solver/blob/master/golf-creator-spec.rb
- sản xuất: https://github.com/mattdsteele/scramblesquares-solver/blob/master/game.rb
tôi sẽ nghĩ rằng bạn sẽ phải biết một thuật toán (hoặc ít nhất là phần của nó) trước khi bạn có thể viết các bài kiểm tra cho nó. 1 cho liên kết, rất thú vị. –
http://pindancing.blogspot.com/2009/09/sudoku-in-coders-at-work.html được liên kết từ liên kết của bạn dường như thảo luận về một loại "câu trả lời" cho o.p. –
Cảm ơn mọi người đã liên kết. Dường như trong không gian vấn đề ** đặc biệt ** (tạo ra một thuật toán để giải một câu đố), cách tiếp cận của "kiểm tra sử dụng để tìm ra thiết kế khi bạn đi" có xu hướng dẫn đến các giải pháp vụng về hoặc không hiệu quả. Nó nhắc tôi về [những lời chỉ trích của TDD] (http://www.dalkescientific.com/writings/diary/archive/2009/12/29/problems_with_tdd.html). Tôi không chắc bạn có thể đưa ra thêm bất kỳ phán xét nào về quá trình này hay không. Ít nhất, tôi rất vui khi có các phương pháp cấp thấp hơn (và được thử nghiệm) sẵn có trước khi đi sâu vào giải quyết vấn đề thực tế. – matthewsteele