Algorithmen beschreiben, was der Computer tun soll. Die Struktur beschreibt, wie der Algorithmus [im Quellcode] aufgebaut ist. OOP ist ein Programmierstil, der bestimmte "objektorientierte" Strukturen nutzt.
Algorithmusbücher meiden häufig OOP, weil sie sich auf Algorithmen und nicht auf Strukturen konzentrieren. Codefragmente, die stark von der Struktur abhängen, sind in der Regel schlechte Beispiele für ein Algorithmusbuch. Ebenso meiden OOP-Bücher häufig Algorithmen, weil sie die Geschichte durcheinander bringen. Das Verkaufsargument von OOP ist seine Fluidität, und wenn es an einen Algorithmus gebunden wird, erscheint es starrer. Es geht mehr um den Fokus des Buches als um alles andere.
Im realen Code verwenden Sie beide nebeneinander. Sie können Computerprobleme per Definition nicht ohne Algorithmen lösen, und es fällt Ihnen schwer, gute Algorithmen ohne Struktur (OOP oder auf andere Weise) zu schreiben.
Nehmen Sie als Beispiel für die Unschärfe die dynamische Programmierung. In einem Algorithmusbuch würden Sie beschreiben, wie Sie einen homogenen Datensatz in ein Array aufnehmen und mithilfe der dynamischen Programmierung zu einer Lösung gelangen. In einem OOP-Buch stoßen Sie möglicherweise auf eine Struktur wie Visitor, mit der Sie beliebige Algorithmen für eine Reihe heterogener Objekte ausführen können. Das DP-Buchbeispiel könnte als ein sehr einfacher Besucher betrachtet werden, der Objekte in einer allgemein von unten nach oben gerichteten Reihenfolge bearbeitet. Das Besuchermuster könnte als das Grundgerüst eines DP-Problems angesehen werden, aber es fehlen Fleisch und Kartoffeln. In der Realität werden Sie häufig beides zusammen benötigen: Sie verwenden das Besuchermuster, um mit der Heterogenität in Ihrem Datensatz umzugehen (DP ist schlecht), und Sie verwenden DP innerhalb der Struktur des Besuchers, um Ihren Algorithmus zu organisieren, um die Laufzeit zu minimieren (Besucher) tut es nicht
Wir sehen auch Algorithmen, die über Entwurfsmustern arbeiten. Es ist schwieriger, Beispiele auf kleinem Raum zu formulieren, aber sobald Sie eine Struktur haben, möchten Sie diese Struktur manipulieren und verwenden dafür Algorithmen.
Gibt es einige Probleme, die nur von OOP dargestellt und gelöst werden können?
Diese Frage ist schwieriger zu beantworten als Sie denken. Bei der ersten Bestellung gibt es keinen rechnerischen Grund, warum Sie OOP benötigen, um ein Problem zu lösen. Der einfache Beweis ist, dass jedes OOP-Programm bis zur Assemblierung kompiliert wird, was eindeutig keine OOP-Sprache ist.
Im größeren Schema der Dinge beginnt die Antwort jedoch, Ja zu sagen. Sie sind selten einfach durch Berechnungsmethoden eingeschränkt. Meistens spielen Dinge wie Geschäftsanforderungen und Entwicklerfähigkeiten eine Rolle. Viele Anwendungen könnten heute nicht ohne OOP geschrieben werden, nicht weil OOP irgendwie grundlegend für die Aufgabe ist, sondern weil die von OOP bereitgestellte Struktur wesentlich war, um das Projekt auf Kurs und im Budget zu halten.
Dies bedeutet nicht, dass wir OOP in Zukunft niemals für eine lustige neue Struktur aufgeben werden. Es heißt lediglich, dass es eines der effektivsten Werkzeuge in unserer Toolbox für einen überraschend großen Teil der heutigen Programmieraufgaben ist. Zukünftige Probleme können dazu führen, dass wir uns der Entwicklung mit unterschiedlichen Strukturen nähern. Zum einen erwarte ich, dass neuronale Netze einen ganz anderen Entwicklungsansatz erfordern, der sich als "objektorientiert" herausstellen kann oder nicht.
Ich sehe nicht, dass OOP in naher Zukunft aufgrund der Denkweise von Algorithmus-Designern verschwindet. Bisher ist das übliche Muster, dass jemand einen Algorithmus entwirft, der OOP nicht nutzt. Die OOP-Community erkennt, dass der Algorithmus nicht wirklich zur OOP-Struktur passt und dies auch nicht muss. Daher packen sie den gesamten Algorithmus in eine OOP-Struktur und beginnen mit der Verwendung. Überlegen Sie boost::shared_ptr
. Die darin enthaltenen Referenzzählalgorithmen shared_ptr
sind nicht sehr OOP-freundlich. Das Muster wurde jedoch erst populär shared_ptr
, als ein OOP-Wrapper erstellt wurde, der die Funktionen der Algorithmen in einem strukturierten OOP-Format enthüllte. Jetzt ist es so beliebt, dass es in die neueste Spezifikation für C ++, C ++ 11 aufgenommen wurde.
Warum ist das so erfolgreich? Algorithmen eignen sich hervorragend zum Lösen von Problemen, erfordern jedoch häufig erhebliche anfängliche Forschungsinvestitionen, um zu verstehen, wie sie verwendet werden. Die objektorientierte Entwicklung ist sehr effektiv, um solche Algorithmen zu verpacken und eine Schnittstelle bereitzustellen, deren Erlernen weniger Anfangsinvestitionen erfordert.