Even een situatie-schets:
Het is de bedoeling om te tellen hoeveel armors een held bij zich heeft. Deze held heeft een aantal anchors waaraan een (of geen) item kan bevestigd zitten. Verder heeft de held nog een apparte anchor voor de armor. Een van de items die een held kan meedragen is een rugzak. In deze rugzk kunnen opnieuw rugzakken en andere items zitten.
Een rechtdoorzee aanpak is om bij de held een methode countArmors() te maken, die vervolgens alle anchors doorloopt en met behulp van instanceof bepaald of het een rugzak is of een armor. (een countArmor() methode is niet echt zinnig voor geld, wapens, geldbeugels ...). Indien het een rugzak is wordt bij het totaal aantal getelde armors bijgeteld hoeveel armors er (indirect) in de rugzak zitten (met een recursieve methode, doch wederom met een instanceof om te bepalen of iets een rugzak is.)
Dit ziet er als volgt uit:
Met nog een recursieve countArmors() methode in de klasse BackPack. Aangezien instanceof nu niet bepaald onderhoudbaar is, dacht ik eraan om de bidirectionele binding uit te buiten.
Ik kan namelijk aan een armor vragen wie zijn houder is. Dit kan ik dan eenvoudig vergelijken met de huidige instantie van de held. Het eerste wat bij me opkwam was om reflectie te gebruiken om alle instanties van de klasse Armor op te vragen, en over deze rij te itereren.
Ondertussen heb ik al een tijdje zitten zoeken in het java.lang.reflect package (vooral in de Class klasse), maar ik kan nergens een dergelijke methode vinden (getSigners() heb ik geprobeert, maar dat doet blijkbaar niet veel).
Ik vroeg me dan ook af of het nota bene wel mogelijk is om alle instanties van een klasse te bepalen (zonder zelf een gegevensstructuur te declareren die dat doet. De code komt daar niet voor in aanmerking aangezien het onbekend is hoeveel instanties er van een Armor zullen gemaakt worden.) ?
Het is de bedoeling om te tellen hoeveel armors een held bij zich heeft. Deze held heeft een aantal anchors waaraan een (of geen) item kan bevestigd zitten. Verder heeft de held nog een apparte anchor voor de armor. Een van de items die een held kan meedragen is een rugzak. In deze rugzk kunnen opnieuw rugzakken en andere items zitten.
Een rechtdoorzee aanpak is om bij de held een methode countArmors() te maken, die vervolgens alle anchors doorloopt en met behulp van instanceof bepaald of het een rugzak is of een armor. (een countArmor() methode is niet echt zinnig voor geld, wapens, geldbeugels ...). Indien het een rugzak is wordt bij het totaal aantal getelde armors bijgeteld hoeveel armors er (indirect) in de rugzak zitten (met een recursieve methode, doch wederom met een instanceof om te bepalen of iets een rugzak is.)
Dit ziet er als volgt uit:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| (Klasse: Hero) public int countArmors() { int total = 0; if(this.getArmor() != null) total++; for(Anchor<Holdable> anchor : this.getAnchors()) { if(anchor.isOccupied()) { Holdable item = anchor.getHoldable(); if(item instanceof Armor) total++; if(item instanceof BackPack) total += ((BackPack) item).countArmors(); } } return total; } |
Met nog een recursieve countArmors() methode in de klasse BackPack. Aangezien instanceof nu niet bepaald onderhoudbaar is, dacht ik eraan om de bidirectionele binding uit te buiten.
Ik kan namelijk aan een armor vragen wie zijn houder is. Dit kan ik dan eenvoudig vergelijken met de huidige instantie van de held. Het eerste wat bij me opkwam was om reflectie te gebruiken om alle instanties van de klasse Armor op te vragen, en over deze rij te itereren.
Ondertussen heb ik al een tijdje zitten zoeken in het java.lang.reflect package (vooral in de Class klasse), maar ik kan nergens een dergelijke methode vinden (getSigners() heb ik geprobeert, maar dat doet blijkbaar niet veel).
Ik vroeg me dan ook af of het nota bene wel mogelijk is om alle instanties van een klasse te bepalen (zonder zelf een gegevensstructuur te declareren die dat doet. De code komt daar niet voor in aanmerking aangezien het onbekend is hoeveel instanties er van een Armor zullen gemaakt worden.) ?
Performance is a residue of good design.