====== 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:** ''pytest'' ausführen. Alle sechs Tests sind grün, bevor Sie irgendetwas ändern.
- Wenden Sie mindestens vier Techniken aus [[modul:m323:learningunits:lu07:techniken|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.py'' wird **nicht** verändert. Wer den Test anpasst, damit er grün wird, hat die Aufgabe nicht gelöst.
* Die Namen ''BESTELLUNGEN'' und ''bericht'' bleiben 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 [[modul:m323:leistungsbeurteilungen:lb02:start|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.
----
https://github.com/templates-python/m323-lu07-a04-langefunktion
{{tag>M323-LU07 M323-D1I}}
[[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi