Aus Ihrem Blog geht hervor, dass Sie sowohl mit der imperativen als auch mit der funktionalen Programmierung vertraut sind und mit den grundlegenden Konzepten der objektorientierten Programmierung vertraut sind, aber Sie hatten noch nie einen richtigen "Klick" macht es nützlich. Ich werde versuchen, in Bezug auf dieses Wissen zu erklären, und hoffe, dass es für Sie hilfreich ist.
Im Kern ist OOP eine Möglichkeit, das zwingende Paradigma zu verwenden, um hohe Komplexitätsgrade besser zu verwalten, indem "intelligente" Datenstrukturen erstellt werden, die die Problemdomäne modellieren. In einem (standardmäßigen prozeduralen, nicht objektorientierten) Programm haben Sie zwei grundlegende Dinge: Variablen und Code, der weiß, was er damit machen soll. Der Code nimmt Eingaben vom Benutzer und verschiedenen anderen Quellen entgegen, speichert sie in Variablen, verarbeitet sie und erzeugt Ausgabedaten, die an den Benutzer oder verschiedene andere Stellen gehen.
Objektorientierte Programmierung ist eine Möglichkeit, Ihr Programm zu vereinfachen, indem dieses Grundmuster verwendet und in kleinerem Maßstab wiederholt wird. So wie ein Programm eine große Sammlung von Daten mit Code ist, die wissen, was damit zu tun ist, ist jedes Objekt eine kleine Datenmenge, die an Code gebunden ist und weiß, was damit zu tun ist.
Indem Sie die Problemdomäne in kleinere Teile aufteilen und sicherstellen, dass so viele Daten wie möglich direkt an Code gebunden sind, der weiß, was damit zu tun ist, können Sie den gesamten Prozess und auch die untergeordneten Aspekte besser beurteilen. Fragen, die den Prozess ausmachen.
Durch Gruppieren von Daten in Objektklassen können Sie den Code für diese Daten zentralisieren, sodass relevanter Code leichter gefunden und behoben werden kann. Indem Sie die Daten hinter den Zugriffsspezifizierern einkapseln und nur über Methoden (oder Eigenschaften, sofern Ihre Sprache diese unterstützt) darauf zugreifen, verringern Sie das Risiko von Datenbeschädigungen oder Verstößen gegen Invarianten erheblich.
Durch die Verwendung von Vererbung und Polymorphismus können Sie bereits vorhandene Klassen wiederverwenden und an Ihre spezifischen Anforderungen anpassen, ohne die Originale ändern oder alles von Grund auf neu schreiben zu müssen. (Was Sie niemals tun sollten , wenn Sie es vermeiden können.) Achten Sie nur darauf, dass Sie Ihr Basisobjekt verstehen, sonst könnten Sie Killerkängurus bekommen .
Für mich sind dies die Grundprinzipien der objektorientierten Programmierung: Komplexitätsmanagement, Codezentralisierung und verbesserte Problemdomänenmodellierung durch die Erstellung von Objektklassen, Vererbung und Polymorphismus sowie erhöhte Sicherheit ohne Einbußen bei Leistung oder Kontrolle durch die Verwendung von Kapselung und Eigenschaften. Ich hoffe, das hilft Ihnen zu verstehen, warum so viele Programmierer es nützlich finden.
EDIT: Als Antwort auf Joel Frage in den Kommentaren,
Können Sie erklären, was ein "objektorientiertes Programm" enthält (abgesehen von diesen von Ihnen skizzierten ausgefallenen Definitionen), das sich grundlegend von einem imperativen Programm unterscheidet? Wie bringt man den Ball ins Rollen?
Ein kleiner Haftungsausschluss hier. Mein Modell eines "objektorientierten Programms" ist im Grunde das Delphi-Modell, das dem C # /. NET-Modell sehr ähnlich ist, da es von ehemaligen Delphi-Teammitgliedern erstellt wurde. Was ich hier sage, trifft möglicherweise nicht oder nicht so häufig auf andere OO-Sprachen zu.
Ein objektorientiertes Programm ist eines, bei dem die gesamte Logik um Objekte herum strukturiert ist. Natürlich muss dies irgendwo gebootet werden. Ein typisches Delphi-Programm enthält Initialisierungscode, mit dem ein Singleton-Objekt namens erstellt wird Application
. Zu Beginn des Programms wird für jedes Formular, das Sie von Anfang an in den Speicher laden möchten Application.Initialize
, ein Aufruf Application.CreateForm
von ausgeführt. Anschließend Application.Run,
wird das Hauptformular auf dem Bildschirm angezeigt und die Eingabe- / Ereignisschleife gestartet, die den Kern eines jeden Formulars bildet Interaktive Computerprogramme.
Die Anwendung und Ihre Formulare suchen nach eingehenden Ereignissen vom Betriebssystem und übersetzen sie in Methodenaufrufe für Ihr Objekt. Eine Sache, die sehr häufig vorkommt, ist die Verwendung von Ereignishandlern oder "Delegaten" in .NET-Sprache. Ein Objekt hat eine Methode, die besagt, "mache X und Y, prüfe aber auch, ob dieser spezielle Event-Handler zugewiesen ist, und rufe ihn auf, wenn dies der Fall ist." Ein Ereignishandler ist ein Methodenzeiger - ein sehr einfacher Abschluss, der einen Verweis auf die Methode und einen Verweis auf die Objektinstanz enthält -, mit dem das Verhalten von Objekten erweitert wird. Wenn ich zum Beispiel ein Schaltflächenobjekt in meinem Formular habe, passe ich sein Verhalten an, indem ich einen OnClick-Ereignishandler anhänge, der bewirkt, dass ein anderes Objekt eine Methode ausführt, wenn auf die Schaltfläche geklickt wird.
In einem objektorientierten Programm werden die meisten Aufgaben erledigt, indem Objekte mit bestimmten Verantwortlichkeiten definiert und miteinander verknüpft werden, entweder durch Methodenzeiger oder durch ein Objekt, das direkt eine in der öffentlichen Schnittstelle eines anderen Objekts definierte Methode aufruft. (Und jetzt kehren wir zur Kapselung zurück.) Dies ist eine Idee, von der ich kein Konzept hatte, bevor ich OOP-Kurse am College belegte.