Hace poco escribió un programa de Ruby para determinar soluciones a un rompecabezas "Scramble Squares" baldosas:¿Cómo puedo usar TDD para resolver un rompecabezas con una respuesta desconocida?
Solía TDD para poner en práctica la mayor parte de ella, lo que lleva a las pruebas que se veía así:
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
Esto funcionó bien para los métodos "auxiliares" de nivel inferior: identificar los "lados" de una tesela, determinar si una tesela puede colocarse válidamente en la cuadrícula, etc.
Pero yo se encontró con un problema al codificar el algoritmo real para resolver el acertijo. Como no sabía soluciones posibles válidas para el problema, no supe cómo escribir una prueba primero.
terminé escribiendo una muy fea, no probado, algoritmo para resolverlo:
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
Así que mi pregunta es: ¿cómo se utiliza TDD escribir un método cuando no lo sabe ya la salidas válidas?
Si está interesado, el código en GitHub:
- pruebas: Código https://github.com/mattdsteele/scramblesquares-solver/blob/master/golf-creator-spec.rb
- Producción: https://github.com/mattdsteele/scramblesquares-solver/blob/master/game.rb
yo creo que tendría que conocer la una lgorithm (o al menos partes) antes de poder escribir pruebas para ello. +1 para el enlace, muy interesante. –
http://pindancing.blogspot.com/2009/09/sudoku-in-coders-at-work.html vinculado desde su enlace parece discutir una especie de "respuesta" a la o.p. –
Gracias por los enlaces a todos. Parece que en este espacio problemático ** particular ** (que genera un algoritmo para resolver un rompecabezas), el enfoque de "usar pruebas para calcular el diseño sobre la marcha" tiende a dar lugar a soluciones torpes o ineficientes. Me recuerda [a estas críticas de TDD] (http://www.dalkescientific.com/writings/diary/archive/2009/12/29/problems_with_tdd.html). No estoy seguro de que pueda hacer un juicio más amplio sobre el proceso en sí. Al menos, estaba * muy * feliz de tener métodos de nivel inferior en funcionamiento (y probados) disponibles antes de sumergirme en la solución del problema real. – matthewsteele