bg_image
header

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).


Assertion

Assertions (auf Deutsch: Behauptungen oder Zusicherungen) sind Programmierkonstrukte, mit denen du Annahmen über den Zustand deines Programms überprüfst. Eine Assertion prüft, ob eine bestimmte Bedingung wahr ist – wenn nicht, wird typischerweise ein Fehler ausgelöst und das Programm abgebrochen.

Beispiel (in Python):

x = 10
assert x > 0   # läuft problemlos
assert x < 5   # AssertionError, weil x nicht kleiner als 5 ist

Zweck von Assertions:

  • Sie helfen beim Debuggen: Du überprüfst, ob bestimmte Voraussetzungen im Code erfüllt sind.

  • Sie dokumentieren implizite Annahmen: z. B. „An dieser Stelle muss die Liste mindestens ein Element haben.“

  • Sie dienen der Fehlersuche in der Entwicklungsphase – im Produktivcode werden sie oft deaktiviert.

Wichtiger Unterschied zu regulären Fehlerbehandlungen:

Assertions sollen Programmfehler aufdecken, nicht Benutzereingaben oder äußere Einflüsse abfangen. Beispiel:

  • assert age > 0 → falsch, wenn age aus Benutzereingabe stammt.

  • Stattdessen: if age <= 0: raise ValueError("Alter muss positiv sein.")

 


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


Perl Compatible Regular Expressions - PCRE

Perl Compatible Regular Expressions (PCRE) sind eine Implementierung von regulären Ausdrücken, die sich an der Syntax und Funktionalität der Programmiersprache Perl orientiert. Sie bieten eine sehr mächtige, flexible und erweiterte Syntax, die über einfache reguläre Ausdrücke hinausgeht.

Warum „Perl Compatible“?

Perl war eine der ersten Sprachen, die besonders leistungsstarke reguläre Ausdrücke eingeführt hat. Die PCRE-Bibliothek wurde entwickelt, um diese Funktionen auch in anderen Programmiersprachen und Tools verfügbar zu machen – zum Beispiel in:

  • PHP

  • Python (teilweise, re-Modul ähnelt PCRE)

  • JavaScript (mit leichten Abweichungen)

  • grep-Varianten wie pcregrep

  • Texteditoren wie VS Code, Sublime Text etc.


Wichtige Features von PCRE:

Lookahead & Lookbehind:

  • (?=...) – positive Lookahead

  • (?!...) – negative Lookahead

  • (?<=...) – positive Lookbehind

  • (?<!...) – negative Lookbehind

Nicht-gierige Quantifizierer:

  • *?, +?, ??, {m,n}?

Benannte Gruppen:

  • (?P<name>...) oder (?<name>...)

Unicode-Support:

  • \p{L} für Unicode-Buchstaben usw.

Assertions und Grenzen:

  • \b, \B, \A, \Z, \z

Modifikatoren:

  • (?i) für case-insensitive

  • (?m) für multiline usw.

(?<=\buser\s)\w+

Dieser Ausdruck findet Wörter, die nach "user " stehen (Lookbehind).


Fazit:

PCRE sind die "Deluxe-Version" regulärer Ausdrücke – sie sind leistungsfähig, weit verbreitet und flexibel. Wenn du in einem Tool oder einer Sprache arbeitest, die „PCRE unterstützt“, kannst du dich auf die mächtige Perl-ähnliche Syntax freuen.


Guard

In der Softwareentwicklung bezeichnet ein Guard (auch Guard Clause oder Guard Statement) eine Art von Schutzmechanismus innerhalb einer Funktion oder Methode, der sicherstellt, dass bestimmte Bedingungen erfüllt sind, bevor der restliche Code ausgeführt wird.

Einfach erklärt:

Ein Guard ist wie ein Türsteher: Er lässt nur das durch, was erlaubt ist – und alles andere wird frühzeitig beendet.

Typisches Beispiel (in Python):

def divide(a, b):
    if b == 0:
        return "Division durch null nicht erlaubt"  # Guard Clause
    return a / b

In diesem Beispiel schützt der Guard davor, dass eine Division durch null passiert.


Vorteile von Guards:

  • Frühes Beenden bei ungültigen Zuständen

  • Verbesserte Lesbarkeit durch weniger verschachtelte if-else-Strukturen

  • Saubererer Codefluss, da der "Happy Path" (also der normale Ablauf) nicht durch viele Sonderfälle unterbrochen wird


Beispiele in anderen Sprachen:

JavaScript:

function login(user) {
  if (!user) return; // Guard
  // Weiter mit Login-Logik
}

Swift (hat sogar ein eigenes Schlüsselwort guard):

func greet(person: String?) {
  guard let name = person else {
    print("Kein Name übergeben")
    return
  }
  print("Hallo, \(name)!")
}

Salesforce Apex

Salesforce Apex ist eine objektorientierte Programmiersprache, die speziell für die Salesforce-Plattform entwickelt wurde. Sie ähnelt Java und wird hauptsächlich verwendet, um benutzerdefinierte Geschäftslogik, Automatisierungen und Integrationen in Salesforce zu implementieren.

Wichtige Merkmale von Apex:

  • Cloud-basiert: Läuft ausschließlich auf den Servern von Salesforce.

  • Syntaxähnlichkeit zu Java: Wer Java kennt, kann Apex schnell lernen.

  • Eng mit der Salesforce-Datenbank (SOQL & SOSL) verknüpft: Ermöglicht direkte Datenabfragen und Manipulationen.

  • Ereignisgesteuert: Wird oft durch Salesforce-Trigger (z. B. Änderungen an Datensätzen) ausgeführt.

  • Governor Limits: Salesforce begrenzt Ressourcenverbrauch (z. B. maximale Anzahl von SOQL-Abfragen pro Transaktion), um die Performance der Plattform zu sichern.

Verwendung von Apex:

  • Triggers: Automatische Aktionen bei Änderungen an Datensätzen.

  • Batch-Prozesse: Verarbeitung großer Datenmengen in Hintergrundjobs.

  • Web Services & API-Integrationen: Kommunikation mit externen Systemen.

  • Custom Controllers für Visualforce & Lightning: Steuerung von Benutzeroberflächen.

 


Whoops

Die PHP-Bibliothek Whoops ist ein leistungsstarkes und benutzerfreundliches Fehlermanagement-Tool für PHP-Anwendungen. Sie sorgt dafür, dass Fehler in einer ansprechenden und übersichtlichen Weise dargestellt werden, was die Fehlersuche und -behebung erleichtert.

Hauptfunktionen von Whoops

Schöne, interaktive Fehlerseiten
Detaillierte Stack-Traces mit Code-Vorschau
Einfache Integration in bestehende PHP-Projekte
Unterstützung für verschiedene Frameworks (Laravel, Symfony, Slim, etc.)
Anpassbar durch eigene Handler und Logger


Installation

Whoops kann mit Composer installiert werden:

composer require filp/whoops

Grundlegende Nutzung

Hier ist ein einfaches Beispiel, wie du Whoops in deinem PHP-Projekt aktivieren kannst:

require 'vendor/autoload.php';

use Whoops\Run;
use Whoops\Handler\PrettyPageHandler;

$whoops = new Run();
$whoops->pushHandler(new PrettyPageHandler());
$whoops->register();

// Erzeugt einen Fehler (z. B. eine nicht definierte Variable aufrufen)
echo $undefinedVariable;

Falls ein Fehler auftritt, zeigt Whoops eine übersichtliche Debug-Seite an.


Anpassung und Erweiterung

Du kannst Whoops auch erweitern, z. B. indem du eine eigene Fehlerbehandlung hinzufügst:

use Whoops\Handler\CallbackHandler;

$whoops->pushHandler(new CallbackHandler(function ($exception, $inspector, $run) {
    error_log($exception->getMessage());
}));

Diese Variante loggt Fehler in eine Datei, anstatt sie direkt anzuzeigen.


Einsatzgebiete

Whoops wird oft in Entwicklungsumgebungen verwendet, um schnell auf Fehler zu reagieren. In Produktionsumgebungen sollte es jedoch deaktiviert oder durch eine benutzerdefinierte Fehlerseite ersetzt werden.


Swift

Swift ist eine von Apple entwickelte, leistungsstarke und benutzerfreundliche Programmiersprache für die Entwicklung von Apps für iOS, macOS, watchOS und tvOS. Sie wurde 2014 als moderne Alternative zu Objective-C vorgestellt und zeichnet sich durch ihre Geschwindigkeit, Sicherheit und einfache Syntax aus.

Hauptmerkmale von Swift:

  • Sicherheit: Vermeidung häufiger Programmierfehler wie Null-Zeiger-Dereferenzierung.
  • Lesbarkeit & Wartbarkeit: Klare, intuitive Syntax erleichtert das Schreiben und Verstehen von Code.
  • Geschwindigkeit: Optimiert für hohe Performance, vergleichbar mit C++.
  • Interaktivität: Mit Playgrounds können Entwickler Code direkt ausprobieren und Ergebnisse live sehen.
  • Open Source: Seit 2015 ist Swift als Open-Source-Projekt verfügbar und wird kontinuierlich weiterentwickelt.

Swift wird hauptsächlich für Apple-Plattformen genutzt, kann aber auch für Server-Anwendungen oder sogar Android- und Windows-Apps eingesetzt werden.

 


Fetch API

Die Fetch API ist eine moderne JavaScript-Schnittstelle für das Abrufen von Ressourcen über das Netzwerk, z. B. für HTTP-Requests an eine API oder das Laden von Daten von einem Server. Sie ersetzt weitgehend die ältere XMLHttpRequest-Methode und bietet eine einfachere, flexiblere und leistungsfähigere Möglichkeit, Netzwerkabfragen zu verwalten.

Grundlegende Funktionsweise

  • Die Fetch API basiert auf Promises, was asynchrones Arbeiten erleichtert.
  • Sie ermöglicht den Abruf von Daten in verschiedenen Formaten wie JSON, Text oder Blob.
  • Fetch arbeitet standardmäßig mit der GET-Methode, kann aber auch für POST, PUT, DELETE und andere HTTP-Methoden verwendet werden.

Ein einfaches Beispiel

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(response => response.json()) // Antwort als JSON umwandeln
  .then(data => console.log(data)) // Daten ausgeben
  .catch(error => console.error('Fehler:', error)); // Fehlerbehandlung

Ein Request mit POST-Methode

fetch('https://jsonplaceholder.typicode.com/posts', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ title: 'Neuer Beitrag', body: 'Inhalt des Beitrags', userId: 1 })
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Fehler:', error));

Vorteile der Fetch API

✅ Einfachere Syntax als XMLHttpRequest
✅ Unterstützt async/await für bessere Lesbarkeit
✅ Flexibles Handling von Requests und Responses
✅ Bessere Fehlerbehandlung durch Promises

Die Fetch API ist mittlerweile in allen modernen Browsern verfügbar und eine essentielle Technik für die Webentwicklung.

 

 


Catalyst Web Framework

Das Catalyst Framework ist ein flexibles und leistungsstarkes Web-Framework für Perl. Es ermöglicht die Entwicklung skalierbarer und wartbarer Webanwendungen und orientiert sich an dem Model-View-Controller (MVC)-Designmuster.

Hauptmerkmale von Catalyst

MVC-Architektur – Saubere Trennung von Geschäftslogik, Darstellung und Datenverwaltung
Flexibilität – Unterstützt verschiedene Template-Systeme und ORM-Lösungen wie DBIx::Class
Erweiterbarkeit – Viele Plugins und Module verfügbar
Asynchronität – Lässt sich mit Event-Driven Architekturen kombinieren
REST-APIs & WebSockets – Unterstützung für moderne Web-Technologien

Anwendungsfälle