Wann setzen wir eigentlich objektorientierte Programmierung ein? [geschlossen]

35

Ich schreibe ein Programm in Python, das im Grunde genommen Strings manipuliert, und ich habe mich gefragt, ob ich es mit OOP-Prinzipien machen soll oder nicht. Der Kunde hat mir gesagt, dass ihm der Code egal ist, er möchte nur, dass die Sache erledigt wird .

Ich weiß, dass objektorientierter Code nicht per Definition sauberer ist, und umgekehrt ist Nicht-OO-Code per Definition nicht beschissen. Die Frage, die ich stelle, basiert vielleicht mehr oder weniger auf Meinungen, aber es gibt möglicherweise einige Regeln, die mir nicht bekannt sind.

Noch ein paar Infos darüber, was zu tun ist:

  • Analysieren Sie eine .csvDatei und verarbeiten Sie die Daten basierend auf einer Konfigurationsdatei (die Spalten können unterschiedlich sein - wie die Anzahl der Spalten oder die Daten, die sie enthalten).
  • Verwenden Sie die oben verarbeiteten Daten, um neue, benutzerdefiniert formatierte Daten zu erstellen (oder mehrere Dateien, die auf einigen der oben genannten Werte basieren).
  • Verwenden Sie die zuletzt formatierten Daten, um eine XML-Datei zu erstellen.
  • XMLTeilen Sie die XML-Datei anhand ihres Inhalts in mehrere s auf
  • Die Anwendung sollte CLI-basiert sein
  • Es gibt natürlich auch andere Dinge wie: Protokollieren einiger Ereignisse, Analysieren von CLI-Argumenten usw.

Nun, dies ist überhaupt keine große / harte Anwendung, und es ist auch fast fertig, aber während des gesamten Entwicklungsprozesses habe ich mich immer wieder gefragt, ob dies mit OOP geschehen soll oder nicht.

Meine Frage wäre also: Wie wisst ihr, wann OOP in einer Anwendung verwendet werden soll?

Grajdeanu Alex.
quelle
12
Betreff: "Der Client ... interessiert sich nicht für den Code, er möchte nur, dass die Sache erledigt wird." OK, dann mach das Ding. Aber wie komplex ist das? Wie gut verstehen Sie die Anforderungen wirklich ? Wie wahrscheinlich ist es, dass der Kunde Sie später auffordert, die Sache zu ändern? Manchmal ist ein quick and dirty Hack ist alles , was Sie brauchen, aber je mehr Zeit und Energie Sie gehen in sie investieren, desto wahrscheinlicher ist, dass einige strukturierte Vorgehensweise zur Lösung des Problems (zB OO - Design) Sie profitieren.
Solomon Slow
5
Verwenden Sie in Ihren Posts nicht "EDIT" oder ähnliche Moniker. Jeder Stack Exchange-Beitrag verfügt über einen detaillierten Bearbeitungsverlauf, den jeder einsehen kann. Informationen wie "Ich habe nicht gefragt, was OOP ist" sind in einem Kommentar sowieso angemessener, nicht Ihre Frage.
Robert Harvey
@ Robert Harvey ok, verstanden. Ich mache das nächste Mal.
Grajdeanu Alex.

Antworten:

60

Python ist eine Multiparadigmasprache, dh Sie können das für die Aufgabe am besten geeignete Paradigma auswählen. Einige Sprachen wie Java sind OO mit einem einzigen Paradigma, was bedeutet, dass Sie Kopfschmerzen bekommen, wenn Sie versuchen, ein anderes Paradigma zu verwenden. Plakate mit der Aufschrift "Immer OO verwenden" stammen wahrscheinlich aus einem Umfeld in einer solchen Sprache. Aber zum Glück haben Sie die Wahl!

Ich stelle fest, dass Ihr Programm eine CLI-App ist, die einige Eingaben (CSV- und Konfigurationsdateien) liest und einige Ausgaben (XML-Dateien) erzeugt, aber nicht interaktiv ist und daher keine statusbehaftete GUI oder API hat. Ein solches Programm wird natürlich als eine Funktion von Eingabe zu Ausgabe ausgedrückt, die an andere Funktionen für Unteraufgaben delegiert.

Bei OO hingegen geht es um die Kapselung des veränderlichen Zustands und ist daher besser für interaktive Anwendungen, GUIs und APIs geeignet, die den veränderlichen Zustand offenlegen. Es ist kein Zufall, dass OO parallel zu den ersten GUIs entwickelt wurde.

OO bietet einen weiteren Vorteil, da durch Polymorphismus eine locker gekoppelte Architektur ermöglicht wird, bei der verschiedene Implementierungen derselben Schnittstelle leicht ersetzt werden können. In Kombination mit Dependency Injection kann dies das konfigurationsbasierte Laden von Abhängigkeiten und anderen coolen Dingen ermöglichen. Dies ist jedoch meistens für sehr große Anwendungen geeignet. Für ein Programm von der Größe, die Sie beschreiben, wäre es viel zu viel Aufwand ohne erkennbaren Nutzen.

Abgesehen von den Funktionen, mit denen die Dateien tatsächlich gelesen und geschrieben werden, kann der Großteil Ihrer Logik als nebenwirkungsfreie Funktionen geschrieben werden, für die Eingaben erforderlich sind und andere Ausgaben zurückgegeben werden. Dies ist äußerst einfach zu testen, viel einfacher als das Testen von OO-Einheiten, bei denen Sie Abhängigkeiten und so weiter verspotten müssen.

Fazit: Ich schlage eine Reihe von Funktionen vor, die für die Organisation in Module unterteilt sind, aber keine Objekte.

JacquesB
quelle
8
Endlich eine ausgewogene Antwort, die nicht nur das Lob von OOP singt :-)
cmaster
1
Das ist die Art von Antwort, die ich erwartet habe. Könnten Sie Ihre Antwort etwas erweitern? Bis jetzt sieht es fantastisch aus.
Grajdeanu Alex.
3
@ Dex'ter: Als du. Welche zusätzlichen Informationen suchen Sie?
JacquesB
3
Ich füge hinzu, dass funktionale Programmierung ein Paradigma sein könnte, über das man nachlesen kann.
Andrew sagt Reinstate Monica
1
@Bergi: Ja, das ist der Vorteil einer Multi-Paradigma-Sprache. Sie können OO-Bibliotheken verwenden, ohne ein eigenes Programm im OO-Stil schreiben zu müssen.
JacquesB
15

Betrachten Sie eine Schaltfläche auf einer GUI. Es hat einen Status (Größe, Farbe, Position, Beschriftung usw.). Es können Dinge passieren (es ist angeklickt, muss neu gezeichnet werden usw.). In solchen Situationen ist es sinnvoll, es als Objekt zu modellieren. Als Objekt kann es seinen Status enthalten, eine Reihe von Aktionen, die darauf ausgeführt werden können (Methoden), und es kann andere Teile der Anwendung darüber informieren, dass ihm etwas passiert ist, indem Ereignisse ausgelöst werden.

OOP ist ein hervorragendes Tool für den Umgang mit GUIs und anderen Situationen, in denen Teile des Systems flüchtige Zustände aufweisen.

Andere Situationen, wie die von Ihnen beschriebene, in denen Daten aus einer Quelle gelesen, verarbeitet und in ein Ziel geschrieben werden, werden durch einen anderen Ansatz gut behandelt: deklarative (oder Funktions-) Programmierung. Deklarativer Code für die Datenverarbeitung ist in der Regel einfacher zu lesen und kürzer als OOP-Lösungen.

So wie Hammer und Säge bei richtiger Anwendung mächtige Werkzeuge sind, so sind auch objektorientierte und deklarative Programmiertechniken. Sie könnten wahrscheinlich mit dem Griff einer Säge einen Nagel in ein Stück Holz schlagen. Ebenso können Sie ein Stück Holz mit einem Hammer halbieren. Ebenso können Sie eine GUI mit nur Funktionen erstellen und Daten mit Objekten verarbeiten. Wenn die Werkzeuge jedoch richtig verwendet werden, sind die Ergebnisse sauberer und einfacher.

Die allgemeine Faustregel lautet, dass ich Objekte verwende, wenn ich viel Status habe oder Benutzerinteraktion benötige. ansonsten verwende ich (möglichst reine und höherwertige) Funktionen.

David Arno
quelle
6

Objektorientierte Programmierung erweitert Ihr Arsenal um vier neue Tools :

  1. Verkapselung
  2. Abstraktion
  3. Erbe
  4. Polymorphismus

Sie würden OOP in Ihrer Anwendung verwenden, wenn diese groß genug und komplex genug geworden ist, um von diesen Tools zu profitieren.

Robert Harvey
quelle
18
Abstraktion und Polymorphismus sind Werkzeuge, die von vielen "Orientierungen" der Programmierung bereitgestellt werden. OOP bietet tatsächlich eine schwächere Form der Kapselung als andere Ansätze, da Vererbung undichte Abstraktionsentwürfe fördert. Das einzige, was OOP wirklich zum Toolkit hinzufügt, ist die Vererbung, die allgemein als eine schlechte Sache angesehen wird.
David Arno
4
@DavidArno: Du sagst im Grunde "Benutze niemals OOP."
Robert Harvey
6
Dies ist der Hintergrund eines schwierigen Arbeitstages mit Blick auf den Code anderer Leute. Eine einfache prozedurale Implementierung eines Programms ist oftmals besser als eine Implementierung mit einem schlechten Verständnis des OO-Designs. OO-Architektur kann sehr leistungsfähig sein, sollte aber wie ein Gewürz beim Kochen verwendet werden, mit Expertenwissen und genau der richtigen Menge. Die missbräuchliche Verwendung von OO-Design ist ungefähr so ​​häufig wie das Bitten um Ketchup in einem schlechten Restaurant.
Phill
6
Keines der vier Tools (Encapsulation, Abstraction, Inheritance, Polymorphism) ist OOP-spezifisch. Vielleicht sollten Sie erklären, wie sich OOP von anderen Paradigmen in diesen Dimensionen unterscheidet.
Giorgio
4
@gardenhead Ihr seltsames Gefühl der Überlegenheit tut nichts für Ihre Position. Vielleicht sollten Sie eine Frage mit dem Titel "Warum sind die meistverwendbaren Sprachen oft OO?" Besser noch, Strg + F und 'GUI' eingeben.
Gusdor
1

Diese Frage scheint mir ein wenig verwirrt. Wenn Sie es in Python schreiben, sind Sie ziemlich sicher gehen verwenden Objekte. Wenn Sie eine Datei öffnen, wird ein Objekt zurückgegeben. Wenn Sie result ergeben, gibt es ein Iterator-Objekt zurück. Jede von Ihnen erstellte Funktion ist ein Objekt. Den Wert von OO in Python-Anwendungen in Frage zu stellen, scheint gelinde gesagt seltsam.

Basierend auf den Kommentaren hier, ja, unterstützt Python funktionale Paradigmen, aber es ist in erster Linie objektbasiert. Die Sprache selbst und die eingebauten Bibliotheken orientieren sich an Objekten. Ja, es unterstützt Lambda (wie Java und jede andere Anzahl von Sprachen, die normalerweise als OO bezeichnet werden), aber es ist absichtlich simpel im Vergleich zu einer echten funktionalen Sprache.

Vielleicht werden diese Unterscheidungen zwischen OO-Design und funktionalem Design hinfällig. Wenn ich eine polymorphe Funktion für ein von OO entworfenes Objekt * erstelle und einen Zeiger auf diese Funktion für ein Objekt als Parameter für eine funktionell gestaltete Funktion * übergebe, ist das OO oder funktioniert es? Ich denke, es ist beides und auch ein wirklich effektiver Ansatz zur Lösung von Problemen.

Ich denke, die eigentliche Frage ist, wann Sie anfangen sollten, Ihre eigenen Klassen zu entwerfen, anstatt nur ein Modul mit Funktionen zu erstellen. Ich denke, die richtige Antwort ist: Wenn es hilft, die Lösung zu vereinfachen. Ich würde die gleiche grundlegende Antwort für jede objektorientierte Sprache geben.

* Redundanz ist beabsichtigt: Ich möchte hier nicht beschuldigt werden, dass Objekte OO sind oder dass Funktionen funktionsfähig sind.

JimmyJames
quelle
5
Ja, Objekte sind nicht gleich OOP. Es gibt einen Unterschied zwischen einem Objekt und der Strukturierung Ihrer Architektur um Objekte und deren Interaktionen. Ein bisschen wie, wenn Sie eine Funktion erstellen, die nicht bedeutet, dass Sie eine funktionale Programmierung durchführen.
Sara
Sie könnten ein Python / JavaScript-Objekt leicht als einen Datensatz betrachten, der ziemlich funktional ist. Funktionssprachen haben Objekte. Der Schlüssel ist im zweiten Wort: orientiert. OOP-Sprachen sind vollständig auf die Verwendung von Objekten ausgerichtet, während einige andere Sprachen sie lediglich als einen weiteren Teil Ihrer Toolbox darstellen.
Dan Pantry
0

Eines der größten Dinge bei der objektorientierten Programmierung ist, dass Sie statt über den Programmfluss über den Zustand nachdenken.

Oft sehe ich das Objekt, ich sehe die Methoden, aber ich sehe auch, dass der treibende Gedanke hinter dem Code Fluss statt Zustand ist.

Und wenn Sie einmal über den Zustand nachgedacht haben, ist es einfach, einen guten OOP-Code zu erstellen, denn sobald Ihr Code zu komplex wird, stellen Sie fest, dass Sie nicht mehr über Ihren Zustand nachdenken können und wissen, dass Sie umgestalten müssen.

Betrachten Sie Ihr Beispiel: Sie möchten eine CSV-Datei analysieren. Woher kommt es: eine Datei auf der Festplatte. Sie laden es und speichern es und analysieren es. Nun kommt Ihr Kunde: Hey, ich möchte auch Dateien aus dem Web analysieren. Sie sind also glücklich, weil Sie eine schöne Oberfläche zum Laden Ihrer Datei erstellt haben und nur den Code erstellen müssen, der sie aus dem Web abruft, und der Rest Ihres Programms bleibt genau gleich.

Und das Schöne ist: Das können Sie testen.

Pieter B
quelle
3
Ihr Beispiel mit dem Lesen einer Datei von der Festplatte im Vergleich zum Lesen einer Datei aus dem Web kann auch mit verschiedenen Funktionen implementiert werden. Dafür brauchst du keine OO.
JacquesB
0

In den Begriffen des Laien:

  • Sie können OOP oder Nicht-OOP in beliebigen Projekten verwenden.
  • OOP ist kein Allheilmittel, aber es hilft, die Komplexität zu managen.
  • Es geht über die Modularität hinaus, es geht um die Unterteilung. Denken Sie an die verschiedenen Fächer eines Schiffes, um den Auftrieb zu erhalten, wenn der Rumpf beschädigt ist.
  • OOP ist eine Methode zum Verwalten von Abhängigkeiten, sodass Fehler leichter aufgespürt werden können, da nur eine definierte Reihe von Möglichkeiten zur Kommunikation zwischen den verschiedenen Komponenten eines Programms besteht.
  • In einem Programm funktionieren viele Dinge: Variablen, Konstanten, Methoden, Dateien, Parameter, Funktionen, Module usw. Sie können auf manchmal unvorhersehbare Weise miteinander interagieren. OOP ist eine Reihe von Prinzipien, die die Anzahl der Arten, wie Dinge miteinander interagieren können, reduzieren. Sie sind nicht gezwungen, OOP zu verwenden, aber es hilft.

Es sind jedoch noch weitere Faktoren zu berücksichtigen:

  • Sind Ihre Programmierer mit OOP / OOD vertraut?
  • Beherrschen Ihre Programmierer eine OOP-Sprache?
  • Glauben Sie, dass die Software mit der Zeit komplexer wird?
  • Planen Sie, Code in Zukunft zu skalieren oder wiederzuverwenden?
  • Denken Sie, dass Ihr "Design" ein Gewinn werden kann? Werden Sie es für das Wachstum oder als Grundlage für zukünftige Projekte nutzen können?

Verstehen Sie mich nicht falsch: Sie können all das erreichen, ohne OOP zu verwenden, aber mit OOP wird es einfacher.

Aber...

Wenn Ihr Team mit OOP / OOD nicht vertraut ist und keine Fachkenntnisse in diesem Bereich hat, gehen Sie mit den Ressourcen um, über die Sie verfügen.

Tulains Córdova
quelle
-2

Meine Frage wäre also: Wie wisst ihr, wann OOP in einer Anwendung verwendet werden soll?

Benutze es immer. Sobald Sie es gewohnt sind, werden Sie es für alles verwenden. Auf diese Weise kann eine gute Abstraktion zwischen Funktionen und deren Verwendung sichergestellt werden, was für die Wartung von großem Vorteil ist. Wir verwenden es zum Beispiel für

  • kleine Datenstrukturobjekte, weil diese so oft polymorph sind, und beispielsweise zwischenliegende Datenstrukturen nach dem Parsen haben oft mehrere kleine Entitäten, die ein gemeinsames Verhalten haben und dennoch auch spezialisiert sind. Dies ist ein großartiger Anwendungsfall für eine gemeinsame Basisklasse oder Schnittstelle mit speziellen Implementierungen und Verhaltensweisen, dh einer Klassenhierarchie (Polymorphismus).

  • Protokollierung als Beispiel, da es einfach ist, einen anderen Protokollierer zu ersetzen

  • große Teile der Programmstruktur, weil Sie mehrere gleichzeitig heraufbeschwören und möglicherweise die Vorteile von Multi-CPU-Prozessoren nutzen. Beispielsweise kann ein Webserver aufgrund von Objekten problemlos mehrere gleichzeitige Anforderungshandler verwenden.

Wie bereits erwähnt, erleichtert dies die Umgestaltung und Wiederverwendung und fördert eine gute Abstraktion, was die Wartung erleichtert. OOP sollte die ganze Zeit angenommen und genutzt werden. Eine gute OOP-Programmierung vermeidet statische Methoden und / oder statische Daten und verwendet Objekte für alles.

Erik Eidt
quelle
6
Ich habe nicht abgestimmt (obwohl ich nah dran war), aber ich denke, das ist der Grund für die Abstimmungen, die Sie erhalten haben: "Verwenden Sie das immer, weil es großartig ist" ist selten ein guter Rat. Es gibt immer Ausnahmen. Kein Tool kommt ohne Nachteile aus, und OOP ist keine Ausnahme. Sagen Sie den Leuten, dass es gut ist, sagen Sie den Leuten, wofür es gut ist, sagen Sie den Leuten, warum es gut ist, sagen Sie den Leuten, dass sie Alternativen meiden sollen, wenn sie können, aber sagen Sie den Leuten niemals, dass sie nicht über Alternativen nachdenken sollen.
cmaster
@cmaster, ich bin in Ordnung, wenn die Leute ablehnen, sie haben die Wahl und ich habe es auch getan. Zum Thema denke ich immer noch, dass dies die richtige Antwort für die Person ist, die die Frage stellt. IMHO muss das OP den ganzen Weg einspringen und OOP verwenden, anstatt zu versuchen, zu entscheiden, wann OOP verwendet werden soll, und gelegentlich eine Klasse zu erstellen, aber anderenfalls prozeduralen Code zu schreiben.
Erik Eidt
2
@cmaster Ich kann Eriks Rat schätzen. So oft die Art der Antwort "es kommt darauf an" der politisch korrekte Weg sein mag, seien wir ehrlich, OO ist so ziemlich die Grundlage für Programmierumgebungen geworden, die dies unterstützen. Machen wir uns nichts vor, mit OO kann man kaum etwas falsch machen. Das beschriebene Skript ist zwar linear, aber komplex genug, damit Objekte Ihnen einige Vorteile bringen.
Martin Maat
2
@ErikEidt "Das OP muss vollständig einspringen und OOP verwenden" Das könnte man so umschreiben: "Das OP muss aufhören, über den besten Weg zur Lösung des Kundenproblems nachzudenken und einfach dem einen wahren Weg zur Aufklärung folgen." Leider musste ich mich mit vielen sogenannten Computerfachleuten auseinandersetzen, die diese Software-Design-Methodik befolgen. Obligatorische Dilbert Cartoon: dilbert.com/strip/1996-02-27
Alephzero
1
So einfach es ist, dies als "ein weiterer sinnloser OOP-Fanatiker" wegzuwinken, ich denke, es gibt etwas zu sagen, um tatsächlich zu 100% in etwas zu gehen, das es wirklich verinnerlicht und aufnimmt. Sie können es nicht jeden Tag für den Rest Ihres Lebens verwenden, sondern Sie lernen die Stärken und Schwächen und lesen nicht nur darüber. Ich würde fast jedem empfehlen, ein paar Monate mit Hardcore-OOP und ein paar Monate mit Hardcore-FP (á la haskell) und ein paar Monate mit prozeduralem C und so weiter zu verbringen. komm einfach rein und mach dich fertig damit.
Sara
-2

Objektorientierte Programmierung bietet Tools zum Erstellen von Frameworks. Diese Werkzeuge sind Encapsulation, Abstraction, Inheritance und Polymorphism. Mithilfe dieser Ideen können Sie Ihr Programm in zwei Abschnitte unterteilen.

Gewusst wie - Dies ist der Frame-Arbeitsteil Ihres Codes, in dem Sie eine Art Abstraktion erstellen, entscheiden, wie Ihre Blöcke im Allgemeinen funktionieren und wie sie mit anderen Blöcken interagieren.

Was zu - In diesem Teil erledigen die Blöcke die eigentliche Arbeit. Hier werden die Klassen von den Basisklassen abgeleitet, die im Abschnitt "Gewusst wie" erstellt wurden.

Man kann sehr von OOPS profitieren

  1. Wenn Sie ein vorhandenes Framework wiederverwenden können und nur bestimmte Details im Abschnitt "Was ist zu tun?" implementieren müssen.
  2. Die Funktionalität, die für das aktuelle Projekt implementiert wird, ist eine generische / häufig verwendete Funktion, und andere / zukünftige Projekte können vom Framework profitieren, das während der Entwicklung des aktuellen Projekts erstellt wird.
  3. Zerlegen Sie große Projekte in allgemein bekannte Muster, um ein großes Problem zu lösen.
  4. Verwenden Sie OOPS auch für kleine Projekte, um sich daran zu gewöhnen, es zu verwenden, und seien Sie bereit, wenn 1-3 Arten von Problemen auftreten
Rahul Menon
quelle
Sie sagen also, Sie sollten immer OOP verwenden, unabhängig von der eigentlichen Aufgabe, die Sie lösen möchten?
JacquesB
Nein :), es gibt viele Programm-Padigramme, und einige eignen sich dazu, ein bestimmtes Problem besser zu lösen als andere. OOPS ist keineswegs die beste Lösung für alle, aber OOPS ist ziemlich beliebt. Das Erstellen guter Klassen und Strukturen in OOPS erfordert Zeit und Übung. Wenn Sie also OOPS effizienter einsetzen möchten, sollten Sie mit kleineren Projekten beginnen. Sobald Sie es gemeistert haben, liegt es ganz bei Ihnen. Ich betrachte OOPS-Konzepte als ein Werkzeug, um hauptsächlich Frameworks zu erstellen.
Rahul Menon