04 Übung: Extraktion von Anforderungen aus Code
January 2026 (851 Words, 5 Minutes)
Einführung
Anforderungen sind oft implizit im Code vorhanden, anstatt dokumentiert zu sein. Durch Codeanalyse können wir die Vorbedingungen (was vor der Funktionsausführung wahr sein muss), Nachbedingungen (was die Funktion garantiert) und Invarianten (was immer wahr bleibt) extrahieren.
Lernziele:
- Vorbedingungen aus Code-Validierungslogik extrahieren
- Nachbedingungen aus Rückgabewert-Einschränkungen identifizieren
- Formale Anforderungen basierend auf Codeanalyse schreiben
- Implizite/undokumentierte Anforderungen erkennen
Anweisungen:
- Studieren Sie die Design by Contract-Referenz
- Lesen Sie die bereitgestellte Python-Funktion sorgfältig
- Bearbeiten Sie alle vier Aufgaben schriftlich
- Überprüfen Sie Ihre Antworten anhand der Lösung
Gesamtpunkte: 25 Zeit: ~25 Minuten
Referenz: Design by Contract
| Begriff | Definition | Beispiel |
|---|---|---|
| Vorbedingung | Eine Bedingung, die vor der Funktionsausführung wahr sein muss | „Eingabe muss eine positive Ganzzahl sein" |
| Nachbedingung | Eine Bedingung, die die Funktion nach der Ausführung garantiert | „Rückgabewert liegt immer zwischen 0 und 1" |
| Invariante | Eine Bedingung, die während der gesamten Ausführung wahr bleibt | „Kontostand wird nie negativ" |
Zu analysierender Code
Studieren Sie die folgende Python-Funktion sorgfältig. Zeilennummern sind als Referenz angegeben.
1 def calculate_discount(
2 customer_type: str,
3 order_amount: float,
4 is_member: bool
5 ) -> float:
6 """Calculate discount percentage for an order."""
7
8 if customer_type not in ["regular", "premium", "vip"]:
9 raise ValueError("Invalid customer type")
10
11 if order_amount < 0:
12 raise ValueError("Order amount cannot be negative")
13
14 if order_amount > 100000:
15 raise ValueError("Order amount exceeds maximum")
16
17 base_discount = 0.0
18
19 if customer_type == "premium":
20 base_discount = 0.10
21 elif customer_type == "vip":
22 base_discount = 0.20
23
24 if is_member and order_amount >= 100:
25 base_discount += 0.05
26
27 if order_amount >= 500:
28 base_discount += 0.03
29
30 # Cap discount at 25%
31 return min(base_discount, 0.25)
Aufgabe A: Vorbedingungen extrahieren (8 Punkte)
Listen Sie 4 Vorbedingungen auf, die wahr sein müssen, damit diese Funktion erfolgreich ausgeführt wird (ohne eine Exception auszulösen).
Referenzieren Sie die Zeilennummern, wo Sie jede Vorbedingung gefunden haben.
Ihre Antwort:
| # | Vorbedingung | Zeile(n) |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 | ||
| 4 |
(2 Punkte pro Vorbedingung)
Aufgabe B: Nachbedingungen dokumentieren (6 Punkte)
Listen Sie 2 Nachbedingungen auf - Garantien darüber, was die Funktion zurückgibt, wenn die Vorbedingungen erfüllt sind.
Ihre Antwort:
| # | Nachbedingung | Zeile(n) |
|---|---|---|
| 1 | ||
| 2 |
(3 Punkte pro Nachbedingung)
Aufgabe C: Formale Anforderungen schreiben (9 Punkte)
Schreiben Sie basierend auf dem Code 3 formale Anforderungen mit korrekten Anforderungs-IDs.
Verwenden Sie dieses Format:
REQ-DISC-001: Das System soll [Aktion] wenn [Bedingung].
Ihre Antwort:
REQ-DISC-001:
REQ-DISC-002:
REQ-DISC-003:
(3 Punkte pro Anforderung)
Aufgabe D: Implizite Anforderung identifizieren (2 Punkte)
Identifizieren Sie 1 Anforderung, die durch die Geschäftslogik impliziert wird, aber NICHT explizit im Code validiert oder dokumentiert ist.
Hinweis: Denken Sie darüber nach, welche Annahmen der Code macht, die Anforderungen sein könnten.
Ihre Antwort:
Lösung
Lösung anzeigen
Aufgabe A: Vorbedingungen
| # | Vorbedingung | Zeile(n) |
|---|---|---|
| 1 | customer_type muss einer der folgenden sein: „regular", „premium" oder „vip" |
8-9 |
| 2 | order_amount muss >= 0 sein (nicht-negativ) |
11-12 |
| 3 | order_amount muss <= 100.000 sein |
14-15 |
| 4 | is_member muss ein boolescher Wert sein |
2-4 (Type Hint) |
Alternative akzeptable Antworten:
customer_typemuss ein String sein (Zeile 2)order_amountmuss ein Float/eine Zahl sein (Zeile 3)
Aufgabe B: Nachbedingungen
| # | Nachbedingung | Zeile(n) |
|---|---|---|
| 1 | Rückgabewert liegt immer zwischen 0.0 und 0.25 (inklusiv) | 17, 30-31 |
| 2 | Rückgabewert ist ein Float, der einen Rabattprozentsatz darstellt | 5, 31 |
Alternative akzeptable Antworten:
- Rückgabewert ist nie größer als 0.25 (Zeile 31)
- Funktion gibt immer zurück (wirft nie), wenn Vorbedingungen erfüllt sind
- Rückgabewert ist nicht-negativ (Basis beginnt bei 0.0, nur Additionen)
Aufgabe C: Formale Anforderungen
REQ-DISC-001: Das System soll einen Basisrabatt von 10% anwenden, wenn der Kundentyp „premium” ist.
REQ-DISC-002: Das System soll einen zusätzlichen Rabatt von 5% anwenden, wenn der Kunde Mitglied ist UND der Bestellbetrag mindestens 100€ beträgt.
REQ-DISC-003: Das System soll den Gesamtrabatt auf 25% begrenzen, unabhängig von angesammelten Rabatten.
Alternative akzeptable Anforderungen:
- REQ-DISC-004: Das System soll einen Basisrabatt von 20% für VIP-Kunden anwenden.
- REQ-DISC-005: Das System soll einen zusätzlichen Rabatt von 3% für Bestellungen ab 500€ anwenden.
- REQ-DISC-006: Das System soll Bestellungen über 100.000€ ablehnen.
- REQ-DISC-007: Das System soll negative Bestellbeträge ablehnen.
Aufgabe D: Implizite Anforderungen
Akzeptable Antworten umfassen:
-
Währungsannahme: Der Code nimmt an, dass alle Beträge in derselben Währung sind (keine Währungsumrechnung).
-
Keine Interaktion von Mitgliedschaftsstufen: Der Code nimmt an, dass der Mitgliedschaftsbonus (5%) für alle Kundentypen gleich gilt - es gibt keine dokumentierte Regel, ob VIPs, die auch Mitglieder sind, den Bonus erhalten sollen.
-
Präzision des Bestellbetrags: Der Code spezifiziert keine Dezimalgenauigkeit für Bestellbeträge oder zurückgegebene Rabatte.
-
Regeln für gleichzeitige Rabatte: Der Code dokumentiert nicht, ob diese Rabatte mit Aktionscodes oder anderen Rabattsystemen kombiniert werden können.
-
Audit/Protokollierung: Es gibt keine Anforderung für die Protokollierung von Rabattberechnungen für Prüfzwecke.
-
Rundungsverhalten: Keine explizite Anforderung, wie Rabattprozentsätze bei der Berechnung von Endpreisen angewendet/gerundet werden sollen.
Bewertungshinweise
-
Aufgabe A: 2 Punkte für jede korrekt identifizierte Vorbedingung mit korrekter Zeilenreferenz vergeben. 1 Punkt vergeben, wenn Vorbedingung korrekt, aber Zeilenreferenz falsch ist.
-
Aufgabe B: 3 Punkte für klare, korrekte Nachbedingungen vergeben. 2 Punkte für teilweise korrekt (z.B. „gibt eine Zahl zurück” ohne Bereichsangabe).
- Aufgabe C: 3 Punkte für Anforderungen vergeben, die:
- Korrektes Format verwenden (REQ-ID: Das System soll…)
- Testbar sind
- Codeverhalten genau widerspiegeln
2 Punkte vergeben, wenn Format falsch, aber Inhalt korrekt ist. 1 Punkt für vage Anforderungen.
- Aufgabe D: 2 Punkte für jede vernünftige implizite Anforderung vergeben, die nicht im Code sichtbar ist. 1 Punkt für implizite Anforderungen, die teilweise abgedeckt sind.