Seit Jahren beschäftige ich mich mit algorithmischen Dingen, schreibe skalierbare Datenstrukturen für die Internetsuche, zum Beispiel Randomisierte binäre Suchbäume für die automatische Empfehlung, BitMaps, Wisdom of Crowd-basierte Algorithmen unter Verwendung von Grafiken, schreibe einige interessante Algorithmen für maschinelles Lernen wie Clustering, Anomalieerkennung, Arbeiten an Information Retrieval Sachen und so weiter
Es gibt eine gemeinsame Sache in den Dingen, die ich oben erwähnt habe. Alle oben genannten Dinge, wenn sie in einer Sprache wie C ++ codiert sind, erfordern eine Handvoll Klassen. Ich meine, es sind interessante Probleme, aber sie sind nicht komplex in Bezug auf stark geladene objektorientierte Dinge. Ich habe noch nie Vererbung, virtuelle Dinge usw. verwendet. Obwohl ich häufig generische Programmierung, Vorlagen usw. verwendet habe.
Ich liebe C ++ (- Sperriges OO-Zeug, wie mir gefällt, was Joe Armstrong, der Erfinder von Erlang, sagt: Wenn man in OO World nach einer Banane fragt, bekommt man einen großen Dschungel zusammen mit einem Gorilla, der die Banane hält). Ich programmiere gerne in anderen Sprachen wie Java und Python.
Meine Frage ist nun, da ich die Art von Projekten / Algorithmen genieße, an denen ich arbeite, muss ich wirklich OO-Sachen lernen. Werde ich ein besserer Programmierer / Designer sein, wenn ich nur Sachen wie Vererbung, dynamischer Polymorphismus (Virtuals) verwende? ODER kann ich in die Welt der funktionalen Programmierung wechseln (ich habe es bis jetzt noch nicht getan), was mich mehr anzieht, da ich mich nur auf Aufgaben / Algorithmen konzentrieren kann und nicht zulasse, dass auf Kingdom Of Noun basierendes OO-Zeug eine Regel ist mir?
Kurz gesagt, kann / kann mir OO-Zeug überhaupt bei der Art von Projekten / Algorithmen helfen, die ich oben erwähnt habe?
BEARBEITEN:
Ein äußerst interessanter Link, den Sie hier hinzufügen können:
http://steve-yegge.blogspot.in/2006/03/execution-in-kingdom-of-nouns.html
Antworten:
Objektorientierte Programmierung ist wirklich gut darin, Ihre komplexen mathematischen Dinge hinter leicht verständlichen Wörtern zu verstecken und es den Untergebenen unter Ihnen zu erleichtern, die von Ihnen geschriebenen Dinge tatsächlich zu verwenden. Es ersetzt nicht die funktionale Programmierung ... es gibt Ihnen nur eine wirklich einfache Möglichkeit, Implementierungen auszutauschen oder Verhalten hinzuzufügen.
Was wäre, wenn Sie in Ihrem obigen Beispiel für randomisierte binäre Suchbäume die Anforderung erhalten hätten, dass der Randomizer am Aprilscherz durch eine Reihenfolge nach Entfernung von drei Handlanger ersetzt wurde? Es ist sehr praktisch,
StoogeBinaryTree : RandomBinaryTree
dieprotected int GetSortOrder (Tree a, Tree b)
Methode zu erstellen und zu überschreiben. Am 2. April können Sie die Implementierung wieder auf die umstellen,RandomBinaryTree
ohne diesen Code ändern zu müssen.In einem einfachen Beispiel habe ich gezeigt, wie man sowohl winzige Verhaltensmerkmale hinzufügt als auch die Implementierung wechselt ...
quelle
Wenn Sie FP immer noch mit Sprachen wie Haskell und Erlang machen wollen, die es gut können, müssen Sie die OOP-Kühlhilfe nicht trinken. FP ist sehr leistungsfähig und kann sogar in der realen Welt viel bewirken
Davon abgesehen wäre das Erlernen einer OOP-Sprache keine schlechte Sache. Das Verständnis mehrerer Programmiermethoden und verschiedener Methoden wird zu Ihren Gunsten funktionieren. Wenn Sie von Haskell oder Erlang nach Java wechseln, können Sie sich fragen, wie in aller Welt jeder ohne REPL und Lambdas arbeiten kann.
quelle
Es scheint, als hätten Sie sich immer nur auf die Lösung eines einzelnen Problems konzentriert, dh auf das Schreiben von Algorithmen. Überlegen Sie jedoch, wie Sie beispielsweise eine GUI-Anwendung oder eine andere große Anwendung schreiben würden, für die Sie möglicherweise einen Großteil Ihres Algorithmus verwenden müssen. In diesem Fall ist es wichtig, OO zu kennen, da es Ihnen hilft, Ihren Code zu vereinfachen, damit er für andere Entwickler besser lesbar und einfacher zu verwenden ist, z. B. indem Sie eine Bibliothek erstellen, die als Objekt geladen werden kann.
Eines der wichtigsten Entwurfsmuster in der objektorientierten Programmierung ist das Strategiemuster , das Ihnen im obigen Szenario ebenfalls sehr helfen wird. Stellen Sie sich ein Beispiel vor, in dem der Benutzer Ihnen Eingaben vorlegt, anhand derer der Benutzer einen Algorithmus ausführen kann. Dies kann leicht unordentlich sein, wenn / sonst oder Schalter / Gehäuse Konstruktion. Durch die Erstellung einer gemeinsamen Schnittstelle für Ihren Algorithmus und die Verwendung des Strategiemusters wäre Ihr Code viel flexibler, lesbarer, einfacher zu erweitern und somit einfacher zu warten.
quelle
Der objektorientierte Ansatz wurde aufgrund eines entscheidenden Aspekts erfolgreich: Er ermöglicht es Ihnen, Systeme mit erheblicher wesentlicher Komplexität anzugehen, ohne zu viel zufällige Komplexität einzuführen . Dies kann fast ignoriert werden, wenn Sie an selbst entwickelten Systemen arbeiten, wird jedoch sehr wichtig, wenn Sie große Systeme erstellen.
Die Schlüsselelemente des objektorientierten Ansatzes können einem Programmierer mit umfassender Erfahrung in der prozeduralen Programmierung innerhalb weniger Tage erklärt werden, wodurch die Technik schnell an Popularität gewann (dies bedeutet nicht, dass Sie ein Experte in einem werden können Ein paar Tage: Es ist ähnlich wie beim Schachlernen - Sie können lernen, wie Sie Ihre Figuren in weniger als zehn Minuten bewegen, aber es dauert Jahre, um das Spiel zu meistern.
Funktionale Programmiertechniken gewinnen mit der Einführung der Sprachunterstützung in Mainstream-Sprachen (Lambdas und anonyme Delegierte von C #, Lambdas von C ++ und bis zu einem gewissen Grad sogar anonyme Java-Klassen) zunehmend an Bedeutung. Es ist sehr hilfreich, diese Techniken zu verstehen, aber sie wurden entwickelt, um lokalere Probleme auf taktischer Ebene anzugehen . Objektorientierte Techniken hingegen bleiben auf strategischer Ebene relevant , insbesondere im Kontext größerer Teams.
quelle
Wenn Sie eine funktionale Programmierung durchführen, wird dies eine sehr gute Erfahrung für Sie sein, auch wenn Sie sich entscheiden, nicht fortzufahren. Wie Sie aus einigen Antworten hier lesen können, wissen viele Menschen nicht einmal, was es ist.
Konzepte für funktionale Sprachen, z. B. verzögerte Bewertung und referenzielle Transparenz, sind sehr, sehr gut zu lernen. Besonders wenn Sie Rekursion mögen.
zum Beispiel:
ist eine sehr einfache Haskell-Funktion, die eine Liste durchläuft und die Länge berechnet. Wenn Sie an Zahlen interessiert sind, die größer als lang sind, und unendliche Listen und andere ausgefallene Dinge verwenden möchten, probieren Sie die funktionale Programmierung aus.
quelle
length
. Eine andere (effizientere und näher an der Art und Weise, wie nichttriviale FP-Programme tatsächlich geschrieben werden) Methode könnte darin bestehen, eine Falte mit Startwert0
und Schrittfunktion aufzurufenacc -> acc + 1
. Alternativsum . map (const 1)
liest sich gut.length
auf den nicht strengenfold
s gebautes tun dies).persistent
), Fehlerbehandlung (überMaybe
/Either
), Zustands-Jonglieren (überState
), Baumdurchquerungen (überMap
/Set
) usw. schreiben , aber meine Absicht in Bezug auf übergeordnete Funktionen zu beschreiben, ist in jeder Hinsicht besser und damit auch, was FP in der Praxis macht.Wie andere gesagt haben, ist Objektorientierung das vorherrschende Paradigma in der Industrie. Sie haben gesagt, dass Sie hauptsächlich mit Programmen gearbeitet haben, die von einer Handvoll Klassen angesprochen werden können, aber in einer industriellen Anwendung müssen Hunderte oder Tausende von Anwendungsfällen behandelt werden, und die Objektorientierung hat sich als sehr zuverlässig erwiesen und allgemein verständliche Möglichkeit, solche großen Codebasen zu strukturieren.
Sie sprechen von funktionaler Programmierung, die ein solider Anwärter auf The Next Big Paradigm ist, aber FP ist in der Industrie noch nicht vertraut. Insbesondere als C ++ - Programmierer sollten Sie wissen, dass die Industrie konservativ sein kann und die C / C ++ - Welt mit ihrem Schwerpunkt auf Leistung ein Ort ist, an dem die zwingende Natur der Hardware als eine sehr reale Überlegung angesehen wird. Im Allgemeinen stehen Programmierer eingebetteter Systeme meiner Erfahrung nach FP äußerst skeptisch gegenüber.
Auch wenn FP hat eine vorherrschende Paradigma in der Industrie worden, es ist sicherlich der Fall , dass es in Form von Objekt-funktionalen Hybridsprachen wie F # und Scala und nicht in Form von „reinen“ FP - Sprachen wie Haskell gelingen wird.
All dies bedeutet, dass objektorientiertes "Zeug" für professionelle Codebasen und Ihre Karriere wichtig ist.
quelle
OO gewann an Zugkraft, weil es eine große Verbesserung für den Umgang mit Komplexität darstellte, wie es zuvor auch die strukturierte / prozedurale Programmierung war.
Die Vorteile der Verwendung von OO nehmen mit zunehmender Größe des Projekts zu. Für ein 1KLOC-Programm spielt es keine Rolle, welches Paradigma Sie verwenden, alle funktionieren einwandfrei. Aber für ein 200KLOC + -Programm gibt es für OO einfach keine tragfähige Konkurrenz. Das bedeutet nicht, dass Sie kein 200KLOC-Programm in C schreiben können, sondern dass Sie viel disziplinierter sein müssen, um nicht in ein Chaos zu geraten, das niemand (nicht einmal Sie) verstehen kann. Das bedeutet nicht, dass OO ein solches Durcheinander verhindert, sondern dass es Ihr Leben leichter macht, um es zu verhindern.
Die funktionale Programmierung ist ein Paradigma, das etwas vom vorherigen Muster abweicht, da es nicht dazu beigetragen hat, noch komplexer als OO umzugehen, sondern eine andere Art von Problemen anzugehen: die parallele Programmierung. Dies war auch das erste Mal, dass ein Programmierparadigma dies versuchte: Alle Mechanismen, die zuvor in OO und / oder SP / PP existierten, waren nicht Teil des Paradigmas, sondern nur Betriebssystementitäten (Threads, Mutexe usw.). gekapselt nach den Paradigmenregeln.
In dieser Hinsicht ist FP viel natürlicher als die anderen, aber das geht zu Lasten der Umkehrung der Art und Weise, wie wir normalerweise über die Probleme denken. Aus diesem Grund verfügt es nur über eine begrenzte Kapazität, um dieselbe Komplexität in derselben Größenordnung wie OO zu bewältigen.
Ich vermute, dass dies die Einführung von FP in naher Zukunft auf sehr spezialisierte Systeme beschränken wird, im Allgemeinen nicht viel große oder spezialisierte Abschnitte größerer Systeme. Und der Rest wird weiterhin mit OO gemacht. Welche von denen Sie entwickeln möchten (oder etwas über die Entwicklung lernen), bestimmt, worauf Sie sich konzentrieren sollten, IMO.
quelle
Vorlagen sind wohl einfach eine andere Form von OOP. Virtuelle Funktionen und explizite Vererbung haben einen bestimmten Anwendungsfall - Laufzeit, binäre Austauschbarkeit. Vorlagen sind in der Kompilierungszeit austauschbar. Auf der einfachsten Ebene bieten sie jedoch die gleiche Feature-Abstraktion für jeden Typ, der die richtige Schnittstelle bietet. Die Überbeanspruchung der Laufzeitvererbung ist ein erheblicher Codegeruch, und in diesem Fall stimme ich Ihnen zu - sie wird für die meiste Zeit einfach nicht benötigt.
Diese beiden Snippets sind praktisch identisch, obwohl eines ausschließlich Vorlagen verwendet und das andere zur Vererbung Laufzeitvererbung und -klassen verwendet. Beide abstrahieren über die Funktion, die Sie aufrufen. Dies ist trivialerweise offensichtlich , wenn man Ersatz
T
fürstd::function<void(int)>
, zum Beispiel. Der einzige Unterschied ist der Zeitpunkt, zu dem diese Abstraktion erfolgt. Die Vorlagenversion zeichnet sich durch Funktionen aus undstd::function
ist im Allgemeinen als Mitgliedsvariable besser geeignet. Sie möchten nicht jedes Mal eine neue Klasse erstellen müssen, wenn Sie einen neuen Rückruf wünschen.OOP ist für Algorithmen nicht besonders gut geeignet. Es ist eher für groß angelegte Konstrukte gedacht, bei denen die Programmteile aufgeschlüsselt werden. Wenn Sie einen bestimmten Algorithmus schreiben, der mit bestimmten Daten arbeitet, ist es unwahrscheinlich, dass Sie Klassen benötigen.
Es ist einfach und großartig, Algorithmen für Funktionen zu erstellen. Sobald Sie jedoch darüber hinausgehen, werden Klassen zur dominierenden Methode.
quelle
Ja, aus diesem Grund ist es wichtig: Wenn Sie OOP verstehen, werden Sie zu einem besseren Programmierer. Als Faustregel gilt: Verständnis macht Sie immer zu einem besseren Programmierer.
Es sollte beachtet werden, dass weder is-a noch Klassen, geschweige denn Vererbung, etwas mit OOP zu tun haben. Bei OOP geht es wirklich um die Entkopplung durch Indirektion, wie sie durch das Prinzip der Abhängigkeitsinversion formuliert wird . Man kann argumentieren, dass dies auch ein wichtiger Aspekt von FP ist. Wenn Sie sowohl OOP als auch FP studieren, werden Sie sich zunehmend bewusst, dass sie tatsächlich zwei Seiten eines Kontinuums sind. Je breiter und tiefer Ihr Verständnis davon ist, desto besser werden Sie.
Um ein Verständnis von OOP zu bekommen, versuchen Sie es mit Io und vielleicht Smalltalk und Ruby.
quelle
In der Entwicklungswelt sind Sprachen Werkzeuge, Programmierparadigmen Werkzeuge und Bibliotheken Werkzeuge. Je mehr Werkzeuge Sie haben, desto besser können Sie das richtige Werkzeug für den Job auswählen. Das würde also bedeuten, dass Sie OO, AOP und funktionale Programmierung lernen - wenn es die Zeit erlaubt.
Die Entwicklungswelt wird immer größer (in Bezug auf Sprachen, Frameworks usw.), sodass Sie nicht erwarten können, alles zu lernen. Ziel all dieser Innovationen ist es jedoch, Entwicklern zu mehr Produktivität zu verhelfen (Entwicklungsgeschwindigkeit und Wiederverwendbarkeit) und Code wartbarer zu machen (leichtes Verständnis, einfache Erweiterung und Änderung).
Das Beste, was Sie tun können, ist gezieltes, kontinuierliches Lernen in der Hoffnung, dass etwas Neues, das Sie gerade gelernt haben, Ihnen dabei geholfen hat, etwas besser und schneller auf eine Weise zu erledigen, die Sie nie erwartet hatten.
quelle
Ich habe das Steve Jobs-Buch gelesen und dort ist eine Geschichte darüber, wie Steve SmallTalk in den Xerox PARC-Labors gesehen hat. Das war eine der frühesten OO-Sprachen. Ohne OO wäre es schrecklich gewesen, so etwas wie eine grafische Benutzeroberfläche (GUI) zu entwickeln. Mit all den asynchronen Eingaben und der Möglichkeit, von Aufgabe zu Aufgabe zu springen, während Sie mit dem einen oder anderen "Objekt" arbeiten.
Während Sie mit einer funktionalen Sprache viel anfangen können und sie definitiv ihre Anwendungsfälle hat. Wenn Sie sich mit komplexeren Systemen befassen, die stärker mit Problemen der realen Welt interagieren, ist OO ein überlegenes Design.
quelle