LU07.A04 - Lange Funktion zerlegen
Zerlegen Sie die Funktion bericht in benannte Teilfunktionen. Die Ausgabe muss zeichengenau dieselbe bleiben.
Ausgangslage
BESTELLUNGEN = [ {"kunde": " Meier ", "artikel": "Maus", "menge": 3, "preis": 25.0, "status": "offen"}, {"kunde": "keller", "artikel": "Laptop", "menge": 1, "preis": 1200.0, "status": "bezahlt"}, {"kunde": "MEIER", "artikel": "Tastatur", "menge": 2, "preis": 80.0, "status": "bezahlt"}, {"kunde": "Suter", "artikel": "USB-Hub", "menge": 5, "preis": 12.0, "status": "storniert"}, {"kunde": "keller ", "artikel": "Monitor", "menge": 1, "preis": 210.0, "status": "offen"}, ] def bericht(bestellungen): zeilen = [] total = 0.0 anzahl = 0 for b in bestellungen: if b["status"] != "storniert": wert = b["menge"] * b["preis"] if wert >= 100: wert = wert * 0.95 total = total + wert anzahl = anzahl + 1 name = b["kunde"].strip().lower().capitalize() zeilen.append(name + ": " + b["artikel"] + " = " + str(round(wert, 2)) + " CHF") kopf = "Bestellungen (" + str(anzahl) + ")" strich = "-" * len(kopf) fuss = "Total: " + str(round(total, 2)) + " CHF" return "\n".join([kopf, strich] + zeilen + [strich, fuss])
Die Funktion liefert:
Bestellungen (4) ---------------- Meier: Maus = 75.0 CHF Keller: Laptop = 1140.0 CHF Meier: Tastatur = 152.0 CHF Keller: Monitor = 199.5 CHF ---------------- Total: 1566.5 CHF
Detaillierte Aufgabenstellung
- Sicherheitsnetz prüfen:
pytestausführen. Alle sechs Tests sind grün, bevor Sie irgendetwas ändern. - Wenden Sie mindestens vier Techniken aus LU07c an. Erwartet werden: Extract Function, Named Constant, Replace Loop with Pipeline, sprechende Namen.
- Nach jedem einzelnen Umbau: Test laufen lassen und committen. Die Commit-Message nennt die Technik, zum Beispiel
refactor: Rabattgrenze als Konstante benannt. - Am Schluss darf keine Funktion länger als etwa zehn Zeilen sein.
Regeln
main_test.pywird nicht verändert. Wer den Test anpasst, damit er grün wird, hat die Aufgabe nicht gelöst.- Die Namen
BESTELLUNGENundberichtbleiben erhalten. - Neue Hilfsfunktionen dürfen Sie frei benennen.
Bewertung
| Teil | Punkte |
|---|---|
Tests (main_test.py) | 8 |
pylint (main.py) | 5 |
Diese Aufgabe erzeugt genau das Material, das im Portfolio (LB02) für D1I verlangt wird: Vorher/Nachher aus der Commit-Historie, gleiches Verhalten per Test belegt.
Die Beispieldaten sind nicht der einzige Testfall. Denken Sie an die leere Liste und an die Rabattgrenze bei genau 100 Franken - dort passieren beim Umbau die meisten stillen Verhaltensänderungen.
