Sto cercando di avere un'idea di come progettare e pensare in modo orientato agli oggetti e desidero ottenere un feedback dalla comunità su questo argomento. Quello che segue è un esempio di una partita a scacchi che desidero progettare in modo OO. Questo è un progetto molto ampio e il mio obiettivo in questa fase è solo quello di identificare chi è responsabile di quali messaggi e come gli oggetti interagiscono tra loro per simulare il gioco. Si prega di indicare se ci sono elementi di cattivo design (accoppiamento alto, cattiva coesione, ecc.) E come migliorarli.
Il gioco degli scacchi ha le seguenti classi
- Tavola
- Giocatore
- Pezzo
- Piazza
- Gioco di scacchi
Il Board è composto da quadrati, quindi Board può essere responsabile della creazione e della gestione degli oggetti Square. Ogni pezzo è anche su un quadrato, quindi ogni pezzo ha anche un riferimento al quadrato in cui si trova. (Ha senso?). Ogni pezzo è quindi responsabile di spostarsi da una casella all'altra. La classe del giocatore contiene riferimenti a tutti i pezzi che possiede ed è anche responsabile della loro creazione (il giocatore dovrebbe creare i pezzi?). Il giocatore ha un metodo takeTurn che a sua volta chiama un metodo movePiece che appartiene alla classe del pezzo che cambia la posizione del pezzo dalla sua posizione corrente a un'altra posizione. Ora sono confuso su ciò di cui deve essere responsabile esattamente la classe Board. Ho pensato che fosse necessario per determinare lo stato attuale del gioco e sapere quando il gioco è finito. Ma quando un pezzo lo cambia ' s ubicazione come dovrebbe essere aggiornata la scheda? dovrebbe mantenere una matrice separata di quadrati su cui esistono i pezzi e che riceve aggiornamenti man mano che i pezzi si muovono?
Inoltre, ChessGame crea inizialmente il tabellone e gli oggetti giocatore che a loro volta creano rispettivamente quadrati e pezzi e iniziano la simulazione. In breve, questo potrebbe essere l'aspetto del codice in 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();
}
Non sono chiaro come verrà aggiornato lo stato del consiglio. Il pezzo dovrebbe avere un riferimento alla tavola? Dove dovrebbe essere la responsabilità? Chi detiene quali riferimenti? Per favore aiutami con i tuoi input e sottolinea i problemi in questo progetto. Non mi sto concentrando deliberatamente su alcun algoritmo o ulteriori dettagli del gioco poiché sono interessato solo all'aspetto del design. Spero che questa community possa fornire informazioni preziose.
takeTurn()
se la mossa di p1 termina il gioco. Commento meno nitido: trovo più naturale chiamare i giocatoriwhite
eblack
.