0%

Programma’s plannen, bouwen en testen · oefening

Lees code voordat je die verandert

Je zult vaak code aanpassen die je niet vandaag hebt geschreven. Die kan van iemand anders komen, van een eerdere versie van jezelf, uit documentatie of uit een project dat meerdere lessen geleden begon.

Deze les stapt bewust even weg van het quizprogramma om de werkwijze ergens anders toe te passen. Als de methode alleen helpt bij code die je al kent, is het nog niet echt een methode. Hier ontmoet je een kleine samenvatting van beoordelingen alsof die vanochtend op je bureau is beland.

Begin niet door alles in je favoriete stijl te herschrijven. Vorm eerst een bruikbaar beeld van wat de code doet.

Lees van buiten naar binnen

Begin bij de grenzen, waar de functie de rest van het programma ontmoet:

  • de functienaam en parameters;

  • de teruggegeven waarde of zichtbare uitvoer;

  • één kleine voorbeeldaanroep.

Bekijk het functieblok zodra die onderdelen duidelijk zijn. Deze volgorde geeft de details een plek.

Bekijk:

def summarize_distances(distances):
    total = 0

    for distance in distances:
        total += distance

    return {
        "count": len(distances),
        "total": total,
    }

Van buiten gezien ontvangt de functie een lijst en geeft ze een dictionary terug. De dictionary heeft twee velden.

Binnen de functie houdt één variabele het totaal bij terwijl de lus elke afstand doorloopt. Je kunt [3, 5] volgen:

Momenttotal
vóór de lus0
na 33
na 58

De teruggegeven dictionary is dus {"count": 2, "total": 8}.

Bevestig het huidige gedrag

Voer de code uit voordat je die bewerkt. Voeg zo nodig één tijdelijke aanroep of assertie toe.

Dat geeft je een uitgangspunt:

assert summarize_distances([3, 5]) == {
    "count": 2,
    "total": 8,
}

Als dat uitgangspunt al faalt, begin je niet met het gedrag dat je dacht te hebben.

Vind de kleinste wijziging

Stel dat de nieuwe eis een veld "average" toevoegt. Vraag jezelf af:

  • Welke waarde is al beschikbaar?

  • Welke nieuwe berekening is nodig?

  • Wat gebeurt er bij een lege lijst?

  • Welke bestaande velden moeten ongewijzigd blijven?

Misschien heb je maar een paar regels nodig. Een volledige herschrijving levert meer gedrag op om opnieuw te controleren.

Behoud de oude afspraak terwijl je die uitbreidt

Voeg controles voor het nieuwe veld toe, maar behoud de controles voor "count" en "total". Een uitbreiding is niet af als die stilzwijgend gedrag breekt waarop aanroepers al vertrouwen.

Onbekende code lezen is geen wedstrijd snellezen. Het doel is één nauwkeurige wijziging met bewijs.

Wat is de beste eerste stap voordat je een onbekende functie verandert?

Opdracht

Lees de startversie van summarize_ratings(ratings) voordat je die verandert. De functie geeft nu het aantal, het totaal en het gemiddelde terug voor een niet-lege lijst.

Breid de afspraak uit:

  • voeg "highest" toe met de hoogste beoordeling;

  • geef voor een lege lijst het aantal 0, totaal 0, gemiddelde None en hoogste waarde None terug;

  • behoud alle bestaande velden en al het bestaande gedrag.

Vervang de teruggegeven dictionary niet door afgedrukte tekst. Behoud de voorbereide aanroep en afdrukinstructie.

De afgedrukte dictionary moet deze velden en waarden bevatten; de volgorde van de velden mag verschillen:

{'count': 4, 'total': 14, 'average': 3.5, 'highest': 5}