Programma’s plannen, bouwen en testen · oefening
Herstructureer met een vangnet
Herstructureren werkt het best wanneer één structurele wijziging een duidelijk doel heeft. Hier vervangt die wijziging herhaalde stringsamenvoeging door een lijst met complete regels en één stringmethode.
Bouw één string uit een lijst met strings
Begin met drie afzonderlijke strings in een lijst:
Het resultaat is één string:
plan -> build -> test
De methodeaanroep " -> ".join(stages) gebruikt twee onderdelen die je al kent. " -> " is de scheidingsstring en stages is een lijst met strings. De methode .join() geeft één nieuwe string terug met het scheidingsteken tussen elk aangrenzend paar. Ze voegt geen scheidingsteken toe vóór het eerste item of na het laatste.
Het scheidingsteken staat vóór de punt, omdat .join() een stringmethode is. De lijst levert de strings om samen te voegen. Met stages.join(" -> ") draai je die rollen om en een lijst biedt geen .join().
Elk item dat je aan .join() meegeeft, moet een string zijn. Als een rapport een getal bevat, bouw dan die volledige regel met een f-string voordat je die in de lijst zet:
score = 2
lines = ["QUIZ REPORT", f"Score: {score}/3"]
Voorspel waar het scheidingsteken komt
Voorspel de exacte uitvoer voordat je dit voorbeeld uitvoert. Hoeveel regels drukt het af en waarom staat er geen lege regel aan het begin of einde?
De lijst bevat drie strings, dus .join() plaatst er twee scheidingstekens voor een nieuwe regel tussen. De haken, komma’s en aanhalingstekens horen bij de lijstweergave. Ze verschijnen niet in de teruggegeven string.
Gebruik .join() als de herstructurering
De startversie van quiz_report() geeft het beloofde rapport van drie regels al terug. De functie bouwt dat rapport door steeds één regel aan te plakken:
report = "QUIZ REPORT"
report = report + f"\nAnswered: {len(responses)}"
report = report + f"\nScore: {score}/{len(responses)}"
return report
Herstructureer die regels naar een lijst met complete strings en voeg ze daarna samen met "\n":
lines = [
"QUIZ REPORT",
f"Answered: {len(responses)}",
f"Score: {score}/{len(responses)}",
]
return "\n".join(lines)
Dit scheidt twee taken. De lijst legt vast wat elke rapportregel zegt en .join() legt vast wat er tussen de regels hoort.
Refactoren verandert de structuur van werkende code zonder bewust het gedrag te veranderen. Behoud de bestaande asserties, maak deze ene structurele wijziging en voer de controles opnieuw uit. Als ze nog steeds slagen voor de voorbereide en lege antwoordenlijsten, heb je bewijs dat het rapport behouden is.
Welke expressie geeft één string terug met elk item uit lines op een eigen regel?
Opdracht
De startversie van quiz_report(responses) levert het vereiste rapport al op. Herstructureer alleen de manier waarop de functie dat rapport samenstelt:
Laat de scorelus en de aanroep van
answers_match()daarin ongewijzigd.Maak na de lus een lijst met de drie complete rapportregels:
QUIZ REPORT, het aantal beantwoorde vragen en de score.Geef één string terug met
"\n".join(...)en die lijst met strings.Behoud beide voorbereide gedragsasserties en voer ze na het herstructureren opnieuw uit.
Behoud de functienamen, voorbereide gegevens en laatste afdrukinstructie. De uitvoer moet gelijk blijven:
QUIZ REPORT
Answered: 3
Score: 2/3