Softwarearchitektur

Softwarearchitektur beschreibt die grundlegende Struktur und Organisation eines Software-Systems.

Sie definiert die Hauptkomponenten, ihre Beziehungen zueinander und die Prinzipien, nach denen das System aufgebaut ist.

Warum ist Softwarearchitektur wichtig?

Eine gute Architektur ist das Fundament für:

  • Wartbarkeit - Code lässt sich einfacher ändern
  • Skalierbarkeit - System kann wachsen
  • Erweiterbarkeit - Neue Funktionen hinzufügen
  • Verständlichkeit - Entwickler finden sich schnell zurecht
  • Wiederverwendbarkeit - Komponenten können mehrfach genutzt werden

Architekturmuster

MVC - Model View Controller

MVC trennt die Anwendung in drei Hauptkomponenten:

Die drei Schichten:

Beispiel: Web-Anwendung

┌──────────┐
│   View   │ ← Zeigt Daten an (HTML, CSS)
└─────┬────┘
     │
┌─────▼────────┐
│  Controller  │ ← Verarbeitet Anfragen
└─────┬────────┘
     │
┌─────▼────┐
│  Model   │ ← Datenbankzugriff
└──────────┘

Ablauf:

  1. Benutzer klickt Button (View)
  2. Controller empfängt Request
  3. Controller fragt Model nach Daten
  4. Model holt Daten aus Datenbank
  5. Controller gibt Daten an View
  6. View zeigt Ergebnis an

Vorteile:


Layered Architecture (Schichtenarchitektur)

Die Anwendung wird in horizontale Schichten aufgeteilt, wobei jede Schicht nur mit der darunterliegenden kommuniziert.

┌─────────────────────────────────┐
│  Presentation Layer (UI)        │ ← Benutzeroberfläche
├─────────────────────────────────┤
│  Business Logic Layer           │ ← Geschäftslogik
├─────────────────────────────────┤
│  Data Access Layer              │ ← Datenbankzugriff
├─────────────────────────────────┤
│  Database Layer                 │ ← Datenspeicherung
└─────────────────────────────────┘

Die 4 Schichten:

1. Presentation Layer (Präsentationsschicht)

2. Business Logic Layer (Geschäftslogik)

3. Data Access Layer (Datenzugriffsschicht)

4. Database Layer (Datenbankschicht)

Vorteile

  • ✅ Klare Strukturierung
  • ✅ Austauschbarkeit einzelner Schichten
  • ✅ Einfache Wartung
  • ✅ Wiederverwendbarkeit

Nachteile

  • ❌ Kann zu starr sein
  • ❌ Performance-Overhead durch Schichten
  • ❌ Änderungen durchlaufen alle Schichten


Microservices-Architektur

Statt einer großen Anwendung (Monolith) baut man viele kleine, unabhängige Services.

┌─────────────┐  ┌─────────────┐  ┌─────────────┐
│   User      │  │   Payment   │  │   Order     │
│   Service   │  │   Service   │  │   Service   │
└──────┬──────┘  └──────┬──────┘  └──────┬──────┘
       │                │                │
       └────────────────┼────────────────┘
                        │
                  ┌─────▼─────┐
                  │  API      │
                  │  Gateway  │
                  └───────────┘

Charakteristiken:

Vorteile

  • ✅ Unabhängige Entwicklung und Deployment
  • ✅ Skalierbarkeit (nur benötigte Services skalieren)
  • ✅ Fehler isoliert (ein Service-Ausfall ≠ Gesamtausfall)
  • ✅ Technologie-Freiheit

Nachteile

  • ❌ Komplexere Kommunikation
  • ❌ Verteilte Systeme schwerer zu debuggen
  • ❌ Mehr Deployment-Aufwand
  • ❌ Netzwerk-Latenz zwischen Services


Client-Server-Architektur

Der Server stellt Dienste bereit, die Clients nutzen.

┌─────────┐  ┌─────────┐  ┌─────────┐
│ Client  │  │ Client  │  │ Client  │
│  (PC)   │  │ (Handy) │  │ (Web)   │
└────┬────┘  └────┬────┘  └────┬────┘
     │            │            │
     └────────────┼────────────┘
                  │
            ┌─────▼─────┐
            │  Server   │
            │           │
            └─────┬─────┘
                  │
            ┌─────▼─────┐
            │ Datenbank │
            └───────────┘

Vorteile:

Nachteile:


Monolithische Architektur

Die gesamte Anwendung ist ein einziges, großes Programm.

┌─────────────────────────────────┐
│                                 │
│      Monolithische App          │
│                                 │
│  ┌────────┐  ┌────────┐        │
│  │   UI   │  │ Logic  │        │
│  └────────┘  └────────┘        │
│                                 │
│  ┌──────────────────┐          │
│  │    Database      │          │
│  └──────────────────┘          │
│                                 │
└─────────────────────────────────┘

Vorteile:

Nachteile:


Architekturprinzipien

Separation of Concerns (Trennung der Zuständigkeiten)

Jede Komponente sollte eine klare Aufgabe haben.

Beispiel

Schlecht: Eine Klasse macht Datenbankzugriff, UI-Rendering UND Geschäftslogik

Gut:

  • UserRepository - Datenbankzugriff
  • UserService - Geschäftslogik
  • UserController - UI-Logik

Loose Coupling (Lose Kopplung)

Komponenten sollten möglichst unabhängig voneinander sein.

Vorteil: Änderungen in einer Komponente beeinflussen andere nicht.

High Cohesion (Hohe Kohäsion)

Verwandte Funktionen sollten zusammen in einer Komponente sein.

Don't Repeat Yourself (DRY)

Vermeide Code-Duplikation - schreibe wiederverwendbare Komponenten.


Architekturentscheidungen

Welche Architektur wählen?

Kleine Anwendung, kleines Team:
Monolith oder Layered Architecture

Mittlere Anwendung, klare Trennung UI/Logik/Daten:
MVC oder Layered Architecture

Große Anwendung, viele Teams, hohe Skalierung:
Microservices

Web-Anwendung:
Client-Server mit MVC


Cloud vs. On-Premises

Aspekt Cloud On-Premises
Hosting Server bei Anbieter Eigene Server
Kosten Monatlich (OpEx) Anfangsinvestition (CapEx)
Skalierung Flexibel Fixe Kapazität
Wartung Anbieter Eigenes IT-Team
Kontrolle Begrenzt Volle Kontrolle
Setup-Zeit Minuten Wochen/Monate

Cloud-Modelle:


Speicher-Architekturen

NAS - Network Attached Storage

Datei-basierter Speicher im Netzwerk - wie ein gemeinsamer Ordner.

Verwendung:

SAN - Storage Area Network

Block-basierter Speicher - wie eine lokale Festplatte über Netzwerk.

Verwendung:

NAS SAN
Datei-basiert Block-basiert
Einfach einzurichten Komplex
Günstiger Teurer
Langsamer Schneller

Best Practices

Gute Architektur

  • Modular - Komponenten unabhängig austauschbar
  • Dokumentiert - Architektur-Diagramme und Beschreibungen
  • Testbar - Komponenten isoliert testbar
  • Skalierbar - System kann wachsen
  • Sicher - Security von Anfang an mitgedacht
  • Performance - Engpässe vermeiden

Häufige Fehler

  • ❌ Keine klare Architektur (Code wächst chaotisch)
  • ❌ Zu komplexe Architektur für einfache Probleme
  • ❌ Architektur nicht dokumentiert
  • ❌ Komponenten zu stark gekoppelt
  • ❌ Security als Nachgedanke


Siehe auch: