Verfahrenscode vs OOP-Code

19

Ich habe ein Projekt in PHP mit mehr als 13000 Zeilen im prozeduralen Stil abgeschlossen [weil ich damit sehr vertraut bin, obwohl ich OOP kenne], und das Projekt läuft perfekt.

Aber sollte ich es in OOP konvertieren? [ Weil die Welt mit OOP beschäftigt ist ]

Mein Code benötigt keine der Funktionen von OOP [Kapselung, Vererbung im Grunde ...]!

Also was soll ich tun?

Und welche Hilfe bekomme ich, wenn ich es in OOP konvertiere?

Sourav
quelle
21
Bitte halten Sie uns auf dem Laufenden, wenn Sie dieses Projekt ändern müssen. Es wäre interessant zu wissen, ob Sie froh sind, diese Entscheidung getroffen zu haben oder es bereuen.
JeffO
2
Sie benötigen eine Kapselung. OO ist ein Weg, um es zu bekommen; Vielleicht haben Sie eine andere, die für Sie funktioniert, aber auf die eine oder andere Weise müssen Sie die Codeabhängigkeiten kontrollieren.
Marcin
Wie wäre es mit einer Anekdote für Sie: Vor ein paar Jahren habe ich an einer mittelgroßen Webanwendung gearbeitet, die hauptsächlich in JavaScript geschrieben ist (fragen Sie nicht). Der Codierungsstil war weitgehend prozedural. Als das Projekt kurz vor dem Abschluss stand, war ich mit der Art und Weise, wie der Code geschrieben wurde, unzufrieden und schrieb einen wesentlichen Teil davon in OOP-JavaScript um. Dies verursachte eine Verzögerung bei der Ausführung des Projekts, und später wurde das Projekt relativ wenig gewartet. Ich habe mich immer gefragt, ob all diese Codierung die Mühe wert war
;-)
Ja, es hat sich gelohnt. es lohnt sich immer, die türen der wiederverwendbarkeit offen zu halten.
Chani
1
Die Frage ist: erwarten Sie weitere Entwicklung? Die prozedurale Programmierung ist der einfachste und schnellste Ansatz, wenn Sie genau wissen, was Sie benötigen und es sich nicht ändern wird. Jede Änderung des Verfahrenscodes wird schmerzhaft sein, in OOP wäre es viel einfacher.
Kamil Tomšík

Antworten:

52

Mein Code benötigt keine der Funktionen von OOP

Sie haben Ihre eigene Frage beantwortet. Wenn Sie in diesem Fall kein OOP benötigen und Ihr Projekt funktioniert, konvertieren Sie es nicht.

Sie sollten jedoch versuchen, OOP für Ihr nächstes Projekt zu verwenden - aber nur, wenn dies angemessen ist.

An der prozeduralen Programmierung ist an sich nichts auszusetzen - solange sie an der richtigen Stelle verwendet wird.

ChrisF
quelle
2
+1 von "Sie sollten OOP für Ihr nächstes Projekt verwenden".
Cary Chow
11
+1 ja, wenn es richtig funktioniert, beheben Sie es nicht.
Setzamora
4
Ich würde sagen, wenn es jetzt richtig funktioniert, ändern Sie es nicht, aber Sie wissen nie, was die nächste Funktionsanforderung sein wird.
JeffO
7
"Sie sollten OOP für Ihr nächstes Projekt verwenden", aber verwenden Sie es nur, wenn es sinnvoll ist. Einige Dinge sind besser prozedural geschrieben, andere sind besser für OOP geeignet. Verwenden Sie, was angemessen ist.
TMN
@TMN - das ist impliziert - ich sollte es explizit machen.
ChrisF
16

Nein und nicht nur, weil Sie kein OOP benötigen.

Wenn Ihr Programm bereits fertig ist und zufriedenstellend funktioniert, ist es in über 90% der Fälle Zeitverschwendung, den fertigen Code aus irgendeinem Grund neu zu schreiben.

OOP ist nicht alles Mächtige Es gibt viele Orte, an denen OOP nicht verwendet werden sollte. Verwenden Sie es also nicht nur, weil OOP der Trend ist.

Skeith
quelle
1
Mit "fertigem Code" meinen Sie, dass es funktioniert?
JeffO
@eff O ja, Sir! Es ist perfekt :)
Sourav
Er sagte, er hat das Projekt beendet und es läuft perfekt. Für mich bedeutet dies, dass es entweder bereit ist, an den Kunden zu liefern, oder an den Kunden geliefert wurde, sofern es eines gibt. Mit "fertig" meine ich "getestet" und "versandbereit", wenn größere Fehler auftauchen, kann möglicherweise ein Umschreiben ins Spiel kommen.
Skeith
Bitte erläutern Sie die "vielen Stellen, an denen OOP nicht verwendet werden sollte".
Falcon
3
@ Falcon, egal wie gut Ihr OOP-Code entworfen ist, aber wenn die Problemdomäne selbst schlecht auf das OO-Modell abgebildet ist, ist Ihr OOP-Design mit Sicherheit beschissen. Es gibt Unmengen von Problemdomänen, die niemals in OOP ausgedrückt werden sollten .
SK-logic
8

Meine allgemeine Auffassung von Paradigmen (und warum keines der drei Hauptparadigmen der richtige oder der falsche Weg ist, um zu programmieren):

Prozedurale Programmierung ist gut, wenn Sie ein Problem haben, das auf hoher Ebene einfach ist (obwohl es auf niedriger Ebene komplex sein kann) und entsprechend einfachen, linearen Code schreiben möchten. Es ist wohl einfacher zu schreiben und zu verstehen als OO und funktioniert, wenn das Problem nirgendwo stark entkoppelt werden muss. Beispiele: Numerischer Code, die meisten kleinen Skripte, die meisten kleinen Unterprobleme, wenn Sie die Dinge mit OO oder funktional aufgeschlüsselt haben.

Objektorientierter Code ist gut, wenn Sie Bedenken stark entkoppeln müssen, da Sie möglicherweise mehr als eine Implementierung einiger Bedenken haben. Beispiel: Die meisten großen Unternehmenssoftware. Möglicherweise möchten Sie die Geschäftslogik stark von der Präsentationslogik entkoppeln, da sie sich möglicherweise unabhängig voneinander ändern müssen.

Funktionales Programmieren ist gut, wenn Sie den Mechanismus stark von der Richtlinie trennen müssen. Eine Mechanismusfunktion zu haben, die eine Richtlinienfunktion akzeptiert, ist ein gutes Muster. (Ich habe es anhand des std.algorithm-Moduls der Programmiersprache D gelernt .) Wenn man den veränderlichen Zustand an der Grenze zwischen Richtlinien- und Mechanismuscode entfernt, ist die API im Allgemeinen einfacher zu überlegen . Wenn der veränderbare Zustand in beiden Fällen privat verwendet wird, handelt es sich um ein Implementierungsdetail. Die andere Stärke der funktionalen Programmierung ist aus offensichtlichen Gründen die Parallelität.

dsimcha
quelle
Vielen Dank für die großartige Antwort, in der jede Art von Programmierparadigma beschrieben und Beispiele für deren Verwendung gegeben werden.
Kevin Peno
7

Code "braucht nie OOP". Es sind Programmierer, soweit sie in der Lage sind, in verschiedenen Modi zu denken, die sich vorstellen, dass dieses oder jenes bestimmte Problem $ PARADIGM "benötigt" oder am besten auf diese Weise gelöst wird.

Häufig denken Programmierer, die nur ein Paradigma kennen, dass ihr Paradigma das größte ist. Eine Größe passt für alle, und wir müssen alle im Bett von Procrustes schlafen, wenn dies oder das derzeit in Mode ist.

Ingo
quelle
5

Sie sollten Ihr Projekt nur dann in OOP konvertieren, wenn ein eindeutiger Hinweis auf die Notwendigkeit von OOP vorliegt. Mögliche Szenarien, in denen dies auftreten kann, sind (unter anderem):

  • Skalieren Sie das Projekt
  • Hinzufügen weiterer Entwickler zum Team

und selbst in diesen Szenarien ist es möglicherweise nicht erforderlich, Ihr Projekt in OOP zu konvertieren.

Timothy Groote
quelle
Guter Punkt, aber können Sie mir sagen, warum es problematisch sein wird, das Projekt zu vergrößern oder weitere Entwickler in das Team aufzunehmen, wenn es sich um einen Verfahrenscode handelt?
Sourav
Die Skalierung des Projekts kann das Hinzufügen komplexer relationaler Strukturen zum Anwendungsmodell umfassen. In diesem Fall kann sich die Umstellung auf OOP als rentabel erweisen. Wenn die Anwendung nach und nach skaliert und sich auf lange Sicht als einfacher zu realisieren oder zu verstehen herausstellt, können neue Entwickler schneller aufholen, wenn der Code OOP ist. Das Hinterlassen von Nicht-OO-Code kann sich später als Problem herausstellen, wenn das Projekt größer wird. ein weiterer Fall, in dem 'die Dinge so sind, wie sie sind, weil sie so sind'
Timothy Groote
3
Das ist genau das, woran ich dachte, als ich die Frage las. Er sagt, er hat 13 K Codezeilen geschrieben. Ich hoffe, es wird nicht durch die einmalige Verwendung verschwendet. und wenn es wiederverwendet werden muss, ist oop ein Muss. Andernfalls wäre es ein Albtraum für die neuen Entwickler
Chani
4

Beides kann gut sein, beides kann schlecht sein. Aber eine Nachrüstung, um wie die andere auszusehen, ist niemals eine gute Idee.

jwenting
quelle
2

Wenn Sie zurückdenken, warum OO erfunden wurde, werden Sie feststellen, dass Sie OOP überhaupt nicht brauchen , aber manchmal macht es Ihr Leben viel einfacher.

In den Tagen der C-Codierung konnte ein sehr umfangreiches Programm ziemlich unübersichtlich und schwierig werden, weiterzuarbeiten. Also erfanden sie Möglichkeiten, es in modulare Blöcke aufzuteilen. OOP verfolgt diesen Ansatz und macht ihn noch modularer, indem es die Daten mit diesen Programmlogikblöcken kombiniert, um sie noch weiter vom Rest des Codes zu trennen.

Auf diese Weise können Sie immer größere Programme schreiben und sicher sein, dass Sie Ihren riesigen Elefanten von einer Aufgabe in eine Aufgabe von 100 Mäusen verwandelt haben. Der zusätzliche Bonus ist, dass Sie einige dieser "Mäuse" nehmen und sie in anderen Programmen wiederverwenden können!

Natürlich ist die reale Welt nicht ganz so, und die Wiederverwendung von Objekten hat sich nie in der beabsichtigten Weise durchgesetzt, aber das bedeutet nicht, dass es ein nutzloses Paradigma ist.

Was unbrauchbar ist, ist eine zu starke Abhängigkeit von beiden Codierungsarten. Jeder, der OO mit tausend winzigen, unbedeutenden Klassen durchführt, macht es nicht richtig - er macht für sich selbst (oder für jemanden anderen) einen Wartungs-Albtraum. Wer eine prozedurale Anwendung mit nur drei Funktionen schreibt, macht auch das Leben schwer. Der beste Weg sind die mittelgroßen, großformatigen Objekte (manchmal auch als Komponenten bezeichnet), die eine Menge eigenständigen Codes und Daten liefern können, die mit größerer Wahrscheinlichkeit wiederverwendet werden isoliert von dem Rest Ihrer App.

Mein Rat für das nächste Mal: ​​Versuchen Sie, Ihren üblichen Prozedurcode zu schreiben, aber erstellen Sie ein einzelnes Objekt Ihrer Hauptdatenstruktur. Sehen Sie, wie Sie feststellen, dass es einfacher ist, damit zu arbeiten, als Daten von Funktion zu Funktion weiterzugeben.

gbjbaanb
quelle
0

Mein Code benötigt keine der Funktionen von OOP [Kapselung, Vererbung im Grunde ...]!

Wie kannst du das Wissen?

Müssen Sie dieses Projekt pflegen? Sind neue Funktionen geplant? Wird es andere Menschen geben, die sich mit Ihnen entwickeln? Hast du dich wiederholt? Ist der Code schwer zu verstehen?

Wenn die Antwort "Ja" lautet, sollten Sie vielleicht darüber nachdenken, ein OOP-Skelett einzurichten und auf diese Weise vorzugehen.

vihus
quelle