Estoy tratando de tener una idea de cómo diseñar y pensar de una manera orientada a objetos y quiero obtener comentarios de la comunidad sobre este tema. El siguiente es un ejemplo de un juego de ajedrez que deseo diseñar de manera orientada a objetos. Este es un diseño muy amplio y mi enfoque en esta etapa es solo identificar quién es responsable de qué mensajes y cómo los objetos interactúan entre sí para simular el juego. Indique si hay elementos de mal diseño (alto acoplamiento, mala cohesión, etc.) y cómo mejorarlos.
El juego de ajedrez tiene las siguientes clases
- Tablero
- Jugador
- Pieza
- Cuadrado
- Ajedrez
El tablero está formado por cuadrados, por lo que se puede hacer responsable de crear y administrar objetos cuadrados. Cada pieza también está en un cuadrado, por lo que cada pieza también tiene una referencia al cuadrado en el que se encuentra. (¿Esto tiene sentido?). Entonces, cada pieza es responsable de moverse de una casilla a otra. La clase de jugador contiene referencias a todas las piezas que posee y también es responsable de su creación (¿Debería el jugador crear piezas?). El jugador tiene un método takeTurn que a su vez llama a un método movePiece que pertenece a la clase de pieza que cambia la ubicación de la pieza de su ubicación actual a otra ubicación. Ahora estoy confundido sobre de qué debe ser responsable exactamente la clase de la Junta. Supuse que era necesario para determinar el estado actual del juego y saber cuándo termina el juego. Pero cuando una pieza lo cambia ' s ubicación ¿cómo se debe actualizar el tablero? ¿Debería mantener una matriz separada de cuadrados en los que existen piezas y que se actualiza a medida que las piezas se mueven?
Además, ChessGame crea inicialmente el tablero y los objetos del jugador que, a su vez, crean cuadrados y piezas respectivamente y comienzan la simulación. Brevemente, este podría ser el aspecto del código en ChessGame
Player p1 =new Player();
Player p2 = new Player();
Board b = new Board();
while(b.isGameOver())
{
p1.takeTurn(); // calls movePiece on the Piece object
p2.takeTurn();
}
No tengo claro cómo se actualizará el estado de la placa. ¿Debe la pieza tener una referencia al tablero? ¿Dónde debería estar la responsabilidad? ¿Quién tiene qué referencias? Ayúdenme con sus aportes y señalen problemas en este diseño. Deliberadamente no me estoy enfocando en ningún algoritmo o más detalles del juego, ya que solo estoy interesado en el aspecto del diseño. Espero que esta comunidad pueda brindar información valiosa.
takeTurn()
pagar si el movimiento de p1 termina el juego. Comentario menos quisquilloso: me parece más natural llamar a los jugadoreswhite
yblack
.