Finora in questa serie, abbiamo discusso della programmazione orientata agli oggetti in generale e del principio OOP della coesione. In questo articolo, vedremo il principio di accoppiamento e come aiuta nello sviluppo del gioco.
Nota: Sebbene questo tutorial sia scritto usando Java, dovresti essere in grado di utilizzare le stesse tecniche e concetti in quasi tutti gli ambienti di sviluppo di giochi.
L'accoppiamento è il principio della "separazione delle preoccupazioni". Ciò significa che un oggetto non modifica o modifica direttamente lo stato o il comportamento di un altro oggetto.
L'accoppiamento esamina la relazione tra gli oggetti e quanto sono strettamente connessi. Un diagramma di relazioni è un ottimo modo per visualizzare le connessioni tra gli oggetti. In tale diagramma, le caselle rappresentano oggetti e le frecce rappresentano una connessione tra due oggetti in cui un oggetto può influenzare direttamente un altro oggetto.
Un buon esempio di accoppiamento è HTML e CSS. Prima del CSS, l'HTML è stato utilizzato sia per il markup che per la presentazione. Questo ha creato un codice gonfio che era difficile da modificare e difficile da mantenere. Con l'avvento del CSS, l'HTML è stato utilizzato solo per il markup e CSS ha preso il posto della presentazione. Ciò ha reso il codice abbastanza pulito e facilmente modificabile. Le preoccupazioni relative alla presentazione e al markup sono state separate.
Si dice che gli oggetti indipendenti tra loro e che non modificano direttamente lo stato di altri oggetti debolmente accoppiato. L'accoppiamento lento consente al codice di essere più flessibile, più modificabile e più facile da utilizzare.
Si dice che gli oggetti che si basano su altri oggetti e possano modificare gli stati di altri oggetti strettamente accoppiati. L'accoppiamento stretto crea situazioni in cui la modifica del codice di un oggetto richiede anche la modifica del codice di altri oggetti (noto anche come effetto a catena). Il codice strettamente accoppiato è anche più difficile da riutilizzare perché non può essere separato.
Una frase comune che sentirai è "cercare un accoppiamento basso e un'elevata coesione". Questa frase è un utile promemoria per cui dovremmo cercare il codice che separa le attività e non si affida molto l'un l'altro. Pertanto, l'accoppiamento basso (o lento) è generalmente buono, mentre l'accoppiamento alto (o stretto) è generalmente cattivo.
Per prima cosa, guardiamo gli oggetti di Asteroids e come sono connessi. Ricorda che gli oggetti sono una nave, un asteroide, un disco volante e un proiettile. In che modo questi oggetti sono collegati o collegati tra loro?
In Asteroids, una nave può sparare un proiettile, un proiettile può colpire un asteroide e un disco volante, e un asteroide e un disco volante possono colpire la nave. Il nostro diagramma delle relazioni appare quindi come segue:
Come puoi vedere gli oggetti sono tutti abbastanza bene correlati. Per questo motivo, dobbiamo stare attenti a come scriviamo il codice, altrimenti finiremo per avere un sistema strettamente accoppiato. Prendiamo ad esempio la nave che spara un proiettile. Se la nave dovesse creare un oggetto proiettile, tenere traccia della sua posizione e quindi modificare l'asteroide quando colpisce il proiettile, il nostro sistema sarebbe molto strettamente accoppiato.
Invece, la nave dovrebbe creare un oggetto proiettile, ma non preoccuparti dopo questo punto. Un'altra classe sarebbe responsabile di tenere traccia della posizione del proiettile e di cosa succede quando un proiettile colpisce un asteroide. Con una classe intermedia tra le nostre relazioni, il diagramma avrebbe il seguente aspetto:
Questo diagramma delle relazioni sembra molto meglio e crea un sistema molto sciolto. In questo sistema, se dovessimo aggiungere un oggetto, come una meteora, avremmo potuto farlo facilmente senza dover cambiare il modo in cui funzionano gli oggetti nave o proiettile - lasceremo semplicemente che la nostra classe intermedia si occupi di tutto.
Dato che c'è un solo oggetto in Tetris, il Tetrimino, l'accoppiamento non è un problema in quanto non ci possono essere relazioni con altri oggetti.
Per Pac-Man, l'accoppiamento stretto potrebbe verificarsi quando Pac-Man mangia un pellet di potenza. Quando viene consumato un granello di potenza, Pac-Man può quindi mangiare i fantasmi e lo stato del fantasma cambia commestibile
. Se l'oggetto di Pac-Man dovesse tracciare quando ha mangiato un pellet di potenza e quindi avviare lo stato di cambiamento di ciascun ghost, il sistema sarebbe strettamente accoppiato.
Di nuovo, è necessaria un'altra classe per tenere traccia di queste informazioni e elaborarle in modo che i nostri oggetti possano essere accoppiati liberamente. Di seguito è riportato un esempio di come una classe intermediario potrebbe tracciare Pac-Man mangiando una pastiglia.
/ ** * Classe intermedia che tiene traccia degli eventi di gioco * / classe pubblica Gioco ... if (Pac-Man.eats (Power_Pellet)) Ghosts.changeState (); ...
L'accoppiamento è il principio di ridurre il modo in cui gli oggetti influenzano direttamente gli stati e i comportamenti di altri oggetti. L'accoppiamento aiuta a creare codice che è più facile da leggere e più facile da modificare.
Nel prossimo suggerimento rapido, discuteremo il principio di incapsulamento e perché aiuta a creare codice mantenibile. Seguici su Twitter, Facebook o Google+ per tenerti aggiornato con gli ultimi post.