Was bedeutet _Duckmäusertippen_ in der Softwareentwicklung bedeuten?
Antworten
Zu viele Anzeigen?Duck Typing ist kein Type Hinting!
Um "duck typing" zu verwenden, zielen Sie nicht auf einen bestimmten Typ ab, sondern auf ein breiteres Spektrum von Subtypen (ich spreche nicht von Vererbung, wenn ich Subtypen meine, meine ich "Dinge", die in dieselben Profile passen), indem Sie eine gemeinsame Schnittstelle verwenden.
Sie können sich ein System vorstellen, das Informationen speichert. Um Informationen schreiben/lesen zu können, braucht man eine Art von Speicher und Informationen.
Speicherarten können sein: Datei, Datenbank, Sitzung usw.
Die Schnittstelle teilt Ihnen die verfügbaren Optionen (Methoden) unabhängig vom Speichertyp mit, was bedeutet, dass zu diesem Zeitpunkt noch nichts implementiert ist! Mit anderen Worten: Die Schnittstelle weiß nichts darüber, wie Informationen gespeichert werden können.
Jedes Speichersystem muss die Existenz der Schnittstelle kennen, indem es die gleichen Methoden implementiert.
interface StorageInterface
{
public function write(string $key, array $value): bool;
public function read(string $key): array;
}
class File implements StorageInterface
{
public function read(string $key): array {
//reading from a file
}
public function write(string $key, array $value): bool {
//writing in a file implementation
}
}
class Session implements StorageInterface
{
public function read(string $key): array {
//reading from a session
}
public function write(string $key, array $value): bool {
//writing in a session implementation
}
}
class Storage implements StorageInterface
{
private $_storage = null;
function __construct(StorageInterface $storage) {
$this->_storage = $storage;
}
public function read(string $key): array {
return $this->_storage->read($key);
}
public function write(string $key, array $value): bool {
return ($this->_storage->write($key, $value)) ? true : false;
}
}
Jedes Mal, wenn Sie Informationen schreiben oder lesen müssen, können Sie diese nun abrufen:
$file = new Storage(new File());
$file->write('filename', ['information'] );
echo $file->read('filename');
$session = new Storage(new Session());
$session->write('filename', ['information'] );
echo $session->read('filename');
In diesem Beispiel verwenden Sie am Ende Duck Typing im Storage-Konstruktor:
function __construct(StorageInterface $storage) ...
Hoffentlich hat es geholfen ;)
Der Begriff Duck Typing ist ein liegen .
Sie kennen die Redewendung "Wenn es läuft wie eine Ente und quakt wie eine Ente, dann ist es eine Ente", die hier immer wieder wiederholt wird.
Aber darum geht es beim Duck Typing (oder dem, was wir gemeinhin als Duck Typing bezeichnen) nicht. Alles, worum es beim Duck Typing geht, ist der Versuch, einen Befehl auf etwas zu erzwingen. Zu sehen, ob etwas quakt oder nicht, unabhängig davon, was es zu sein scheint. Aber es gibt keinen Rückschluss darauf, ob das Objekt dann eine Ente ist oder nicht.
Für wahr Ente tippen, siehe Typklassen . Das folgt der Redewendung "Wenn es läuft wie eine Ente und quakt wie eine Ente, dann ist es eine Ente.". Bei Typklassen kann ein Typ, der alle von einer Typklasse definierten Methoden implementiert, als Mitglied dieser Typklasse betrachtet werden (ohne die Typklasse erben zu müssen). Wenn es also eine Typklasse Duck gibt, in der bestimmte Methoden definiert sind (quaken und laufen wie eine Ente), kann alles, was diese Methoden implementiert, als Duck betrachtet werden (ohne dass es von Duck erben muss).
Bei der Duck-Typisierung wird die Eignung eines Objekts (z. B. zur Verwendung in einer Funktion) auf der Grundlage der Implementierung bestimmter Methoden und/oder Eigenschaften und nicht auf der Grundlage des Typs des Objekts bestimmt.
In Python wird zum Beispiel die len
Funktion kann mit jedem Objekt verwendet werden, das die __len__
Methode. Es ist egal, ob das Objekt von einem bestimmten Typ ist, z.B. string, list, dictionary oder MyAwesomeClass, solange diese Objekte eine __len__
Methode, len
wird mit ihnen zusammenarbeiten.
class MyAwesomeClass:
def __init__(self, str):
self.str = str
def __len__(self):
return len(self.str)
class MyNotSoAwesomeClass:
def __init__(self, str):
self.str = str
a = MyAwesomeClass("hey")
print(len(a)) # Prints 3
b = MyNotSoAwesomeClass("hey")
print(len(b)) # Raises a type error, object of type "MyNotSoAwesomeClass" has no len()
Mit anderen Worten, MyAwesomeClass
sieht aus wie eine Ente und quakt wie eine Ente und ist deshalb eine Ente, während MyNotSoAwesomeClass
sieht nicht aus wie eine Ente und schnattert nicht, ist also keine Ente!
Ich denke, es ist verwirrend, dynamische Typisierung, statische Typisierung und Enten-Typisierung zu vermischen. Duck-Typing ist ein unabhängiges Konzept, und selbst eine statisch typisierte Sprache wie Go kann ein Typprüfungssystem haben, das Duck-Typing implementiert. Wenn ein Typsystem die Methoden eines (deklarierten) Objekts prüft, aber nicht den Typ, könnte man es eine Duck-Typing-Sprache nennen.