06 Übung: Klassifikation von Architekturschichten
January 2026 (782 Words, 5 Minutes)
Einführung
In einer Schichtenarchitektur wird Code in horizontale Schichten organisiert, wobei jede Schicht eine spezifische Verantwortung hat:
- Präsentationsschicht: Benutzeroberfläche, HTTP-Routen, UI-Callbacks, HTML/JSON-Rendering
- Geschäftslogikschicht: Domänenlogik, Validierungsregeln, Berechnungen, Geschäftsentitäten
- Datenzugriffsschicht: Datenbankabfragen, Repositories, Objekt-Relationales Mapping
- Datenbank: Persistente Speicherung (Tabellen, Schemas)
Lernziele:
- Identifizieren, zu welcher Architekturschicht ein Code-Snippet gehört
- Die Verantwortlichkeiten jeder Schicht verstehen
- Muster erkennen, die auf Schichtzugehörigkeit hinweisen
- Entscheidungen zur Schichtklassifikation begründen
Anweisungen:
- Studieren Sie die Referenz zu Schichtverantwortlichkeiten
- Lesen Sie jeden Code-Ausschnitt sorgfältig
- Klassifizieren Sie jeden Ausschnitt nach Schicht und begründen Sie Ihre Antwort
- Überprüfen Sie Ihre Antworten anhand der Lösung
Gesamtpunkte: 16 Zeit: ~15 Minuten
Referenz: Schichtverantwortlichkeiten
| Schicht | Verantwortung | Typischer Code |
|---|---|---|
| Präsentation | Daten anzeigen, Benutzereingaben verarbeiten | Routen, Templates, Callbacks, HTML |
| Geschäftslogik | Domänenlogik, Regeln, Berechnungen | Services, Validatoren, Domänenmodelle |
| Datenzugriff | Persistenzoperationen | Repositories, SQL-Abfragen, ORM |
| Datenbank | Datenspeicherung | Tabellen, Indizes, Schemas |
Kernprinzip: Abhängigkeiten sollten nur nach unten zeigen (Präsentation → Geschäftslogik → Datenzugriff → Datenbank).
Code-Ausschnitte
Studieren Sie die folgenden Python-Code-Ausschnitte sorgfältig.
# Snippet A
def validate_email(email: str) -> bool:
return "@" in email and "." in email.split("@")[1]
# Snippet B
@app.route('/users/<id>')
def get_user(id):
user = user_service.find(id)
return render_template('user.html', user=user)
# Snippet C
def save_user(user: User) -> None:
cursor.execute("INSERT INTO users VALUES (?, ?)", (user.id, user.name))
# Snippet D
def calculate_discount(order: Order) -> float:
if order.total > 100:
return order.total * 0.1
return 0.0
# Snippet E
def render_order_summary(order: Order) -> str:
return f"""
<div class="order">
<h2>Order #{order.id}</h2>
<p>Total: €{order.total:.2f}</p>
</div>
"""
# Snippet F
class OrderRepository:
def find_by_customer(self, customer_id: str) -> list[Order]:
rows = self.db.execute(
"SELECT * FROM orders WHERE customer_id = ?",
(customer_id,)
)
return [Order(**row) for row in rows]
# Snippet G
@dataclass
class Order:
id: str
customer_id: str
items: list[OrderItem]
@property
def total(self) -> float:
return sum(item.price * item.quantity for item in self.items)
# Snippet H
@callback(Output('chart', 'figure'), Input('dropdown', 'value'))
def update_chart(selected_id):
data = service.get_analysis(selected_id)
return create_figure(data)
Aufgabe: Code-Ausschnitte klassifizieren (16 Punkte)
Identifizieren Sie für jeden Code-Ausschnitt (A-H), zu welcher Architekturschicht er gehört, und geben Sie eine kurze Begründung (1-2 Sätze).
Ihre Antwort:
| Snippet | Schicht | Begründung |
|---|---|---|
| A | ||
| B | ||
| C | ||
| D | ||
| E | ||
| F | ||
| G | ||
| H |
(1 Punkt pro korrekte Schicht, 1 Punkt pro gültige Begründung = 16 Punkte gesamt)
Lösung
Lösung anzeigen
Korrekte Antworten
| Snippet | Schicht | Begründung |
|---|---|---|
| A | Geschäftslogik | Validierungslogik ohne UI- oder Datenbankbelange. Reine Geschäftsregel für E-Mail-Format. |
| B | Präsentation | HTTP-Routenbehandlung mit @app.route-Dekorator; rendert ein Template zur Anzeige. |
| C | Datenzugriff | Direkte SQL-Ausführung (INSERT-Anweisung) zur Datenpersistierung. |
| D | Geschäftslogik | Domänenberechnungslogik (Rabattregeln basierend auf Bestellsumme). |
| E | Präsentation | HTML-Generierung/Rendering; erzeugt visuelle Ausgabe für den Benutzer. |
| F | Datenzugriff | SQL-Abfrageausführung mit Objektmapping (Zeilen → Order-Objekte). Repository-Muster. |
| G | Geschäftslogik (Domänenmodell) | Entitätsklasse mit eingebetteter Geschäftslogik (Summenberechnung über Items). |
| H | Präsentation | UI-Callback-Behandlung (Dash-Framework); koordiniert zwischen UI-Eingabe und Service. |
Bewertungshinweise
Schichtklassifikation (8 Punkte):
- 1 Punkt für jede korrekt identifizierte Schicht vergeben
- Häufige Fehler:
- Snippet A: Studierende könnten „Datenzugriff” sagen, weil es Daten verarbeitet, aber es ist Validierungslogik (Geschäftslogik)
- Snippet G: Studierende könnten „Datenzugriff” sagen, weil es eine Dataclass ist, aber sie enthält Geschäftslogik (total-Property)
Begründung (8 Punkte):
- 1 Punkt für jede gültige Begründung vergeben, die:
- Das Schlüsselmerkmal korrekt identifiziert, das die Zuordnung zu dieser Schicht bestimmt
- Verständnis der Schichtverantwortlichkeiten zeigt
- 0,5 Punkte für teilweise korrekte Begründungen (richtige Richtung, aber vage)
Alternative akzeptable Begründungen:
| Snippet | Alternative Begründungen |
|---|---|
| A | „Enthält Eingabevalidierungsregeln" |
| B | „Web-Framework-Route, die HTTP-Anfragen verarbeitet" |
| C | „Interagiert direkt mit der Datenbank über SQL" |
| D | „Implementiert Preis-/Rabatt-Geschäftsregeln" |
| E | „Generiert benutzerseitige HTML-Ausgabe" |
| F | „Kapselt Datenbankabfragen in Repository-Klasse" |
| G | „Domänenentität mit berechneter Property" oder „Kern-Geschäftsobjekt" |
| H | „Verarbeitet UI-Ereignisse und löst Service-Aufrufe aus" |