Nel primo post di questa serie, abbiamo discusso perché la programmazione orientata agli oggetti (OOP) è stata utile per lo sviluppo del gioco e abbiamo imparato come identificare gli oggetti, i loro stati e i loro comportamenti. In questo articolo, vedremo il principio OOP specifico di coesione e come si applica ai giochi.
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.
La coesione è il principio di essere o fare bene una cosa. In altre parole, coesione significa raggruppare il codice che contribuisce a un singolo compito.
Un grande esempio non di programmazione di questo principio è stato trattato in uno dei primi articoli di Gamedevtuts + che hanno parlato della regola di azione segreta:
Non provare a fare troppi giochi in un unico pacchetto ... Individualmente, ognuno di questi poteva essere un buon gioco. Insieme, hanno combattuto l'uno con l'altro.
La stessa regola si applica alla programmazione orientata agli oggetti. Ogni oggetto dovrebbe avere una sola responsabilità. Ogni comportamento di quell'oggetto dovrebbe fare solo un compito. Più di questo e avrai un tempo molto più difficile apportare modifiche al codice.
Codice organizzato per funzionalità e si dice che abbia un solo compito alta coesione. Il codice altamente coeso è riutilizzabile, semplice e facile da capire. Crea anche oggetti che sono piccoli e focalizzati.
Il codice che è organizzato arbitrariamente e ha più attività si dice che abbia bassa coesione. Tale codice è difficile da comprendere, conservare e riutilizzare ed è spesso complesso. Crea anche oggetti grandi e sfocati.
Avere alta coesione è generalmente buona, mentre avere una bassa coesione è generalmente negativa. Quando scrivi il codice, cerca sempre di scrivere codice altamente coeso.
Quindi, come lo applichiamo alla programmazione orientata agli oggetti? Bene per i principianti, l'organizzazione del codice in oggetti aiuta ad aumentare la coesione del gioco in generale. Tuttavia, ogni singolo oggetto dovrebbe anche avere un'elevata coesione. Facciamo riferimento ai nostri tre esempi per vedere come funziona.
Ricordiamo dall'ultimo articolo che abbiamo definito l'oggetto nave come un comportamento di svolta, spostamento e tiro.
Se dovessimo scrivere un singolo pezzo di codice che facesse tutti e tre i comportamenti contemporaneamente, diventerebbe piuttosto disordinato. Invece, dovremmo separare ogni comportamento in quelle che sono conosciute come funzioni. Le funzioni ci consentono di separare funzionalità e raggruppare codice simile insieme, contribuendo così alla creazione di codice altamente coeso.
Nella programmazione, un oggetto viene definito creando una classe. In Java, una classe è codificata come segue:
/ ** * La classe nave * / classe nave pubblica / ** * funzione - esegue il comportamento (attività) di trasformare la nave * / public void rotate () // codice che trasforma la nave / ** * Funzione - esegue il comportamento (compito) dello spostamento della nave * / movimento pubblico vuoto () // Codice che sposta la nave / ** * Funzione - esegue il comportamento (compito) di sparare con la pistola della nave * / incendio pubblico vuoto ( ) // Codice che fa sparare alla nave un proiettile
Come puoi vedere, ogni comportamento ha la sua funzione e il codice è ben organizzato proprio in questa struttura a scheletro.
Non preoccuparti troppo della sintassi esatta ancora; ne discuteremo più dettagliatamente mentre proseguiamo nella serie.Per Tetris, ricorda che i comportamenti di un tetromino stavano cadendo, muovendosi (di lato) e ruotando. La struttura di base della classe è la seguente:
/ ** * La classe Tetromino * / public class Tetromino / ** * Function - aggiorna la posizione di Tetromino * / public void fall () // Codice che aggiorna la posizione del tetromino / ** * Funzione - move a Tetromino * / public void move () // Codice che muove il Tetromino lateralmente / ** * Funzione - ruota un Tetromino * / public void rotate () // Codice che ruota il Tetromino di 90 gradi
Ancora una volta, i comportamenti sono separati nelle proprie funzioni. Per il autunno
metodo, tuttavia, si noti che l'attività è di aggiornare la posizione del tetromino. Questo perché il tetromino cade sempre, quindi non possiamo semplicemente fare il compito "perché il tetromino cada".
Invece, un tetromino in caduta sposta semplicemente sullo schermo un certo numero di righe alla volta - quindi dobbiamo aggiornare la posizione del tetromino per riflettere questa velocità di caduta.
Per l'oggetto fantasma con comportamenti di spostamento e cambiamento di stato, dobbiamo fare un po 'più di lavoro per farlo diventare altamente coeso.
/ ** * Ghost Class * / public class Ghost / ** * Function - move the Ghost * / public void move () // Codice che muove il fantasma nella direzione corrente / ** * Funzione - cambia Ghost direction * / public void changeDirection () // Codice che cambia la direzione del Ghost / ** * Function - change Ghost speed * / public void changeSpeed () // Codice che cambia la velocità del Ghost / ** * Function - cambia colore Ghost * / public void changeColor () // Codice che cambia il colore del Ghost / ** * Function - cambia Ghost * / public void changeState () // Codice che cambia lo stato del Ghost // Questa funzione anche chiamerà le tre funzioni di changeDirection, changeSpeed e changeColor
Lo stato Ghost ha tre funzioni extra aggiunte: Cambia direzione
, cambia colore
, e changeSpeed
. Questi non erano nella nostra lista di comportamento originale perché non sono comportamenti. Invece, queste funzioni sono quelle che sono conosciute come funzioni di supporto e sono lì per aiutarci a mantenere un'elevata coesione.
Il comportamento di cambiare stato (ciò che accade quando Pac-Man mangia una pastiglia di potere) richiede tre diversi compiti da eseguire: virare in blu profondo, invertire la direzione e muoversi più lentamente. Per mantenere la coesione, non vogliamo che una funzione svolga tutte e tre queste attività, quindi le suddividiamo in tre sottoattività che la funzione inviterà a completare il suo unico compito principale.
L'uso della parola e quando si descrive cosa un comportamento / funzione di solito significa che dovremmo creare più di una funzione.
La coesione è il principio di raggruppare il codice simile e garantire che ogni funzione esegua solo una singola attività. La coesione aiuta a creare codice che sia mantenibile e riutilizzabile.
Nel prossimo suggerimento rapido, discuteremo il principio dell'accoppiamento e il suo rapporto con la coesione. Seguici su Twitter, Facebook o Google+ per tenerti aggiornato con gli ultimi post.