Methods

Maandag, 20 mei 2002
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

  1. Plaats de method daar waar het resultaat een attribuut zou kunnen zijn.
  2. Liever instance methods dan class methods.
  3. Liever géén, danwel zo min mogelijk parameters.

Voorbeelden

OO model van Bekertje, pen en potlood

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:

    1. Het past de many-to-one associatie aan in Schrijfgerij en roept achter de schermen protected methods aan van Bekertje:
    2. verwijder(Schrijfgerij) om de pen uit de oude beker te halen.
    3. 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