De topictitel is misschien wat vreemd, maar ik weet het niet beter te verwoorden. Wanneer er verschillende soorten objecten zijn, die qua eigenschappen/gedrag verschillen van elkaar, gebruik je (ik) polyformisme om de specifieke implementatie van een bepaalde methode te verbergen van de interface van een object. De interface van een bepaald soort object is voor alle afgeleide soorten hetzelfde, alleen de implementatie verschilt op sommige plekken (je zou kunnen zeggen het basic OO principe). Voorbeeld:
Ik kom in de problemen wanneer er dingen gedaan moeten worden met/op een object waarbij de "dingen" die gedaan moeten worden afhangen van het type object én waarvan de kennis om dat te doen wat mij betreft niet in de klasse zelf horen.
Als ik voort borduur op het Car voorbeeld dan zou het starten van de auto prima in de Car (of afgeleide) klasse kunnen liggen, maar het repareren van een auto niet. Dat zou in mijn optiek thuishoren in een garage. Als er 1 soort garage zou zijn, is dat prima te scheiden zonder rare trucjes te doen:
Het probleem begint voor mij wanneer ik aparte garages zou krijgen die alleen autos kunnen repareren van een bepaald merk. Ik kan in een bovenliggende klasse prima het type auto negeren en enkel praten tegen de interface van Car, totdat die auto kapot is en gemaakt moet worden. Ik moet dan ergens checken wat voor type auto dat is, en de juiste garage ophalen om de auto te fixen. Vaak kom ik dan uit op een soort van factory. Voorbeeld:
Ik vind dat een wat vreemde constructie en het doet het OO/polyformisme principe ietwat teniet. Een andere implementatie zou kunnen zijn door elk Car object een (referentie naar) zijn eigen garage mee te geven en ofwel een methode te maken die de garage terug geeft, ofwel de aanroep van fix te implementeren in de Car klasse:
Maar dat druist een beetje in tegen mijn principes. Een auto moet wat mij betreft niet de kennis hebben over het repareren van zichzelf, en een auto zou ook niet moeten bepalen in welke garage hij gerepareerd wordt.
Hoe los ik zoiets nu op de juiste manier op? Is er wel 1 juiste manier? Dit is natuurlijk maar een voorbeeld, ik kom dit soort dingen vaker tegen en ik heb het idee dat mijn oplossing altijd een beetje een klok/klepel verhaal wordt bij mij omdat ik niet de juiste architectuur en design patterns toe pas.
Java:
1
2
3
4
5
6
7
8
| abstract class Car { } class Audi extends Car { } class Volvo extends Car { } |
Ik kom in de problemen wanneer er dingen gedaan moeten worden met/op een object waarbij de "dingen" die gedaan moeten worden afhangen van het type object én waarvan de kennis om dat te doen wat mij betreft niet in de klasse zelf horen.
Als ik voort borduur op het Car voorbeeld dan zou het starten van de auto prima in de Car (of afgeleide) klasse kunnen liggen, maar het repareren van een auto niet. Dat zou in mijn optiek thuishoren in een garage. Als er 1 soort garage zou zijn, is dat prima te scheiden zonder rare trucjes te doen:
Java:
1
2
3
4
5
| class Garage { public void fixCar(Car c) { } } |
Het probleem begint voor mij wanneer ik aparte garages zou krijgen die alleen autos kunnen repareren van een bepaald merk. Ik kan in een bovenliggende klasse prima het type auto negeren en enkel praten tegen de interface van Car, totdat die auto kapot is en gemaakt moet worden. Ik moet dan ergens checken wat voor type auto dat is, en de juiste garage ophalen om de auto te fixen. Vaak kom ik dan uit op een soort van factory. Voorbeeld:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| abstract class Garage { abstract void fix(Car car); } class AudiGarage extends Garage { public void fix(Car car) { System.out.println("Fixing audi"); } } class VolvoGarage extends Garage { public void fix(Car car) { System.out.println("Fixing volvo"); } } class GarageFactory { private Garage volvo = new VolvoGarage(); private Garage audi = new AudiGarage(); public Garage getGarageFor(Car c) { if (c instanceof Audi) return audi; if (c instanceof Volvo) return volvo; return null; } } |
Ik vind dat een wat vreemde constructie en het doet het OO/polyformisme principe ietwat teniet. Een andere implementatie zou kunnen zijn door elk Car object een (referentie naar) zijn eigen garage mee te geven en ofwel een methode te maken die de garage terug geeft, ofwel de aanroep van fix te implementeren in de Car klasse:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
| abstract class Car { private Garage garage; // optie 1 public Garage getGarage() { return garage; } // optie 2 public void fix() { garage.fix(this); } } |
Maar dat druist een beetje in tegen mijn principes. Een auto moet wat mij betreft niet de kennis hebben over het repareren van zichzelf, en een auto zou ook niet moeten bepalen in welke garage hij gerepareerd wordt.
Hoe los ik zoiets nu op de juiste manier op? Is er wel 1 juiste manier? Dit is natuurlijk maar een voorbeeld, ik kom dit soort dingen vaker tegen en ik heb het idee dat mijn oplossing altijd een beetje een klok/klepel verhaal wordt bij mij omdat ik niet de juiste architectuur en design patterns toe pas.
...