Home

06 Übung: Klassifikation von Architekturschichten

exercises chapter-06 architecture layered-architecture separation-of-concerns

Einführung

In einer Schichtenarchitektur wird Code in horizontale Schichten organisiert, wobei jede Schicht eine spezifische Verantwortung hat:

Lernziele:

Anweisungen:

  1. Studieren Sie die Referenz zu Schichtverantwortlichkeiten
  2. Lesen Sie jeden Code-Ausschnitt sorgfältig
  3. Klassifizieren Sie jeden Ausschnitt nach Schicht und begründen Sie Ihre Antwort
  4. Ü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"
© 2026 Dominik Mueller   •  Powered by Soopr   •  Theme  Moonwalk