0%

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:

Try it

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?

Try it

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:

  1. Laat de scorelus en de aanroep van answers_match() daarin ongewijzigd.

  2. Maak na de lus een lijst met de drie complete rapportregels: QUIZ REPORT, het aantal beantwoorde vragen en de score.

  3. Geef één string terug met "\n".join(...) en die lijst met strings.

  4. 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