developer-blog:$

oop

#OOP Class Benamung

Der Klassenname muss sich auf das Object beziehen und nicht der Funktionalität.

Die Klasse entspricht einem Object und sollte auch nach dem Object benannt werden, welches es repräsentiert. Das Object selber besitzt keine Funktionalität. Erst die Methoden geben ihm seine Funktionalitäten. Der Suffix -er ist ein Indiz dafür das eine Funktionalität und nicht das Object selber beschrieben wird. Häufig sieht man Klassennamen mit der Endung Manager, Controller, Helper, Handler, Writer, Reader, Converter und Validator. In der funktionalen Programmierung beschreibt der Name der Funktion die Funktionalität. Wenn wir jedoch OOP programmieren wollen, sollten wir die beiden Paradigmen nicht miteinander mischen.

Der Name der Klasse hat einen großen Einfluss darauf, ob wir es als Object oder eher ähnlich wie eine Funktion benutzen.

Falsch
        
  class BookReader { }
        
      
Richtig
        
  class Book { }
        
      

oop

#OOP Class Constructor Code Frei

Halte den Class Constructor Code frei.

Bevor deine Anwendung irgendwelche Logik ausführen kann, müssen zuerst alle Object initialisiert werden. Sind jedoch immer alle Object nötigt um die angefragte Funktionalität auszuführen? Wird z.B. immer eine Datenbank Verbindung benötigt? Wenn der Constructor Code frei bleibt, kann das Object schneller erstellt werden. Erst wenn wirklich eine Datenbank Verbindung benötigt wird, fängt die CPU an die Logik für die Datenbank Verbindung abzuarbeiten. Wir sprechen hier von dem Lazy Loading. Dadurch gibst du der CPU die Möglichkeit deinen Code für eine schnellere Ausführung zu optimieren.

Falsch
        
  class Email
  {
    private string $from;

    public function __construct(string $from)
    {
       $this->from = $from;

       if($this->from == 'system@localhost') {
         // Make some imported stuff
       }
    }
  }
        
      
Richtig
        
  class Email
  {
    private string $from;

    public function __construct(string $from)
    {
       $this->from = $from;
    }
  }
        
      

oop

#OOP Class Immutable

Die Properties eines Object sollten niemals im nachhinein verändert werden.

Die Properties eines Object sind seine Identität. Das Object ist somit immutable.

Falsch
        
  class Email
  {
    private string $from;

    public function __construct(string $from)
    {
       $this->from = $from;
    }

    public function send(string $fromName)
    {
       $this->from = $fromName . ' <' . $this->from . '>';

       // Send email to receiver
    }
  }
        
      
Richtig
        
  class Email
  {
    private string $from;

    public function __construct(string $from)
    {
       $this->from = $from;
    }

    public function send(string $fromName)
    {
       $emailFrom = $fromName . ' <' . $this->from . '>';

       // Send email to receiver
    }
  }
        
      

oop

#OOP Class Constructor Validation

Die im Constructor übergebenen Argumente sollten erst validiert werden, wenn sie benötigt werden.

Nehmen wir an du hast ein Object namens Email, dem du einen Empfänger im Constructor übergibst. Das Object hat die Method send, womit die die Email versendet wird. Ob die Email jemals versendet werden soll, entscheidet der Benutzer. Warum soll dann im Constructor bereits eine Validierung statt finden, welche bei einer invaliden Email Adresse eine Exception wirft, wenn der Benutzer gar nicht vorhat eine Email zu versenden? Der Benutzer ruft z.B. eine Liste mit seinen Artikeln auf und bekommt eine Fehlermeldung, das seine Email Adresse falsch ist. Er wird sich zu recht wundern, was die Artikelliste mit dem Email Versand zu tun haben soll.

Falsch
        
  class Email
  {
    private string $from;

    public function __construct(string $from)
    {
       if (!filter_var($from, FILTER_VALIDATE_EMAIL)) {
         throw new \InvalidArgumentException(
           'Email address ' . $from . ' is invalid.'
         );
       }

       $this->from = $from;
    }

    public function send()
    {
       // Send email to receiver
    }
  }
        
      
Richtig
        
  class Email
  {
    private string $from;

    public function __construct(string $from)
    {
       $this->from = $from;
    }

    public function send()
    {
       if (!filter_var($from, FILTER_VALIDATE_EMAIL)) {
         throw new \InvalidArgumentException(
           'Email address ' . $this->from . ' is invalid.'
         );
       }

       // Send email to receiver
    }
  }