Wat is de beste plek voor een method?
Waar hoort een verantwoordelijkheid thuis?
Deze week ontvangt u een drietal vuistregels om methods de beste plaats in een classeboom te geven.
Vuistregels
- Plaats de method daar waar het resultaat een attribuut zou kunnen zijn.
- Liever instance methods dan class methods.
- Liever géén, danwel zo min mogelijk parameters.
Voorbeelden
Wat is de kleur van een potlood?
- Regel 1, attribuut
- Het attribuut kleur hoort thuis in Schrijfgerij, de abstracte superclasse van Pen en Potlood.
- Regel 2, instance boven class
- Deze method is een instance method van potlood maar ook van pen.
De beste plek is dus de abstracte classe Schrijfgerij.
- Regel 3, geen parameters
- Parameters zijn niet nodig.
Oplossing: Maak een concrete instance method
getKleur()
in de abstracte klasse Schrijfgerij.
Hoeveel potloden zijn er in een Bekertje?
- Regel 1, attribuut
- Het denkbeeldige attribuut "aantalPotloden" zou thuis horen in Bekertje.
- Regel 2, instance boven class
- Voor potlood zou dit een method op class niveau zijn.
Een betere keuze is een instance method in Bekertje.
- Regel 3, geen parameters
- Bij een class method in potlood zou een instance van Bekertje als parameter nodig zijn.
Een beter alternatief is een instance method in Bekertje, zonder parameters.
Oplossing: Maak een instance method
getAantalPotloden()
in Bekertje.
Stop Pen in Bekertje
- Regel 1, attribuut
-
- Het attribuut voor de implementatie van de
one-to-many
associatie Bekertje-Schrijfgerij
kan in Bekertje.
Een instance van Pen is dan een element van een of andere collectie binnen een instance van Bekertje.
Als een Pen verhuist van het ene bekertje naar de andere moeten twee van zulke collecties aangepast worden.
- Een betere mogelijkheid is
één attribuut "Bekertje" in Schrijfgerij,
als denkbeeldige implementatie van de
many-to-one associatie.
Dit ene attribuut met één mogelijk waarde is een betere gedachte.
Ook in werkelijke code is een Schrijfgerij method
setBekertje(Bekertje)
zo gek nog niet.
Deze doet al het werk:
- Het past de many-to-one associatie aan in Schrijfgerij en roept achter de schermen protected methods aan van Bekertje:
verwijder(Schrijfgerij) om de pen uit de oude beker te halen.
voegToe(Schrijfgerij) om de pen in de nieuwe beker te stoppen.
- Regel 2, instance boven class
- Deze method is een instance method van Bekertje of Schrijfgerij.
- Regel 3, geen parameters
- Een parameter is nodig zowel bij implementatie in Bekertje, als in Schrijfgerij.
Oplossing:
Leg de verantwoordelijkheid voor de associatie aan de 'many' kant.
Maak een publieke method
stopIn(Bekertje) in Schrijfgerij.
Hoeveel Bekertjes zijn er?
- Regel 1, attribuut
- Het attribuut "aantal Bekertjes" zou een attribuut zijn van de class Bekertje.
- Regel 2, instance boven class
- Deze method moet wel een class method zijn.
- Regel 3, geen parameters
- Parameters zijn niet nodig.
Oplossing:
Maak een class method
getAantalBekertjes() in Bekertje.
Tot de volgende week,
Henk Jan Nootenboom
|