Objektorientierte Programmierung: Schnittstellen verstehen
An dieser Stelle würde ich sagen, dass die Grundlagen für das Verständnis der objektorientierten Programmierung gelegt wurden.
Konkret habe ich behandelt:
Und ja, es gibt einige Diskussionen darüber, was die Grundlagen ausmacht (das heißt, einige werfen Polymorphismus nicht in die Mischung, obwohl ich es tue). Aber die oben genannten vier sollten eine solide Grundlage bieten, auf der Sie Ihre objektorientierten Programmierfähigkeiten weiter ausbauen können.
Es gibt noch mehr, aber ich glaube nicht, dass sie so tiefgreifend, detailliert oder schwer zu verstehen sind wie einige der oben genannten Konzepte. Anderen fällt wiederum manches leichter.
Auf jeden Fall sind die nächsten beiden Themen, die wichtig zu verstehen sind:
- Schnittstellen
- Abstraktion
Ich werde auf jedes einzelne eingehen, aber vergewissern Sie sich, dass Sie zuerst die Grundlagenserie gelesen haben, denn die beiden oben genannten Themen werden es Ihnen ermöglichen, sich darauf zu verlassen und Vorteile daraus zu ziehen.
Vage, ich weiß, aber lassen Sie es mich erklären und dann weitermachen.
Schnittstellen verstehen
Die bei weitem häufigste Definition einer Schnittstelle, die Sie wahrscheinlich hören werden, ist, dass es sich um einen Vertrag handelt. Das ist nicht falsch, aber ich denke, es lässt zu wünschen übrig.
Wenn Sie zum Beispiel an Verträge denken, denken Sie wahrscheinlich an etwas, das sehr kompliziert ist, viel Fachjargon, ein komplizierter Prozess, etwas zu unterzeichnen, zu datieren, arbeitsfertig zu machen und so weiter.
Aber wenn es um Programmierschnittstellen geht, ist dies wirklich nicht der Fall. Tatsächlich würde ich argumentieren, dass das Definieren von Schnittstellen das Programmieren erleichtern kann und eine Menge Bürokratie verringert, weil es die Dinge sehr schwarz oder weiß darüber macht, was etwas implementieren sollte.
Ein Wort zu „Schnittstellen“
Unsere Branche verwendet das Wort „Schnittstelle“ für zwei Dinge:
- Designer und Benutzer verwenden den Begriff Schnittstelle, um zu beschreiben, was sie sehen und wie sie mit der Anwendung interagieren. Dazu gehören Dinge wie Schaltflächen, Dropdowns und andere Elemente, die wir „anfassen“ können.
- Programmierer verwenden den Begriff, um sich darauf zu beziehen, welche Funktionen eine Unterklasse implementieren muss, um sich an eine Schnittstelle zu halten. Dies wird als „Programmieren an einer Schnittstelle“ bezeichnet.
Letzteres wird in diesem Artikel besprochen. Und nein, wir werden keine typischen Beispiele wie die Programmierung einer Animal – Schnittstelle oder was auch immer verwenden. Stattdessen betrachten wir dies anhand tatsächlicher Codebeispiele.
Programmieren einer Schnittstelle
Wir definieren „Programmieren für eine Schnittstelle“ als eine Möglichkeit für uns, Code zu schreiben, der die Signaturen von Funktionen implementiert, die in dieser Schnittstelle definiert sind.
Aber was sind Methodensignaturen? Einfach ausgedrückt umfassen Methodensignaturen:
- der Name des Namens der Funktion,
- die Argumente, die es braucht,
- der Sichtbarkeitsmodifikator
Im Kontext einer Klasse sehen Sie es so:
<?php
class Cache
{
public function set($key, $value)
{
// method implementation
}
}
Einfach richtig?
Im obigen Code können wir sehen, dass die Set- Funktion einen Schlüssel und einen Wert akzeptiert, die verwendet werden, und auf die Funktion kann von jedem Objekt zugegriffen werden, das einen Verweis auf die Klasse hat.
Schnittstellen können dies aber auch beinhalten. Es gibt jedoch einen Vorbehalt: Schnittstellen haben keine Methodenimplementierung.
Also eher als so etwas :
<?php
class Cache
{
public function set($key, $value) {
set_transient($key, $value);
}
}
Sie werden Folgendes sehen:
<?php
interface iCache
{
public function set($key, $value);
public function get($key);
public function has($key);
}
Aber es gibt auch ein paar Feinheiten, die im obigen Code zu beachten sind.
- Dieser Code definiert es nicht als Klasse. Stattdessen nennt es es eine Schnittstelle.
- Dem Klassennamen wird ein „i“ vorangestellt, um anzuzeigen, dass es sich um eine Schnittstelle handelt. Dies ist nicht erforderlich; es ist eine Konvention.
- Die Methode hat keine Implementierung. Es hat nichts als eine Unterschrift.
Wenn wir eine Schnittstelle erstellen, sagen wir, wie oben erwähnt, dass jede Klasse, die die Schnittstelle implementiert, die darin enthaltenen Methoden definieren wird.
Wenn wir also alles zusammenführen, was wir oben gesehen haben, würde die endgültige Implementierung so aussehen ( obwohl wir dies idealerweise in separaten Dateien aufbewahren würden):
<?php
interface iCache {
public function set($key, $value);
public function get($key);
public function has($key);
}
public class SimpleCache implemnents iCache
{
public function set($key, $value)
{
set_transient($key, $value, DAY_IN_SECONDS);
}
public function get($key)
{
if (!$this->has($key))
{
return false;
}
return get_transient($key);
}
public function has($key)
{
return false !== get_transient($key);
}
}
Und so passen Schnittstellen und Klassen zusammen.
Das ist es?
In einfachen Worten, ja. Aber nach meiner Erfahrung habe ich festgestellt, dass es um mehr geht, als nur die Methoden zu definieren und sie zu implementieren.
Oft ist es einfach, Klassen zu definieren, dann die Schnittstelle zu definieren und dann die Schnittstelle zu implementieren. Aber das ist völlig rückständig. Stattdessen müssen wir strategischer über unsere Arbeit nachdenken.
Anstatt sich auf eine Schnittstelle zu verlassen, die den Zweck völlig zunichte macht, müssen wir breit anfangen, damit sich unsere Klassen auf das spezialisieren können, was sie tun, während sie gleichzeitig Funktionen implementieren, die nicht nur dieser Klasse gemeinsam sind, sondern auch anderen Klassen, die möglicherweise dieselbe Funktionalität benötigen.
Im obigen Beispiel haben wir möglicherweise einen SimpleCache, einen TransientCache oder eine andere Art von Cache. Unabhängig davon, welche Art von Cache wir implementieren, implementieren sie die Schnittstelle, und die Funktionalität wird der Klasse überlassen, die die Schnittstelle implementiert.
Wir definieren also, wie ein Cache auf hoher Ebene aussehen könnte, aber die implementierenden Klassen definieren genau, wie sie funktionieren.
Wenn Sie ein WordPress-Entwickler sind und lernen möchten, wie man mithilfe praktischer, objektorientierter Techniken Dinge auf der Anwendung aufbaut, warum treten Sie dann nicht der Website bei?