Hittills i denna serie har vi diskuterat objektorienterad programmering i allmänhet och OOP-principen om sammanhållning. I den här artikeln ser vi på principen om koppling och hur det hjälper till i spelutveckling.
Notera: Även om denna handledning skrivs med Java, bör du kunna använda samma tekniker och begrepp i nästan vilken spelutvecklingsmiljö som helst.
Koppling är principen om "separation av oro". Detta innebär att ett objekt inte direkt ändrar eller ändrar tillståndet eller beteendet hos ett annat objekt.
Koppling tittar på förhållandet mellan objekt och hur nära de är. Ett relationsdiagram är ett bra sätt att visualisera kopplingarna mellan objekt. I ett sådant diagram representerar lådor objekt och pilar representerar en koppling mellan två objekt där ett objekt kan direkt påverka ett annat objekt.
Ett bra exempel på koppling är HTML och CSS. Innan CSS användes HTML för både uppställning och presentation. Detta skapade uppblåst kod som var svår att förändra och svår att underhålla. Med tillkomsten av CSS användes HTML bara för markup, och CSS tog över för presentation. Detta gjorde koden ganska ren och lätt bytbar. Bekymmerna för presentation och uppmärksamhet separerades.
Objekt som är oberoende av varandra och inte direkt ändrar tillståndet för andra objekt sägs vara löst kopplade. Lös koppling gör att koden blir mer flexibel, mer bytbar och lättare att arbeta med.
Objekt som är beroende av andra objekt och kan ändra tillstånden för andra objekt sägs vara tätt kopplade. Stram koppling skapar situationer där ändring av koden för ett objekt också kräver att koden för andra objekt ändras (även känd som en rippel-effekt). Tätt kopplad kod är också svårare att återanvända eftersom den inte kan separeras.
En vanlig fras som du kommer att höra är "sträva efter låg koppling och hög sammanhållning". Denna fras är en bra påminnelse om att vi ska sträva efter kod som skiljer upp uppgifter och inte är beroende av varandra. Sålunda är låg (eller lös) koppling generellt bra, medan hög (eller tät) koppling är generellt dålig.
Låt oss först titta på Asteroids föremål och hur de är anslutna. Minns att föremålen är ett skepp, en asteroid, en flygande tallrik och en kula. Hur är dessa objekt relaterade eller kopplade till varandra?
I asteroider kan ett skepp avfyra en kula, en kula kan slå en asteroid och en flygande tallrik, och en asteroid och en flygande tallrik kan slå skeppet. Vårt relationsdiagram ser då ut som följer:
Som du kan se är föremålen alla ganska bra inbördes. På grund av detta måste vi vara försiktiga med hur vi skriver koden, annars kommer vi att sluta med ett tätt kopplat system. Låt oss ta till exempel fartyget skjuta en kula. Om skeppet skulle skapa ett punktobjekt, hålla reda på dess position och ändra sedan asteroiden när kulan träffas skulle vårt system vara mycket tätt kopplat.
I stället ska skeppet skapa ett punktobjekt, men inte oroa dig för det efter den punkten. En annan klass skulle vara ansvarig för att hålla koll på kuls position samt vad som händer när en kula träffar en asteroid. Med en mellanklass mellan våra relationer skulle diagrammet se ut som följer:
Detta relädiagram ser mycket bättre ut och skapar ett mycket löst kopplat system. I det här systemet, om vi skulle lägga till ett objekt, som en meteor, kunde vi enkelt göra det utan att behöva ändra hur fartyget eller kollagen objekt fungerar - vi skulle bara låta vår mellanhand klass ta hand om allt.
Eftersom det bara finns ett objekt i Tetris är Tetrimino-kopplingen inte ett problem eftersom det inte finns några relationer med andra objekt.
För Pac-Man kan en snabb koppling inträffa när Pac-Man äter en kraftpellets. När en kraftpellet äts kan Pac-Man då äta spöken och spökets tillstånd ändras till ätbar
. Om Pac-Man-objektet skulle spåras när det åt en kraftpellets och sedan initiera förändringsläget för varje spöke skulle systemet vara tätt kopplat.
Återigen krävs en annan klass för att hålla reda på den här informationen och bearbeta den så att våra objekt kan kopplas löst. Nedan är ett exempel på hur en mellanklass kan spåra Pac-Man som äter en kraftpellets.
/ ** * Intermediate Class som håller reda på spelhändelser * / Public Class Game ... om (Pac-Man.eats (Power_Pellet)) Ghosts.changeState (); ...
Koppling är principen att minska hur objekten direkt påverkar tillstånd och beteenden hos andra objekt. Koppling hjälper till att skapa kod som är lättare att läsa såväl som lättare att ändra.
I nästa Snabbtips diskuterar vi principen om inkapsling och varför det hjälper till att skapa underhållsbar kod. Följ oss på Twitter, Facebook eller Google+ för att hålla dig uppdaterad med de senaste inläggen.