Recentemente ho scritto un programma di Ruby per determinare soluzioni a un puzzle "Scramble Squares" tegola:Come posso utilizzare TDD per risolvere un puzzle con una risposta sconosciuta?
ho usato TDD per implementare la maggior parte di esso, portando a test che si presentava così:
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
Questo ha funzionato bene per i metodi "helper" di livello inferiore: identificare i "lati" di una tessera, determinare se una tessera può essere posizionata correttamente nella griglia, ecc.
Ma io ha incontrato un problema durante la codifica dell'algoritmo vero e proprio per risolvere il puzzle. Dal momento che non conoscevo le possibili soluzioni valide al problema, non sapevo come scrivere un test prima.
ho finito per scrivere una bella brutta, non testato, algoritmo per risolverlo:
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
Quindi la mia domanda è: come si usa TDD scrivere un metodo quando non si conosce già la uscite valide?
Se siete interessati, il codice è su GitHub:
- Test: codice https://github.com/mattdsteele/scramblesquares-solver/blob/master/golf-creator-spec.rb
- Produzione: https://github.com/mattdsteele/scramblesquares-solver/blob/master/game.rb
penserei sarebbe necessario conoscere il un lgoritmo (o almeno parti di esso) prima di poter scrivere test per questo. +1 per il collegamento, molto interessante. –
http://pindancing.blogspot.com/2009/09/sudoku-in-coders-at-work.html collegato dal tuo collegamento sembra discutere di una sorta di "risposta" al punto e.p. –
Grazie per i link a tutti. Sembra che in questo ** particolare ** spazio problema (che genera un algoritmo per risolvere un enigma), l'approccio di "utilizzare i test per capire il progetto mentre si va" tende a portare a soluzioni maldestre o inefficienti. Mi ricorda [queste critiche al TDD] (http://www.dalkescientific.com/writings/diary/archive/2009/12/29/problems_with_tdd.html). Non sono sicuro che tu possa fare un giudizio più ampio sul processo stesso. Per lo meno, ero * molto * felice di aver messo a punto (e testato) i metodi di livello inferiore disponibili prima di immergermi nel risolvere il problema reale. – matthewsteele