Data vs Adfærd

Hvornår skal man bruge Polymorfisme?

Den eneste grund til at have flere forskellige subklasser som arver fra en superklasser er når der er en ændring i adfærd.

Lad os tage udgangspunkt i følgende klasse diagram

classDiagram
	Thunderbolt --|> IAttack
	Stratch --|> IAttack
	class Thunderbolt{
	+ Name : string
	+ Damage : int
	}
	class Stratch{
	+ Name : string
	+ Damage : int
	}
	class IAttack{
	+ Name : string
	+ Damage : int
	}

Her kan vi se 2 klasser og 1 interface.

De to klasser arver fra interface’et.

Lad os se på hvad præcis Thunderbolt og Scratch er og gør

Forestil dig at alt hvad de to klasser gør er at have et navn og trække en int fra en spillers Health points.

Dette beskriver Christopher i videoen som en ændring i data snarere end en ændring i adfærd. Derfor er det unødvendigt at oprette to underklasser, der arver fra et interface.

Det kan opsummeres sådan:

Summary

Ænding i data => objekter

Hvis de to klasser ser sådan ud:

Name: Tunderbolt

Damage : 100

Name: Scratch

Damage : 10

Gør vi ikke mere end at ændre data.

Så lad os lave klasse diagrammet om så det passer bedre til at have underklasser.

classDiagram
	Thunderbolt --|> IAttack
	Stratch --|> IAttack
	class Thunderbolt{
	+ Use(_)
	}
	class Stratch{
	+ Use(_)
	}
	class IAttack{
	+ Use(IPlayer player)
	}

Nu er der placeret metoder i alle kasser. Det må vel kunne ære adfærden for klasserne, for metoder er vel adfærd?

…Tjoe

Men hvis vi kigger efter i sømmene kan vi forestille os at Use metoden gør det samme som i det første diagram oven for.

fx

Thunderbolt trækker 100 fra Spilleren health points

Scratch trækker 10 fra spillerens Health Points

I bund og grund har de den samme adfærd.

Alright, sidste forsøg.

classDiagram
	Attack --|> IMove
	Stun --|> IMove
	class Stun{
	+ Use(_)
	}
	class Attack{
	+ Use(_)
	}
	class IMove{
	+ Use(IPlayer player)
	}

Nu er det lavet et interface de hedder IMove. Yderligere to klasser som hedder Attack og Stun.
De to klasser har her 2 vidt forskellig adfærd

Attack trækker et heltal fra spillerens health points

Stun returnerer spilleres health points til maks.

2 forskellige adfærdsmønstre. Her er der en valid case for at opdele det i underklasser.

Important

Variation i Adfærd => Klasser

Opsummering

Vi har udforsket polymorfisme i objektorienteret programmering og vurderet, hvordan det påvirker designbeslutninger. Diskussionen fokuserede på forskellen mellem data- og adfærdsændringer og betydningen af at afveje kompleksitet mod klarhed og vedligeholdelse i designprocessen. Samlet set understregede analysen behovet for omhyggelig anvendelse af polymorfi for at opnå en effektiv og skalerbar objektorienteret arkitektur. Til allersidst:

Variation i Data => Objekter

Variation i Adfærd => Klasser

Kilder Beskrivelse
“The only time you should use Polymorphism” af Christopher Okhravi En Fed video om ovenstående emne