Frage

Vor kurzem hatte ich eine Diskussion mit einem Kollegen, der kein Fan von ist OOP . Was meine Aufmerksamkeit nahm war, was er sagte:

"Was ist der Sinn des Tuns meine in Objekten Codierung? Wenn es Wiederverwendung dann kann ich nur eine Bibliothek und ein Anruf erstellen, was Funktionen, die ich brauche für was auch immer Aufgabe ist. Muss ich diese Konzepte von Polymorphismus, Vererbung, Schnittstellen, Muster oder was auch immer? "

Wir sind in einem kleinen Unternehmen kleine Projekte für E-Commerce-Sites und Immobilien zu entwickeln.

Wie kann ich die Vorteile der OOP in einem "alltäglichen, real-world" Setup? Oder war OOP wirklich gemeint, komplexe Probleme zu lösen und nicht für die „alltägliche“ Entwicklung?

War es hilfreich?

Lösung

Die guten Dinge über OOP kommen aus einer Reihe von Daten an eine Reihe von Verhaltensweisen zu binden.

Wenn Sie also viele ähnlichen Operationen auf einem ähnlichen Satz von Daten zu tun, dann können Sie viele Funktionen schreiben, die auf einer Struktur arbeiten, oder Sie können ein Objekt verwenden.

Objekte geben Ihnen einig Code-Wiederverwendung Hilfe in Form der Vererbung.

IME, es ist einfacher, die Arbeit mit einem Objekt mit einem bekannten Satz von Attributen und Methoden, dass es eine Reihe von komplexen Strukturen zu halten ist und die Funktionen, die auf sie arbeiten.

werden einige Leute über Vererbung und Polymorphismus weitergehen. Dies sind wertvoll, aber der wirkliche Wert in OOP (meiner Meinung nach) kommt aus dem schönen Weg, es kapselt und assoziierte Daten mit Verhaltensweisen.

Should verwenden Sie OOP an Ihren Projekten? Das hängt davon ab, wie gut Sie Ihre Sprache unterstützt OOP. Das hängt von der Art der Probleme, die Sie lösen müssen.

Aber, wenn Sie kleine Websites tun, Sie reden immer noch über genug Komplexität, dass ich OOP Design gegeben angemessene Unterstützung bei der Entwicklung Sprache verwenden.

Andere Tipps

Meine persönlich ansehen: Kontext

Wenn Sie in OOP programmieren müssen Sie ein größeres Bewusstsein für den Kontext. Es hilft Ihnen, den Code so zu organisieren, dass es leichter zu verstehen ist, weil die reale Welt auch objektorientiert ist.

Mehr als etwas nur Arbeit bekommen - Ihr Freundes Punkt, ein gut gestaltetes OO-Design ist leichter zu verstehen, zu folgen, zu erweitern, zu erweitern und zu implementieren. Es ist so viel einfacher, beispielsweise zu delegieren Arbeit, die kategorisch ähnlich oder zu halten Daten, die zusammen bleiben sollte (ja sogar eine C-Struktur ist ein Objekt).

Nun, ich bin sicher, dass eine Menge Leute werden viel mehr akademisch korrekt Antworten geben, aber hier ist mein nehmen auf einige der wertvollsten Vorteile:

  • OOP ermöglicht eine bessere Kapselung
  • OOP ermöglicht es dem Programmierer in logischer zu denken, erleichtert Software-Projekte zu entwerfen und zu verstehen (wenn sie gut gestaltet)
  • OOP ist eine Zeitersparnis. Zum Beispiel, Blick auf die Dinge, die Sie mit einem C ++ String-Objekt zu tun, Vektoren, usw. All diese Funktionalität (und vieles mehr) für kommt „frei“. Nun, die sind wirklich Merkmale der Klassenbibliotheken und sich nicht OOP, aber fast alle OOP-Implementierungen kommen mit netten Klassenbibliotheken. Können Sie das ganze Zeug in C (oder die meisten davon) umsetzen? Sicher. Aber warum schreiben Sie es selbst?

Sehen Sie sich die Verwendung von Design Patterns und Sie werden den Nutzen der OOP sehen. Es geht nicht nur um Kapselung und Wiederverwendung, sondern Erweiterbarkeit und Wartbarkeit. Es sind die Schnittstellen, die Dinge mächtig.

Einige Beispiele:

  • einen Strom (Decorator-Muster) Implementierung ohne Objekte ist schwierig

  • Das Hinzufügen einen neuen Betrieb zu einem bestehenden System wie ein neuen Verschlüsselungstyp (Strategie-Muster) ohne Objekte schwierig sein.

  • Schauen Sie sich die Art und Weise PostgresQL ist im Vergleich zu der Art und Weise implementiert, um Ihre Datenbank Buch sagt, eine Datenbank sollte umgesetzt werden, und Sie werden eine große sehen Unterschied. Das Buch wird vorschlagen Knotenobjekte für jeden Operator. Postgres verwendet unzählige Tabellen und Makros, um zu versuchen, diese Knoten zu emulieren. Es ist viel weniger hübsch und viel schwieriger, weil davon zu verlängern.

Die Liste geht weiter.

Die Macht der meisten Programmiersprachen ist in den Abstraktionen, die sie zur Verfügung stellen. Objektorientierte Programmierung stellt ein sehr leistungsfähiges System von Abstraktionen in der Art und Weise es Ihnen Beziehungen zwischen verwandten Ideen oder Aktionen verwalten.

Betrachten wir die Aufgabe von Flächen für eine willkürliche Berechnung und Erhebung von Formen erweitert. Jeder Programmierer kann schnell Schreibfunktionen für die Fläche eines Kreises, Quadrat, Dreieck, ect. und speichert sie in einer Bibliothek. Die Schwierigkeit kommt, wenn ein Programm, das identifiziert und berechnet die Fläche einer beliebigen Form zu schreiben versucht. Jedes Mal, wenn Sie eine neue Art von Form hinzufügen, sagen ein Fünfeck, würden Sie brauchen, zu aktualisieren und so etwas wie eine IF oder CASE Struktur erweitern Sie Ihr Programm zu ermöglichen, die neue Form zu identifizieren und die richtigen Bereich Routine aus Ihrer „Bibliothek von Funktionen“ nennen . Nach einer Weile beginnen die Wartungskosten mit diesem Ansatz, häufen sich.

Mit dem objektorientierten Programmierung, eine Menge davon kommt free-- nur eine Shape-Klasse definieren, die eine Fläche Methode enthält. Dann ist es nicht wirklich wichtig, was spezifische Form man es zu tun mit zur Laufzeit, nur jede geometrischen Figur, die ein Objekt, das erbt von Form und rufen Sie den Bereich Methode machen. Die objektorientierte Paradigma Greift die Details, ob in diesem Moment in der Zeit, mit dieser Benutzereingabe, brauchen wir die Fläche eines Kreis, Dreieck, Rechteck, Fünfeck oder die Ellipse Option zu berechnen, die vor einem halben Minute gerade hinzugefügt wurden.

Was passiert, wenn Sie die Schnittstelle hinter der Art und Weise der Flächenfunktion zu ändern beschlossen wurde, genannt? Mit Object Oriented Sie nur die Shape-Klasse Programmierung aktualisieren und die Änderungen propagieren automagically an alle Unternehmen, die erben von dieser Klasse. Mit einem nicht Object Oriented System würden Sie die Aufgabe konfrontiert werden von slogging durch Ihre „Funktionsbibliothek“ und jede einzelne Schnittstelle zu aktualisieren.

Insgesamt Objektorientierte Programmierung bietet eine leistungsfähige Form der Abstraktion, die Ihnen Zeit und Mühe durch die Beseitigung Wiederholung in Ihrem Code und Straffung Erweiterungen und Wartung sparen können.

Alle Programmierparadigmen haben das gleiche Ziel: versteckt unnötige Komplexität.

Einige Probleme können leicht mit einem imperativen Paradigmas gelöst, wie dein Freund Anwendungen. Andere Probleme lassen sich leicht mit einem objektorientierten Paradigma gelöst. Es gibt viele andere Paradigmen . Die wichtigsten sind (logische Programmierung, funktionale Programmierung und zwingend notwendig, Programmierung) sind alle äquivalent zueinander sind; objektorientierte Programmierung ist in der Regel gedacht als Erweiterung imperative Programmierung.

Objektorientierte Programmierung am besten verwendet, wenn der Programmierer Elemente Modellierung ist, die ähnlich sind, aber nicht gleich. Ein Imperativ Paradigma würde, die verschiedenen Arten von Modellen in eine Funktion setzen. Ein objektorientiertes Paradigma, die verschiedenen Arten von Modellen in unterschiedlichen Methoden auf verwandten Objekten trennt.

Ihr Kollege scheint in einem Paradigma stecken. Viel Glück.

Um 1994 Ich habe versucht, Sinn für OOP und C ++ zur gleichen Zeit zu machen, und fand ich frustriert, obwohl ich grundsätzlich verstehen konnte, was der Wert der OOP war. Ich war so verwendet, um mit dem Zustand von jedem Teil der Anwendung von anderen Sprachen zu Chaos in der Lage (meist Basic, Montag und Pascal-Familie Sprachen), dass es schien, als würde ich die Produktivität zugunsten einer wissenschaftlichen Abstraktion aufzugeben. Leider machten meine ersten Begegnungen mit OO-Frameworks wie MFC es einfacher zu hacken, aber nicht unbedingt viel im Weg der Aufklärung geben.

Es war nur durch eine Kombination von Ausdauer, die Exposition gegen alternative (nicht-C ++) Möglichkeiten der Umgang mit Objekten und sorgfältige Analyse der OO-Code, dass sowohl 1) gearbeitet und 2) Lesen Sie mehr kohärent und intuitiv als die entsprechenden Verfahrenscode dass ich begann, es wirklich zu bekommen. Und 15 Jahre später, bin ich regelmäßig an neuen überrascht (für mich) Entdeckungen klug, doch bestechend einfach OO-Lösungen, dass ich nicht in einem prozeduralen Ansatz tun, wie ordentlich vorstellen.

Ich habe den gleichen Satz von Kämpfen durchlaufen versuchen, Sinn des funktionalen Programmierparadigmas in den letzten paar Jahren zu machen. Paul Graham paraphrasieren, wenn Sie suchen die Macht Kontinuum nach unten, sehen Sie alles, was fehlt. Wenn Sie das Netz Kontinuum aufzublicken sind, brauchen Sie nicht die Macht sehen, die Sie gerade Seltsamkeit sehen.

Ich denke, um etwas zu tun, eine andere Art und Weise zu begehen, müssen Sie 1) sehen, dass jemand offensichtlich mehr produktiv mit leistungsfähigeren Konstrukten und 2) Unglauben auszusetzen, wenn Sie sich eine Wand schlagen finden. Es hilft wahrscheinlich einen Mentor zu haben, der weiter ein klein wenig zumindest entlang in ihrem Verständnis des neuen Paradigmas, auch.

Abgesehen von der gumption erforderlich Unglauben auszusetzen, wenn Sie möchten, dass jemand den Wert eines OO-Modell schnell grok, ich glaube, Sie viel tun könnten schlimmer als jemanden zu bitten, eine Woche mit dem Pragmatische Programmierer bucht on Rails zu verbringen. Es tut leider viele der Details, wie die magischen Werke verlassen, aber es ist eine ziemlich gute Einführung in die Leistung eines Systems von OO Abstraktionen. Wenn nach durch dieses Buch zu arbeiten, Ihr Kollege immer noch nicht den Wert von OO aus irgendeinem Grunde sehen, kann er / sie ein hoffnungsloser Fall sein. Aber wenn sie bereit sind, eine wenig Zeit, die Arbeit mit einem Ansatz zu verbringen, die ein stark opinionated OO-Design, das funktioniert hat, und bekommt sie von 0-60 weit schneller als in einer prozeduralen Sprache das gleiche tut, kann es nur Hoffnung. Ich denke, das ist wahr, auch wenn Ihre Arbeit nicht Web-Entwicklung einzubeziehen.

Ich bin mir nicht so sicher, dass die „reale Welt“ Erziehung so viel ein Verkaufsargument als Arbeitsrahmen für das Schreiben von guten apps wäre, weil es, dass sich herausstellt, vor allem in statisch typisierten Sprachen wie C # und Java, Modellierung die wirkliche Welt erfordert oft gewundenen Abstraktionen. Sie können die reale Welt zu modellieren, indem man Tausende von Menschen kämpfen, um Modell etwas so scheinbar einfach, wie die geometrische Abstraktion von „Form“ ein konkretes Beispiel für die Schwierigkeit sehen (Form, Ellipse, Kreis).

Für mich ist die Macht der OOP nicht selbst zeigen, bis Sie sprechen über Vererbung und Polymorphismus starten.

Wenn man das Argument für OOP beruht das Konzept der Kapselung und Abstraktion, und das nicht ein sehr überzeugendes Argument für mich ist. Ich kann eine riesige Bibliothek schreiben und dokumentieren nur die Schnittstellen zu, dass ich den Benutzer wollen sich bewusst sein, oder ich kann auf Sprachebene Konstrukte wie Pakete in Ada verlassen Felder privat zu machen und nur aussetzen, was es ist, dass ich möchte aus.

Doch der eigentliche Vorteil kommt, wenn ich Code in einer allgemeinen Hierarchie geschrieben habe, so dass es später so wiederverwendet werden kann, dass die gleichen genauen Code-Schnittstellen für verschiedene Funktionen verwendet werden, um das gleiche Ergebnis zu erzielen.

Warum ist das praktisch? Weil ich auf den Schultern von Riesen stehen kann meine aktuelle Aufgabe zu erfüllen. Die Idee ist, dass ich die Teile eines Problems bis zu den grundlegendsten Teilen kochen kann, die Objekte, die die Objekte, die compose ... die Objekte zusammensetzen, die das Projekt zusammenstellen. Eine Klasse, die definiert Verhalten sehr gut im allgemeinen Fall durch die Verwendung kann ich das gleiche bewährte Code verwenden, um eine bestimmte Version der gleichen Sache, und dann eine spezifischere Version der gleichen Sache, und dann noch eine noch spezifischere zu bauen Version der gleichen Sache. Der Schlüssel ist, dass jede dieser Einheiten Gemeinsamkeit hat, die bereits codiert und getestet wurde, und es besteht keine Notwendigkeit, es reimpliment es später noch einmal. Wenn ich Vererbung nicht für diese, ich die gemeinsame Funktionalität am Ende Neuimplementierung oder explizit meinen neuen Code gegen den alten Code verknüpft, der ein Szenario sieht für mich Kontrollfluss Fehler einzuführen.

Polymorphismus ist sehr praktisch in Fällen, in denen ich brauche eine bestimmte Funktionalität von einem Objekt zu erreichen, aber die gleiche Funktionalität auch von ähnlichem benötigt, aber einzigartigen Arten. Zum Beispiel in Qt, gibt es die Idee der Elemente auf ein Modell eingefügt, so dass die Daten angezeigt werden können, und Sie können Metadaten leicht für das Objekt halten. Ohne Polymorphismus, würde ich mich mit viel mehr Details kümmern muß, als ich zur Zeit tun (das heißt ich die gleichen Code-Schnittstellen müßte implementieren, die die gleiche Geschäftslogik als das Element durch, die ursprünglich gedacht waren auf dem Modell zu gehen). Da die Basisklasse meiner Daten-gebundenes Objekt interagiert nativ mit dem Modell, das kann ich stattdessen Einsatz von Metadaten auf dieses Modell ohne Probleme. Ich bekomme, was ich ohne Sorge des Objekts müssen aus über das, was die Modell Bedürfnisse, und das Modell bekommt, was es ohne Sorge muss über das, was ich in die Klasse hinzugefügt haben.

Fragen Sie Ihren Freund sichtbar zu machen jede Objekt in seinem sehr Zimmer, Haus oder Stadt ... und wenn er ein einziges solches Objekt kann sagen, in sich selbst, die ein System und in der Lage ist, einige sinnvolle Arbeit zu tun .
Dinge wie ein Knopf ist nicht allein, etwas zu tun - es viele Objekte nimmt einen Anruf zu machen.
Ebenso ist ein Automotor der Kurbelwelle, Kolben, Zündkerzen gemacht. OOPS Konzepte unserer Wahrnehmung in natürlichen Prozessen oder Dinge in unserem Leben entwickelt.
Das „Inside COM“ Buch erzählt die Zwecke des COM Analogie von einer Kindheit Spiel Mitnehmen von Tieren zu identifizieren, indem sie Fragen.

Design-Trümpfe Technologie und Methodik. Gute Entwürfe sind in der Regel universelle Prinzipien des Komplexitätsmanagements wie Recht von demeter zu übernehmen, die im Mittelpunkt der ist, was OO-Sprache-Funktionen streben danach, kodifizieren.

Gutes Design ist abhängig nicht auf der Verwendung von OO spezifischen Sprachfunktionen obwohl es in der Regel in denen besten Interesse ist, sie zu nutzen.

Nicht nur, dass es macht

  • Programmieren einfacher / besser verwaltbar in der aktuellen Situation für andere Menschen (und sich selbst)
  • Es ist bereits einfache Datenbank CRUD ermöglicht (Create, Update, Delete) Operationen.

Sie können mehr Informationen finden darüber aufzublicken: - Java: Hibernate - Dot Net: Entity Framework

Siehe auch, wie LINQ (Visual Studio) können Sie Ihre Programmierung Leben viel einfacher machen.

  • Sie können aber auch reale Probleme mit Design Patterns beginnen für die Lösung (Design Patterns sind alle über OO)

Vielleicht ist es sogar Spaß mit einer kleinen Demo zu demonstrieren:

  • Nehmen wir an, Sie speichern die Mitarbeiter benötigen, Konten, die Mitglieder, Bücher in einer Textdatei in einer ähnlichen Art und Weise.

.PS. Ich habe versucht, es in einer Pseudo-Weise zu schreiben:)

der OO Weg

Code, den Sie anrufen: io.file.save (objectsCollection.ourFunctionForSaving ())

Klasse objectsCollection

Funktion ourFunctionForSaving () As String

String _Objects

   for each _Object in objectsCollection
         Objects &= _Object & "-"
   end for

Rückkehr _Objects Ende Methode

NON-OO Way

Ich glaube nicht, dass ich nicht oo Code aufschreiben werde. Aber denken Sie daran:)

JETZT Sagen wir mal

In der OO Art und Weise. Die obige Klasse ist die Superklasse aller Methoden zum Speichern der Bücher, Mitarbeiter, Mitglieder, Konten, ... Was passiert, wenn wir die Art und Weise des Sparens in eine Textdatei ändern? Zum Beispiel ist es compactible mit einem aktuellen Standard zu machen (.CSV).

Und lassen Sie uns sagen, wir möchten eine Ladefunktion hinzufügen möchten, wie viel Code benötigen Sie schreiben? In der OO- Art und Weise müssen Sie nur die eine neue Sub-Methode hinzufügen, die alle Daten in den Parameter aufspalten (Dies geschieht einmal).

Lassen Sie Ihre Kollegen darüber nachdenken:)

In Bereichen, in denen Zustand und Verhalten schlecht ausgerichtet sind, Objektorientierung verringert die Gesamt Abhängigkeit Dichte (d.h.e Komplexität) innerhalb dieser Bereiche, die die resultierenden Systeme weniger spröde macht.

Das ist, weil die Essenz die Objektorientierung ist basiert auf der Tatsache, dass, organisatorisch, tut es nicht dustinguish zwischen Staat und Verhalten überhaupt, sowohl einheitlich als „Eigenschaften“ zu behandeln. Die Objekte sind nur Sätze von Funktionen clumpled zu minimieren Gesamt Abhängigkeit.

In anderen Domänen, Objektorientierung ist nicht der beste Ansatz. Es gibt verschiedene Sprach Paradigmen für verschiedene Probleme. Erfahrene Entwickler wissen das, und bereit sind, zu verwenden, was Sprache ist am nächsten an der Domäne.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top