El concepto de jugador es definido mediante una clase abstracta:
module TicTacToe
class Player
def initialize( mark )
@mark = mark # "X" or "O" or " "
end
····
attr_reader :mark
····
def move( board )
raise NotImplementedError, "Player subclasses must define move()."
end
····
def finish( final_board )··
end
end
end
de la que heredan los jugadores concretos.
Cada jugador es una clase. Por ejemplo, el jugador humano:
module TicTacToe
class HumanPlayer < Player
def move( board )
print board
....
end
def finish( final_board )
....
end
end
end
Un par de jugadores mas, uno tonto y otro listo:
module TicTacToe
class DumbPlayer < Player
def move( board )
moves = board.moves
moves[rand(moves.size)]
end
end
class SmartPlayer < Player
def move( board )
....
end
end
end
La Banda de los Cuatro (The Gang of Four o GoF)
llama a esta idea de implanta el algoritmo en clases separadas el
strategy pattern o patrón estrategia [5], [6].
Esta estrategia puede aplicarse cuando ocurre que en medio de nuestra aplicación
tenemos una parte que varía (el tipo de jugador).
A veces en esa parte queremos hacer una cosa (usar el jugador SmartPlayer) y a veces
otra (el jugador HumanPlayer). Es mas, es seguro que en el futuro se querrá
otra cosa (¿que tal un jugador MiniMaxPlayer?).
Player que lo
que hacen es decidir la próxima jugada mediante move.
Player.
Game, que usa los Players como objetos intercambiables
Game - el contexto -
de las clases estrategia Players es necesario habilitar un mecanismo
de comunicación entre el contexto y la estrategia. En este ejemplo se ha optado por
pasar esa información - el tablero - como argumento:
@board[@x_player.move(@board)] = @x_player.mark # dentro del método play de la clase GameLa estrategia - el jugador
@x_player - recibe el tablero @board
y retorna su decisión - la jugada @x_player.move(@board) (algo como "b2")
rdoc,
la herramienta que se usa en Ruby para extraer documentación
de los programas: por un lado hay una variación en los parsers que soporta: C, Ruby y FORTRAN.
Por otro lado la salida puede hacerse en diversos formatos: XML, distintas versiones de HTML, CHM, ri, etc.
En rdoc cada uno de los formatos de salida es manejado mediante una estrategia.
Casiano Rodriguez León 2015-01-07