bg_image
header

Entity Manager

Ein Entity Manager ist ein zentraler Bestandteil von ORM-Frameworks (Object-Relational Mapping), vor allem im Zusammenhang mit Java (JPA – Java Persistence API), aber auch in anderen Sprachen wie PHP (Doctrine ORM).

Hier ist eine verständliche Erklärung:


💡 Definition:

Ein Entity Manager ist eine Komponente, die sich um die Verwaltung von Datenbank-Entities (also Objekten/Datensätzen) kümmert. Er bildet die Schnittstelle zwischen der objektorientierten Welt des Codes und der relationalen Welt der Datenbank.


📦 Aufgaben eines Entity Managers:

  1. Persistieren (Speichern):

    • Speichert ein neues Objekt (Entity) in der Datenbank.

    • Beispiel: $entityManager->persist($user);

  2. Finden/Laden:

    • Holt ein Objekt anhand seiner ID oder anderer Kriterien.

    • Beispiel: $entityManager->find(User::class, 1);

  3. Aktualisieren:

    • Änderungen an einem Objekt werden verfolgt und in die Datenbank geschrieben (z. B. beim flush()).

  4. Entfernen/Löschen:

    • Löscht ein Objekt aus der Datenbank.

    • Beispiel: $entityManager->remove($user);

  5. Transaktionen verwalten:

    • Beginnt, commitet oder rollt Transaktionen zurück.

  6. Query-Handling:


🔁 Lebenszyklus von Entities:

Der Entity Manager verwaltet den „Zustand“ von Objekten:

  • managed (verfolgt Änderungen),

  • detached (nicht mehr verwaltet),

  • removed (zum Löschen markiert),

  • new (noch nicht gespeichert).


🛠 Beispiel mit Doctrine (PHP):

$user = new User();
$user->setName('Max Mustermann');

$entityManager->persist($user); // Zum Speichern vormerken
$entityManager->flush();        // Tatsächlich in DB schreiben

Fazit:

Der Entity Manager ist der zentrale Ansprechpartner, wenn es darum geht, mit Datenbankobjekten zu arbeiten – lesen, schreiben, ändern, löschen. Er abstrahiert die SQL-Ebene und macht die Datenbankarbeit objektorientiert steuerbar.


Doctrine Database Abstraction Layer - DBAL

Doctrine DBAL (Database Abstraction Layer) ist eine PHP-Bibliothek, die eine Abstraktionsschicht für den Datenbankzugriff bietet. Sie ist ein Teil von Doctrine, einem weit verbreiteten ORM-Projekt (Object-Relational Mapping), aber kann unabhängig vom ORM verwendet werden.

Ziel und Nutzen von Doctrine DBAL:

Doctrine DBAL bietet eine einheitliche API, um mit verschiedenen Datenbanken (wie MySQL, PostgreSQL, SQLite usw.) zu kommunizieren, ohne direkt SQL für die jeweilige Datenbank schreiben zu müssen.


Hauptfunktionen von Doctrine DBAL:

  • Verbindungsverwaltung:
    • Verbindungsaufbau zu Datenbanken über Konfigurationsarrays.

    • Unterstützung für Verbindungs-Pooling, Transaktionen usw.

  • SQL-Query-Builder:
    • Dynamisches Erstellen von SQL-Abfragen über eine objektorientierte API:

$qb = $conn->createQueryBuilder();
$qb->select('u.id', 'u.name')
   ->from('users', 'u')
   ->where('u.age > :age')
   ->setParameter('age', 18);
$stmt = $qb->executeQuery();
  • Datenbankunabhängigkeit:

    • Die gleichen Funktionen und Abfragen funktionieren mit verschiedenen DBMS, z. B. MySQL, PostgreSQL, SQLite.

  • Schema-Management:

    • Werkzeuge zum Erstellen, Ändern und Vergleichen von Datenbankschemata.

    • Nützlich für Migrationen.

  • Datentyp-Konvertierung:

    • Konvertiert Daten zwischen PHP und dem nativen Datenbankformat.

use Doctrine\DBAL\DriverManager;

$conn = DriverManager::getConnection([
    'dbname' => 'test',
    'user' => 'root',
    'password' => '',
    'host' => 'localhost',
    'driver' => 'pdo_mysql',
]);

$result = $conn->fetchAllAssociative('SELECT * FROM users');

Wann DBAL statt ORM?

Du verwendest DBAL ohne ORM, wenn:

  • Du mehr Kontrolle über SQL willst.

  • Dein Projekt keine komplexe Objekt-Mapping-Logik braucht.

  • Du bereits vorhandene SQL-Strukturen nutzen musst.


Fazit:

Doctrine DBAL ist ein mächtiges Werkzeug für sauberen, portablen und sicheren Datenbankzugriff in PHP, ohne sich auf ein vollständiges ORM einlassen zu müssen. Es liegt genau zwischen direktem PDO-Zugriff und einem vollwertigen ORM wie Doctrine ORM.

 


Join Point

Ein Join Point ist ein Begriff aus der Aspect-Oriented Programming (AOP), also der aspektorientierten Programmierung.

Definition:

Ein Join Point ist eine definierte Stelle im Ablauf eines Programms, an der zusätzlicher Code (ein sogenannter Aspekt) eingefügt werden kann.

Typische Beispiele für Join Points:

  • Aufruf einer Methode

  • Ausführung einer Methode

  • Zugriff auf ein Attribut (lesen oder schreiben)

  • Werfen einer Ausnahme

Kontext:

In AOP wird Programmcode modularisiert, indem Querschnittsfunktionen (wie Logging, Sicherheit, Transaktionsmanagement) aus dem eigentlichen Anwendungscode ausgelagert werden. Diese Funktionen werden dann an bestimmten Punkten im Programmablauf (den Join Points) „eingeschnitten“.

Weitere Begriffe im Zusammenhang:

  • Pointcut: Eine Ausdrucksweise, mit der beschrieben wird, welche Join Points betroffen sind (z. B. „alle Methoden mit dem Namen save*“).

  • Advice: Der Code, der an einem Join Point ausgeführt wird (z. B. „logge diesen Methodenaufruf“).

  • Aspect: Eine Kombination aus Pointcut(s) und Advice(s) – also ein vollständiges Modul, das eine Querschnittsfunktion implementiert.

Beispiel (in Spring AOP):

@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod(JoinPoint joinPoint) {
    System.out.println("Aufruf von: " + joinPoint.getSignature().getName());
}

→ Hier wird vor jedem Methodenaufruf in einem bestimmten Package ein Logging-Code ausgeführt – und joinPoint.getSignature() liefert Details zum konkreten Join Point.


Aspect Oriented Programming - AOP

Aspect-Oriented Programming (AOP) ist ein Programmierparadigma, das sich darauf konzentriert, Querschnittsfunktionen (Cross-Cutting Concerns) modular zu kapseln. Es ergänzt objektorientierte oder funktionale Programmierung, indem es Code, der sich durch viele Klassen oder Module zieht, auslagert und separat behandelt.


💡 Ziel:

Probleme wie Logging, Sicherheitsprüfungen, Fehlerbehandlung, Transaktionsmanagement oder Performance-Messungen sind typische Cross-Cutting Concerns. Diese wiederholen sich oft in vielen Klassen und Methoden – AOP ermöglicht es, solchen Code zentral zu schreiben und automatisch an den richtigen Stellen auszuführen.


🔧 Grundbegriffe:

  • Aspect: Ein Modul, das eine Querschnittsfunktion kapselt.

  • Advice: Der eigentliche Code, der ausgeführt wird (z. B. vor, nach oder anstatt einer Methode).

  • Join Point: Ein Punkt im Programmablauf, an dem ein Aspect eingreifen kann (z. B. Methodenaufruf).

  • Pointcut: Eine Definition, welche Join Points betroffen sind (z. B. "alle Methoden in Klasse X").

  • Weaving: Der Prozess, bei dem Aspect-Code mit dem eigentlichen Code „verwoben“ wird – zur Laufzeit, beim Kompilieren oder beim Laden.


🛠 Beispiel (in Java mit Spring AOP):

@Aspect
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBeforeMethod(JoinPoint joinPoint) {
        System.out.println("Methode wird aufgerufen: " + joinPoint.getSignature().getName());
    }
}

Dieser Code führt automatisch Logging aus, bevor jede Methode im com.example.service-Paket ausgeführt wird.


✅ Vorteile:

  • Bessere Modularität

  • Weniger Code-Duplikate

  • Trennung von Fachlogik und Querschnittslogik


❌ Nachteile:

  • Kann die Lesbarkeit erschweren (man sieht nicht sofort, was alles beim Methodenaufruf passiert).

  • Debugging kann komplexer sein.

  • Oft framework-abhängig (z. B. Spring, AspectJ).


Design by Contract - DbC

Design by Contract (DbC) ist ein Konzept aus der Softwareentwicklung, das von Bertrand Meyer eingeführt wurde. Es beschreibt eine Methode zur Sicherstellung der Korrektheit und Zuverlässigkeit von Software, indem Verträge zwischen den verschiedenen Komponenten (z.B. Methoden, Klassen) definiert werden.

Grundprinzipien von Design by Contract

Bei DbC wird jede Software-Komponente wie eine Vertragspartei gesehen, die bestimmte Verpflichtungen und Garantien einhält:

  1. Vorbedingungen (Preconditions)
    Bedingungen, die erfüllt sein müssen, bevor eine Methode oder Funktion korrekt ausgeführt werden kann.
    → Verantwortung des Aufrufers.

  2. Nachbedingungen (Postconditions)
    Bedingungen, die nach der Ausführung garantiert werden.
    → Verantwortung der Methode/Funktion.

  3. Invariant (Klasseninvariante)
    Bedingungen, die während der gesamten Lebenszeit eines Objekts wahr bleiben müssen.
    → Verantwortung sowohl der Methode als auch des Aufrufers.

Ziel von Design by Contract

  • Klare Spezifikation der Verantwortlichkeiten.

  • Robustere und besser testbare Software.

  • Fehler werden frühzeitig erkannt (z.B. durch Verletzung des Vertrags).

Beispiel in Pseudocode

class BankAccount {
    private double balance;

    // Invariante: balance >= 0

    void withdraw(double amount) {
        // Vorbedingung: amount > 0 && amount <= balance
        if (amount <= 0 || amount > balance) throw new IllegalArgumentException();

        balance -= amount;

        // Nachbedingung: balance wurde um amount verringert
    }
}

Vorteile

  • Klare Verträge führen zu weniger Missverständnissen.

  • Bessere Fehlersuche, da Verstöße gegen Verträge sofort auffallen.

  • Unterstützt die defensive Programmierung.

Nachteile


Styled Layer Descriptor - SLD

SLD (Styled Layer Descriptor) ist ein XML-basiertes Standardformat, das von der Open Geospatial Consortium (OGC) entwickelt wurde. Es dient dazu, die Darstellung (also das Styling) von georäumlichen Daten in Web-Kartendiensten wie WMS (Web Map Service) zu beschreiben.

Was macht SLD genau?

SLD beschreibt wie bestimmte Geodaten auf einer Karte visualisiert werden sollen – also Farben, Linien, Symbole, Beschriftungen usw. Du kannst damit zum Beispiel festlegen:

  • Straßen sollen rot dargestellt werden.

  • Gewässer in Blau, mit einer bestimmten Transparenz.

  • Punkte mit Symbolen anzeigen, die je nach Attributwert (z. B. Bevölkerung) unterschiedlich aussehen.

  • Texte (Labels) über Features schreiben.

Technisch gesehen:

  • SLD ist eine XML-Datei mit einer bestimmten Struktur.

  • Sie kann von WMS-Servern wie GeoServer oder MapServer gelesen werden.

  • Die Datei enthält Rules, Filters und Symbolizer, z. B. LineSymbolizer, PolygonSymbolizer oder TextSymbolizer.

Beispiel für ein einfaches SLD-Snippet:

<Rule>
  <Name>Wasserflächen</Name>
  <PolygonSymbolizer>
    <Fill>
      <CssParameter name="fill">#0000FF</CssParameter>
    </Fill>
  </PolygonSymbolizer>
</Rule>

Wozu braucht man das?

  • Um Karten individuell zu gestalten (z. B. thematische Karten).

  • Um Styling unabhängig vom Client zu definieren – der Server liefert die Karten gleich richtig gestylt.

  • Für interaktive Web-GIS-Anwendungen, die flexibel auf Attributwerte reagieren.

Wenn du mit Geodaten arbeitest – z. B. in QGIS oder GeoServer – wirst du früher oder später auf SLD stoßen, vor allem wenn du das Kartenbild präzise kontrollieren willst.


Hyperscaler

Ein Hyperscaler ist ein Unternehmen, das Cloud-Dienste in extrem großem Maßstab anbietet – also IT-Infrastruktur wie Rechenleistung, Speicher und Netzwerke, die flexibel, hochverfügbar und global skalierbar sind. Typische Beispiele für Hyperscaler sind:

  • Amazon Web Services (AWS)

  • Microsoft Azure

  • Google Cloud Platform (GCP)

  • Alibaba Cloud

  • IBM Cloud (in etwas kleinerem Maßstab)

Merkmale von Hyperscalern:

  1. Massive Skalierbarkeit
    Sie können ihre Dienste quasi unbegrenzt nach oben oder unten skalieren – je nach Bedarf des Kunden.

  2. Globale Infrastruktur
    Rechenzentren sind weltweit verteilt, was eine hohe Verfügbarkeit, niedrige Latenzen und Redundanz ermöglicht.

  3. Automatisierung & Standardisierung
    Vieles ist automatisiert (z. B. Bereitstellung, Überwachung, Abrechnung), wodurch Services effizienter und günstiger angeboten werden können.

  4. Self-Service & Pay-as-you-go
    Kunden buchen Services meist über Webportale oder APIs und zahlen nur für die tatsächlich genutzten Ressourcen.

  5. Innovationsplattform
    Hyperscaler bieten nicht nur Infrastruktur (IaaS), sondern auch Plattformdienste (PaaS) und KI-, Big-Data- oder IoT-Services.

Wofür werden Hyperscaler genutzt?

  • Hosting von Websites oder Webanwendungen

  • Datenspeicherung (z. B. Backups, Archive)

  • Big-Data-Analysen

  • Machine Learning / AI

  • Streamingdienste

  • Unternehmens-IT-Infrastruktur


Materialized View

Eine Materialized View (auf Deutsch: „materialisierte Sicht“) ist ein spezielles Datenbankobjekt, das das Ergebnis einer SQL-Abfrage dauerhaft speichert – im Gegensatz zu einer normalen View, die bei jeder Abfrage dynamisch berechnet wird.

Eigenschaften einer Materialized View:

  • Speicherung auf Festplatte: Die Daten der Abfrage werden tatsächlich gespeichert, nicht nur die Abfrage selbst.

  • Schnellere Abfragen: Da die Daten bereits berechnet und gespeichert sind, können Anfragen deutlich schneller beantwortet werden.

  • Aktualisierung notwendig: Da sich die zugrundeliegenden Daten ändern können, muss die Materialized View explizit oder automatisch aktualisiert (refreshed) werden, um aktuell zu bleiben.

Vergleich: View vs. Materialized View

Merkmal View Materialized View
Speicherung Nur Abfrage, keine Daten Abfrage und Daten gespeichert
Performance Langsamer bei komplexen Abfragen Schneller, da Daten vorgerechnet
Aktualität Immer aktuell Kann veraltet sein
Aktualisierung notwendig Nein Ja (manuell oder automatisch)

Beispiel:

-- Erstellen einer Materialized View in PostgreSQL
CREATE MATERIALIZED VIEW top_customers AS
SELECT customer_id, SUM(order_total) AS total_spent
FROM orders
GROUP BY customer_id;

Um die Daten zu aktualisieren:

REFRESH MATERIALIZED VIEW top_customers;

Wann ist sie sinnvoll?

  • Bei komplexen Aggregationen, die häufig gebraucht werden

  • Wenn Performance wichtiger ist als Echtzeit-Aktualität

  • In Data Warehouses oder Reporting-Systemen


Vite

Vite ist ein modernes Build-Tool und Entwicklungsserver für Webanwendungen, das von Evan You, dem Schöpfer von Vue.js, entwickelt wurde. Es ist darauf ausgelegt, die Entwicklungs- und Build-Prozesse schneller und effizienter zu gestalten. Der Name "Vite" stammt vom französischen Wort für "schnell" und spiegelt das Hauptziel der Software wider: eine blitzschnelle Entwicklungsumgebung.

Die Hauptmerkmale von Vite sind:

  1. Schneller Entwicklungsserver: Vite nutzt die modernen ES-Module (ESM) und bietet durch diese Technik einen ultraschnellen Entwicklungsserver. Es wird nur das neueste Modul geladen, was die Initialisierung deutlich schneller macht als traditionelle Bundler.

  2. Hot Module Replacement (HMR): Der HMR funktioniert extrem schnell, indem er nur die geänderten Module aktualisiert, ohne die gesamte Anwendung neu zu laden.

  3. Modernes Build-System: Vite verwendet Rollup unter der Haube, um die endgültige Produktion zu bundeln, was optimierte und effizientere Builds ermöglicht.

  4. Zero-Konfiguration: Vite ist sehr benutzerfreundlich und erfordert keine umfangreiche Konfiguration. Es funktioniert sofort mit der Standard-Konfiguration, wobei es viele gängige Web-Technologien out-of-the-box unterstützt (z. B. Vue.js, React, TypeScript, CSS-Preprozessoren usw.).

  5. Optimierte Produktion: Für die Produktion wird Rollup verwendet, das für seine effizienten und optimierten Bundles bekannt ist.

Vite richtet sich hauptsächlich an moderne Web-Anwendungen und ist besonders beliebt bei Entwicklern, die mit Frameworks wie Vue, React oder Svelte arbeiten.

 


Partial Mock

Ein Partial Mock (teilweises Mocking) ist eine Technik beim Testen von Software, bei der nur ein Teil eines Objekts durch ein Mock ersetzt wird, während der Rest der echten Implementierung erhalten bleibt. Dies ist besonders nützlich, wenn du nur bestimmte Methoden eines Objekts stubben oder mocken möchtest, während andere Methoden normal ausgeführt werden.

Wann wird ein Partial Mock verwendet?

  • Wenn du eine Klasse testen möchtest, aber bestimmte Methoden von ihr isolieren musst.

  • Wenn einige Methoden schwer zu testen sind (z. B. weil sie externe Abhängigkeiten haben), aber andere weiterhin mit ihrer echten Logik arbeiten sollen.

  • Wenn du nur einige Methoden stubben möchtest, um den Testablauf zu steuern.

Beispiel in PHP mit PHPUnit

Angenommen, du hast eine Klasse Calculator, aber möchtest die Methode multiply() mocken, während add() normal funktioniert.

class Calculator {
    public function add($a, $b) {
        return $a + $b;
    }

    public function multiply($a, $b) {
        return $a * $b;
    }
}

// PHPUnit Test mit Partial Mock
class CalculatorTest extends \PHPUnit\Framework\TestCase {
    public function testPartialMock() {
        // Partial Mock von Calculator
        $calculator = $this->getMockBuilder(Calculator::class)
                           ->onlyMethods(['multiply']) // Nur diese Methode mocken
                           ->getMock();

        // Definiere Verhalten für multiply()
        $calculator->method('multiply')->willReturn(10);

        // Teste echte Methode add()
        $this->assertEquals(5, $calculator->add(2, 3));

        // Teste gemockte Methode multiply()
        $this->assertEquals(10, $calculator->multiply(2, 3));
    }
}

Hier bleibt add() unverändert und arbeitet mit der echten Implementierung, während multiply() immer 10 zurückgibt.

Fazit

Partial Mocks sind nützlich, wenn du Teile einer Klasse isolieren möchtest, ohne sie vollständig zu ersetzen. Sie helfen, Tests stabiler und effizienter zu machen, indem nur bestimmte Methoden gemockt werden.