Het BugBounty project bevat een vervelend probleem.
Aan de ene kant wil je gewoon een lijst met bugs opslaan. Zij bevatten de reden en het bedrijf waarvoor de bug gevonden is. Omgekeerd zou ik voor ieder bedrijf een lijst van bugs willen bijhouden om de totale bounty te berekenen.
Dit is Slecht Ontwerp, in een ideale situatie vormen de relaties tussen alle classes van het project een boom. Circulaire referenties kunnen zorgen voor problemen, maar een specifieke loop waar twee classes van elkaar afhankelijk zijn is niet goed.
Bevestig dat de huidige implementatie van de BountyAdministrator
correct is.
Implementeer en unittest.
Om dit probleem op te lossen definieren we een interface die de totale berekening afhandelt:
public interface TotalBountyCalculator {
int getTotalBounty();
}
Hierdoor wordt de verantwoordelijkheid om een lijst van bugs verplaatst van de Client klasse, naar een nieuwe “BerekenHetTotaal” klasse. Natuurlijk ontstaat er nu nog steeds een circulaire referentie in het geheugen, maar nu ziet de Client klasse enkel een implementatie die de berekening afhandelt. En alleen de BountyCalculator weet hoe hij de lijst met BugBounties bewaart.
Afhankelijk van jouw implementatie keuze kan een streams oplossing natuurlijk ook werken.
Loops in je klasse diagram zijn slecht. Je kunt de directe afhankelijkheid doorbreken door een interface te gebruiken die het probleem oplost. Zonder dat de klasse die de interface gebruikt direct toegang te geven tot de databron(nen).