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:
| Moment | total |
|---|---|
| vóór de lus | 0 |
| na 3 | 3 |
| na 5 | 8 |
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, totaal0, gemiddeldeNoneen hoogste waardeNoneterug;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}