Schnittstellen
Es ist schwierig, den Zweck eines Tools zu verstehen, das ein Problem löst, das Sie noch nie hatten. Nachdem ich mit dem Programmieren begonnen hatte, verstand ich einige Zeit lang keine Schnittstellen. Wir werden verstehen, was sie getan haben, aber ich wusste nicht, warum Sie eine verwenden möchten.
Hier ist das Problem - Sie wissen, was Sie tun möchten, aber Sie haben mehrere Möglichkeiten, dies zu tun, oder Sie können später ändern, wie Sie es tun möchten. Es wäre schön, wenn Sie die Rolle des ahnungslosen Managers spielen könnten - bellen Sie einige Befehle an und erzielen Sie die gewünschten Ergebnisse, ohne sich darum zu kümmern, wie es gemacht wird.
Angenommen, Sie haben eine winzige kleine Website und speichern alle Informationen Ihrer Benutzer in einer CSV-Datei. Nicht die raffinierteste Lösung, aber sie funktioniert gut genug, um die Benutzerdaten Ihrer Mutter zu speichern. Später hebt Ihre Site ab und Sie haben 10.000 Benutzer. Vielleicht ist es Zeit, eine richtige Datenbank zu verwenden.
Wenn Sie anfangs klug gewesen wären, hätten Sie dies kommen sehen und nicht die Aufrufe getätigt, um direkt in csv zu speichern. Stattdessen würden Sie sich überlegen, wozu Sie es benötigen, unabhängig davon, wie es implementiert wurde. Sagen wir store()
und retrieve()
. Sie erstellen eine Persister
Schnittstelle mit abstrakten Methoden für store()
und retrieve()
und erstellen eine CsvPersister
Unterklasse, die diese Methoden tatsächlich implementiert.
Später können Sie eine erstellen DbPersister
, die das Speichern und Abrufen von Daten ganz anders implementiert, als es Ihre CSV-Klasse getan hat.
Das Tolle ist, alles, was Sie jetzt tun müssen, ist Veränderung
Persister* prst = new CsvPersister();
zu
Persister* prst = new DbPersister();
und dann bist du fertig. Ihre Anrufe an prst.store()
und prst.retrieve()
werden immer noch funktionieren, sie werden nur "hinter den Kulissen" anders gehandhabt.
Jetzt mussten Sie noch die CVS- und DB-Implementierungen erstellen, sodass Sie den Luxus, der Chef zu sein, noch nicht erlebt haben. Die wirklichen Vorteile werden deutlich, wenn Sie Schnittstellen verwenden, die von einer anderen Person erstellt wurden. Wenn jemand anderes so freundlich war, ein CsvPersister()
und DbPersister()
bereits zu erstellen , müssen Sie nur eines auswählen und die erforderlichen Methoden aufrufen. Wenn Sie sich entscheiden, den anderen später oder in einem anderen Projekt zu verwenden, wissen Sie bereits, wie es funktioniert.
Ich bin auf meinem C ++ sehr verrostet, daher verwende ich nur einige allgemeine Programmierbeispiele. Container sind ein gutes Beispiel dafür, wie Schnittstellen Ihr Leben erleichtern.
Sie können haben Array
, LinkedList
, BinaryTree
usw. alle Subklassen von Container
denen hat Methoden wie insert()
, find()
, delete()
.
Wenn Sie nun etwas in die Mitte einer verknüpften Liste einfügen, müssen Sie nicht einmal wissen, was eine verknüpfte Liste ist. Sie rufen einfach an myLinkedList->insert(4)
und es durchläuft die Liste auf magische Weise und steckt sie dort ab. Selbst wenn Sie wissen, wie eine verknüpfte Liste funktioniert (was Sie wirklich sollten), müssen Sie ihre spezifischen Funktionen nicht nachschlagen, da Sie wahrscheinlich bereits wissen, wozu sie eine andere Container
früher verwenden.
Abstrakte Klassen
Abstrakte Klassen sind ziemlich ähnlich wie Schnittstellen (auch technisch Schnittstellen sind abstrakte Klasse, aber hier ich meine Basisklassen , die einen Teil ihrer Methoden konkretisiert haben.
Angenommen, Sie erstellen ein Spiel und müssen feststellen, ob sich Gegner in Reichweite des Spielers befinden. Sie können eine Basisklasse Enemy
mit einer Methode erstellen inRange()
. Obwohl es bei den Feinden viele Unterschiede gibt, ist die Methode zur Überprüfung ihrer Reichweite konsistent. Daher wird Ihre Enemy
Klasse eine detaillierte Methode zur Überprüfung der Reichweite haben, aber rein virtuelle Methoden für andere Dinge, die keine Ähnlichkeiten zwischen den feindlichen Typen aufweisen.
Das Schöne daran ist, wenn Sie den Bereichserkennungscode durcheinander bringen oder ihn optimieren möchten, müssen Sie ihn nur an einer Stelle ändern.
Natürlich gibt es viele andere Gründe für Interfaces und abstrakte Basisklassen, aber dies sind einige Gründe, warum Sie sie möglicherweise verwenden.
Singletons
Ich benutze sie gelegentlich, und ich bin nie von ihnen verbrannt worden. Das heißt nicht, dass sie mein Leben nicht irgendwann ruinieren werden, basierend auf den Erfahrungen anderer Leute.
Hier ist eine gute Diskussion über den globalen Staat von erfahreneren und vorsichtigeren Leuten:
Warum ist der globale Staat so böse?