it-swarm-eu.dev

Ist OOP schwer, weil es nicht natürlich ist?

Man kann oft hören, dass OOP natürlich der Art und Weise entspricht, wie Menschen über die Welt denken. Aber ich würde dieser Aussage stark widersprechen: Wir (oder zumindest ich) konzipieren die Welt in Bezug auf - Beziehungen zwischen Dingen, denen wir begegnen, aber der Fokus von OOP liegt auf dem Entwerfen einzelner Klassen und ihrer Hierarchien.

Beachten Sie, dass im täglichen Leben Beziehungen und Aktionen hauptsächlich zwischen Objekten bestehen, die Instanzen von nicht verwandten Klassen in OOP gewesen wären. Beispiele für solche Beziehungen sind: "Mein Bildschirm befindet sich oben auf der Tabelle"; "Ich (ein Mensch) sitze auf einem Stuhl"; "ein Auto ist unterwegs"; "Ich tippe auf der Tastatur"; "Die Kaffeemaschine kocht Wasser", "Der Text wird im Terminalfenster angezeigt."

Wir denken in zweiwertigen (manchmal dreiwertigen, wie zum Beispiel in "Ich habe dir Blumen gegeben") Verben, wobei das Verb die Aktion (Beziehung) ist, die auf zwei Objekte wirkt, um ein Ergebnis/eine Aktion zu erzeugen. Das Fokus ist auf Aktion gerichtet, und die zwei (oder drei) [grammatikalischen] Objekte haben die gleiche Bedeutung.

Vergleichen Sie dies mit OOP, wo Sie zuerst ein Objekt (Substantiv) finden und ihm sagen müssen, dass es eine Aktion für ein anderes Objekt ausführen soll. Die Denkweise wird von Aktionen/Verben, die mit Substantiven arbeiten, zu Substantiven verschoben Arbeiten mit Substantiven - es ist, als würde alles mit passiver oder reflexiver Stimme gesagt, z. B. "der Text wird vom Terminalfenster angezeigt". Oder vielleicht "der Text zeichnet sich selbst auf das Terminalfenster".

Der Fokus wird nicht nur auf Substantive verlagert, sondern einem der Substantive (nennen wir es grammatikalisches Subjekt) wird eine höhere "Bedeutung" beigemessen als dem anderen (grammatikalisches Objekt). Man muss sich also entscheiden, ob man terminalWindow.show (someText) oder someText.show (terminalWindow) sagt. Aber warum Menschen mit solch trivialen Entscheidungen ohne betriebliche Konsequenzen belasten, wenn man wirklich Show meint (terminalWindow, someText)? [Konsequenzen sind operativ unbedeutend - in beiden Fällen wird der Text im Terminalfenster angezeigt - können jedoch bei der Gestaltung von Klassenhierarchien sehr schwerwiegend sein und eine "falsche" Wahl kann zu verschlungenen und schwierigen Ergebnissen führen Code zu pflegen.]

Ich würde daher argumentieren, dass die gängige Vorgehensweise OOP (klassenbasiert, Einzelversand)) schwierig ist, weil sie IS UNNATURAL und nicht dem entspricht, wie Menschen denken über die Welt nach. Generische Methoden von CLOS sind meiner Denkweise näher, aber leider ist dies kein weit verbreiteter Ansatz.

Wie/warum kam es angesichts dieser Probleme dazu, dass die derzeit gängige Vorgehensweise OOP so populär wurde? Und was, wenn überhaupt, kann getan werden, um sie zu entthronen?

86
zvrba

OOP ist für einige Probleme unnatürlich. So ist prozedural. So ist funktional. Ich denke OOP hat zwei Probleme, die es wirklich schwierig erscheinen lassen.

  1. Einige Leute tun so, als wäre es die einzig wahre Art zu programmieren, und alle anderen Paradigmen sind falsch. Meiner Meinung nach sollte jeder eine Multiparadigmensprache verwenden und das beste Paradigma für das Teilproblem auswählen, an dem er gerade arbeitet. Einige Teile Ihres Codes haben einen OO Stil). Einige sind funktional. Einige haben einen geradlinigen prozeduralen Stil. Mit der Erfahrung wird klar, welches Paradigma für was am besten ist:

    ein. OO ist im Allgemeinen am besten geeignet, wenn Sie Verhaltensweisen haben, die stark an den Status gekoppelt sind, in dem sie ausgeführt werden, und die genaue Art des Status ein Implementierungsdetail ist, dessen Existenz jedoch nicht einfach abstrahiert werden kann Beispiel: Sammlungsklassen.

    b. Die Vorgehensweise ist am besten geeignet, wenn Sie eine Reihe von Verhaltensweisen haben, die nicht stark an bestimmte Daten gekoppelt sind. Zum Beispiel arbeiten sie möglicherweise mit primitiven Datentypen. Es ist am einfachsten, sich das Verhalten und die Daten hier als separate Einheiten vorzustellen. Beispiel: Numerischer Code.

    c. Funktional ist am besten, wenn Sie etwas haben, das ziemlich einfach deklarativ zu schreiben ist, so dass die Existenz eines Zustands überhaupt ein Implementierungsdetail ist, das leicht abstrahiert werden kann. Beispiel: Parallelität abbilden/reduzieren.

  2. OOP zeigt im Allgemeinen seine Nützlichkeit bei großen Projekten, bei denen gut gekapselte Codeteile wirklich erforderlich sind. Dies passiert in Anfängerprojekten nicht zu oft.

97
dsimcha

IMHO ist es eine Frage des persönlichen Geschmacks und der Denkweise. Ich habe nicht viel Probleme mit OO.

Wir (oder zumindest ich) konzipieren die Welt in Bezug auf Beziehungen zwischen Dingen, denen wir begegnen, aber der Fokus von OOP) liegt auf der Gestaltung einzelner Klassen und ihrer Hierarchien.

IMHO ist dies nicht ganz so, obwohl es eine verbreitete Wahrnehmung sein kann. Alan Kay, der Erfinder des Begriffs OO, betonte immer das Nachrichten, das zwischen Objekten gesendet wurde, und nicht die Objekte selbst. Und die Botschaften bezeichnen zumindest für mich Beziehungen.

Beachten Sie, dass im täglichen Leben Beziehungen und Aktionen hauptsächlich zwischen Objekten bestehen, die Instanzen von nicht verwandten Klassen in OOP gewesen wären.

Wenn zwischen Objekten eine Beziehung besteht, sind sie per Definition miteinander verbunden. In OO können Sie es mit einer Assoziations-/Aggregations-/Verwendungsabhängigkeit zwischen zwei Klassen ausdrücken.

Wir denken in zweiwertigen (manchmal dreiwertigen, wie zum Beispiel in "Ich habe dir Blumen gegeben") Verben, wobei das Verb die Aktion (Beziehung) ist, die auf zwei Objekte wirkt, um ein Ergebnis/eine Aktion zu erzeugen. Der Fokus liegt auf der Aktion, und die zwei (oder drei) [grammatikalischen] Objekte haben die gleiche Bedeutung.

Aber sie haben immer noch ihre genau definierten Rollen im Kontext: Subjekt, Objekt, Handlung usw. "Ich habe dir Blumen gegeben" oder "Du hast mir Blumen gegeben" sind nicht dasselbe (ganz zu schweigen von "Blume hat dir mir gegeben": -)

Vergleichen Sie dies mit OOP, wo Sie zuerst ein Objekt (Substantiv) finden und ihm sagen müssen, dass es eine Aktion für ein anderes Objekt ausführen soll. Die Denkweise wird von Aktionen/Verben, die mit Substantiven arbeiten, zu Substantiven verschoben Arbeiten mit Substantiven - es ist, als würde alles mit passiver oder reflexiver Stimme gesagt, z. B. "der Text wird vom Terminalfenster angezeigt". Oder vielleicht "der Text zeichnet sich selbst auf das Terminalfenster".

Ich bin damit nicht einverstanden. IMHO liest sich der englische Satz "Bill, go to hell" im Programmcode natürlicher als bill.moveTo(hell) anstatt move(bill, hell). Und ersteres ist in der Tat analoger zur ursprünglichen aktiven Stimme.

Man muss sich also entscheiden, ob man terminalWindow.show (someText) oder someText.show (terminalWindow) sagt.

Auch hier ist es nicht dasselbe, das Terminal zu bitten, Text anzuzeigen, oder den Text zu bitten, das Terminal anzuzeigen. IMHO ist es ziemlich offensichtlich, welches natürlicher ist.

Wie/warum kam es angesichts dieser Probleme dazu, dass die derzeit gängige Vorgehensweise OOP) so populär wurde?

Vielleicht, weil die Mehrheit der OO Entwickler OO anders als Sie?

48
Péter Török

Einige Programmierer finden OOD schwierig, weil diese Programmierer gerne darüber nachdenken, wie das Problem für den Computer gelöst werden kann, und nicht darüber, wie das Problem gelöst werden soll.

... aber der Fokus von OOP liegt auf dem Entwerfen einzelner Klassen und ihrer Hierarchien.

Bei OOD geht es NICHT darum. Bei OOD geht es darum herauszufinden, wie sich Dinge verhalten und interagieren.

Wir denken in zweiwertigen (manchmal dreiwertigen, wie zum Beispiel in "Ich habe dir Blumen gegeben") Verben, wobei das Verb die Aktion (Beziehung) ist, die auf zwei Objekte wirkt, um ein Ergebnis/eine Aktion zu erzeugen. Der Fokus liegt auf der Aktion, und die zwei (oder drei) [grammatikalischen] Objekte haben die gleiche Bedeutung.

Der Fokus auf OOD liegt immer auf Aktionen, bei denen Aktionen das Verhalten von Objekten sind. Objekte sind nichts ohne ihr Verhalten. Die einzige Objektbeschränkung von OOD ist, dass alles von etwas getan werden muss.

Ich sehe den Handelnden nicht als wichtiger an als das, was etwas damit zu tun hat.

Aber warum Menschen mit solch trivialen Entscheidungen ohne betriebliche Konsequenzen belasten, wenn man wirklich Show meint (terminalWindow, someText)?

Für mich ist das dasselbe mit einer anderen Notation. Sie müssen sich noch entscheiden, wer der Shower und wer der Show-ee ist. Sobald Sie das wissen, gibt es keine Entscheidung in OOD. Windows Text anzeigen -> Window.Show (Text).

Viele Dinge da draußen (insbesondere im Legacy-Bereich) sagen, es sei OO, wenn dies nicht der Fall ist. Zum Beispiel gibt es eine große Menge an C++ - Code, der keine OOD-Figur implementiert.

OOD ist einfach, wenn Sie aus der Denkweise ausbrechen, dass Sie ein Problem für Computer lösen. Sie lösen Probleme für Dinge, die Dinge tun.

10
Matt Ellen

Vielleicht kann ich den Punkt nicht verstehen, aber:

Als ich das erste Buch über OOP (Anfang der 90er Jahre, Borlands dünnes Handbuch für Pascal) las, war ich einfach erstaunt über seine Einfachheit und sein Potenzial. (Vorher hatte ich Cobol, Fortran, Assemblersprache und andere verwendet prähistorisches Zeug.)

Für mich ist es ziemlich klar: Ein Hund ist ein Tier, ein Tier muss essen, mein Hund ist ein Hund, also muss er essen ...

Auf der anderen Seite ist die Programmierung selbst von Natur aus unnatürlich (d. H. Künstlich). Die menschliche Sprache ist künstlich (beschuldigen Sie mich nicht, wir haben alle unsere Sprachen von anderen gelernt, niemand kennt die Person, die Englisch erfunden hat). Nach Ansicht einiger Wissenschaftler wird der Geist des Menschen durch die Sprache geformt, die er zuerst gelernt hat.

Ich gebe zu, einige Konstrukte in modernen OO-Sprachen sind etwas umständlich, aber es ist die Evolution.

7
Nerevar

Eine Sache, die es mir schwer machte, war zu denken, dass OOP] die Welt modellieren sollte. Ich dachte, wenn ich das nicht richtig verstehe, könnte etwas kommen und mich in den Arsch beißen (a Die Sache ist entweder wahr oder nicht wahr. Ich war mir der Probleme sehr bewusst, dass das Vorgeben, alles sei ein Objekt oder eine Entität. Dies machte mich sehr vorsichtig und unterbewusst in Bezug auf die Programmierung in OOP.

Dann las ich SICP und kam zu einem neuen Verständnis, dass es wirklich um Datentypen und die Kontrolle des Zugriffs auf diese ging. Alle Probleme, die ich weggeschmolzen hatte, weil sie auf einer falschen Prämisse beruhten, dass Sie in OOP] die Welt modellieren.

Ich staune immer noch über die immense Schwierigkeit, die mir diese falsche Prämisse bereitete (und wie ich mich dazu verpflichten ließ).

6
Pinochle

Wir (oder zumindest ich) konzipieren die Welt in Bezug auf Beziehungen zwischen Dingen, denen wir begegnen, aber der Fokus von OOP) liegt auf der Gestaltung einzelner Klassen und ihrer Hierarchien.

Sie gehen von (IMO) einer falschen Prämisse aus. Die Beziehungen zwischen Objekten sind wohl wichtiger als die Objekte selbst. Es sind die Beziehungen, die eine objektorientierte Programmstruktur ergeben. Vererbung, die Beziehung zwischen Klassen, ist natürlich wichtig, da die Klasse eines Objekts bestimmt, was dieses Objekt kann tut. Aber es sind die Beziehungen zwischen einzelnen Objekten, die bestimmen, was ein Objekt tatsächlich tut innerhalb der von der Klasse definierten Grenzen und daher wie sich das Programm verhält.

Das objektorientierte Paradigma kann zunächst schwierig sein, nicht weil es schwierig ist, sich neue Kategorien von Objekten auszudenken, sondern weil es schwierig ist, sich ein Diagramm von Objekten vorzustellen und zu verstehen, wie die Beziehungen zwischen ihnen aussehen sollten, insbesondere wenn Sie keine haben Weg, um diese Beziehungen zu beschreiben. Aus diesem Grund sind Entwurfsmuster so nützlich. Bei Entwurfsmustern geht es fast ausschließlich um die Beziehungen zwischen Objekten. Muster geben uns sowohl die Bausteine, mit denen wir Objektbeziehungen auf einer höheren Ebene entwerfen können, als auch eine Sprache, mit der wir diese Beziehungen beschreiben können.

Gleiches gilt für kreative Bereiche, die in der physischen Welt funktionieren. Jeder konnte ein paar Räume zusammenwerfen und es ein Gebäude nennen. Die Zimmer sind möglicherweise sogar komplett mit den neuesten Ausstattungen ausgestattet, aber das macht das Gebäude nicht funktionsfähig. Die Aufgabe eines Architekten besteht darin, die Beziehungen zwischen diesen Räumen in Bezug auf die Anforderungen der Personen, die diese Räume nutzen, und die Umgebung des Gebäudes zu optimieren. Wenn diese Beziehungen richtig sind, funktioniert ein Gebäude sowohl aus funktionaler als auch aus ästhetischer Sicht.

Wenn Sie Probleme haben, sich an OOP zu gewöhnen, empfehlen wir Ihnen, mehr darüber nachzudenken, wie Ihre Objekte zusammenpassen und wie ihre Verantwortlichkeiten angeordnet sind. Wenn Sie dies noch nicht getan haben, lesen Sie über Entwurfsmuster - Sie werden wahrscheinlich feststellen, dass Sie die Muster, über die Sie gelesen haben, bereits gesehen haben. Wenn Sie ihnen jedoch Namen geben, können Sie nicht nur Bäume, sondern auch Stände, Gehölze, Dickichte usw. sehen. Wälder, Haine, Waldstücke und schließlich Wälder.

4
Caleb

Ja, OOP selbst ist sehr unnatürlich - die reale Welt besteht nicht nur aus hierarchischen Taxonomien. Einige kleine Teile davon bestehen aus diesem Zeug, und diese Teile sind die einzigen Dinge, die angemessen sein könnten ausgedrückt in OO. Der Rest kann natürlich nicht in eine so triviale und begrenzte Denkweise passen. Sehen Sie sich die Naturwissenschaften an, sehen Sie, wie viele verschiedene mathematische Sprachen erfunden wurden, um sie auf einfachste oder zumindest verständliche Weise auszudrücken Art und Weise die Komplexität der realen Welt. Und fast keine von ihnen kann leicht in eine Sprache der Objekte und Nachrichten übersetzt werden.

4
SK-logic

BEARBEITET

Zunächst möchte ich sagen, dass ich OOP] nie oder schwerer als andere Programmierparadigmen gefunden habe. Die Programmierung ist von Natur aus schwierig, weil sie versucht, Probleme aus der realen Welt und der realen Welt zu lösen extrem komplex. Andererseits habe ich mich beim Lesen dieser Frage gefragt: Ist OOP "natürlicher" als andere Paradigmen? Und daher effektiver?

Ich habe einmal einen Artikel über eine vergleichende Studie zwischen imperativer Programmierung (IP) und objektorientierter Programmierung (OOP) gefunden (ich wünschte, ich könnte ihn wiederfinden, damit ich ihn als Referenz veröffentlichen könnte). Sie hatten im Grunde genommen die Produktivität professioneller Programmierer mit IP und OOP in verschiedenen Projekten) gemessen, und das Ergebnis war, dass sie keine großen Unterschiede gesehen hatten. Die Behauptung war also, dass es keinen großen Unterschied gab Produktivität zwischen den beiden Gruppen, und was wirklich zählt, ist Erfahrung.

Auf der anderen Seite behaupten Befürworter der Objektorientierung, dass während der frühen Entwicklung eines Systems OOP sogar mehr Zeit als unbedingt erforderlich sein kann, der Code auf lange Sicht einfacher zu warten ist und verlängern aufgrund der engen Integration zwischen Daten und Operationen.

Ich habe hauptsächlich mit OOP Sprachen) (C++, Java) gearbeitet, aber ich habe oft das Gefühl, dass ich mit Pascal oder Ada genauso produktiv sein könnte, obwohl ich sie nie für große Projekte ausprobiert habe.

Vergleichen Sie dies mit OOP, wo Sie zuerst ein Objekt (Substantiv) finden und ihm sagen müssen, dass es eine Aktion für ein anderes Objekt ausführen soll.

[cut]

Ich würde daher argumentieren, dass die gängige Vorgehensweise OOP (klassenbasiert, Einzelversand)) schwierig ist, weil sie IS UNNATURAL und nicht dem entspricht, wie Menschen denken über die Welt nach. Generische Methoden von CLOS sind meiner Denkweise näher, aber leider ist dies kein weit verbreiteter Ansatz.

Als ich diesen letzten Absatz genauer las, verstand ich endlich den Hauptpunkt Ihrer Frage und musste meine Antwort von Grund auf neu schreiben. :-)

Ich kenne andere OO Vorschläge, bei denen mehrere Objekte eine Nachricht anstelle von nur einem erhalten, dh mehrere Objekte spielen beim Empfang einer Nachricht eine symmetrische Rolle. JA, dies scheint allgemeiner und möglicherweise natürlicher zu sein ( weniger restriktiv) OOP nähere dich mir.

Andererseits kann "Mehrfachversand" einfach mit "Einzelversand" simuliert werden, und "Einzelversand" ist einfacher zu implementieren. Vielleicht ist dies ein Grund, warum "Mehrfachversand" nicht zum Mainstream geworden ist.

3
Giorgio

OOP ist nicht schwer. Was es schwierig macht, gut zu verwenden, ist ein flaches Verständnis dessen, wofür es gut ist, wo Programmierer zufällige Maximen hören und sie vor sich hin wiederholen, um den Segen der göttlichen Viererbande, des gesegneten Martin Fowler oder zu erhalten wen auch immer sie sonst gelesen haben.

3
Marcin

Dies ist nur ein Teil dessen, was mit OOP nicht stimmt.

Im Wesentlichen werden Funktionen zu Bürgern zweiter Klasse, und das ist schlecht.

Moderne Sprachen (Ruby/Python) leiden nicht unter diesem Problem und bieten Funktionen als erstklassige Objekte sowie die Möglichkeit, Programme zu erstellen, ohne eine Klassenhierarchie aufzubauen.

3
hasen

Hören Sie auf, nach einem exklusiven Paradigma zu suchen OOP] und probieren Sie JavaScript an.

Ich habe derzeit ein Schema ausgearbeitet, in dem meine UI-Objekte unter einer ereignisgesteuerten Schnittstelle ausgeführt werden. Das heißt, ich habe eine typische öffentliche Methode, die beim Auslösen zu einer intern definierten Aktion führt. Aber wenn es ausgelöst wird, passiert wirklich, dass ich ein Ereignis für das Objekt selbst auslöse und ein vordefinierter Handler in diesem Objekt antwortet. Dieses Ereignis und das Ereignisobjekt, an das Sie Eigenschaften anhängen können, die an einen anderen Listener übergeben werden, können von allen Personen gehört werden, die sie abhören möchten. Sie können das Objekt direkt oder allgemein auf diesen Ereignistyp abhören (Ereignisse werden auch für ein generisches Objekt ausgelöst, das alle von der Factory erstellten Objekte abhören können). So habe ich jetzt zum Beispiel ein Kombinationsfeld, in dem Sie ein neues Element aus der Dropdown-Liste auswählen. Die ComboBox weiß, was zu tun ist, um ihren eigenen Anzeigewert festzulegen und den Server bei Bedarf zu aktualisieren. Ich kann jedoch auch so viele andere Kombinationsfelder verwenden, wie ich abhören möchte, um ihre Auswahllisten auszutauschen, die an den aktuellen Wert von gebunden sind das erste Kombinationsfeld.

Wenn Sie möchten (und ich war überrascht zu entdecken, dass ich normalerweise nicht möchte - es ist ein Lesbarkeitsproblem, wenn Sie nicht sehen können, woher das Ereignis kommt), können Sie eine vollständige Objektentkopplung durchführen und den Kontext über ein übergebenes Ereignisobjekt herstellen. Unabhängig davon weichen Sie dem Einzelversand immer noch aus, indem Sie mehrere Antwortende registrieren können.

Aber ich mache das nicht mit OOP allein und JS ist nicht einmal 'richtig' OOP nach einigen Definitionen, die ich komisch finde. Richtig, für die Meiner Meinung nach besteht ein höheres Maß an App-Entwicklung darin, das Paradigma an das anzupassen, was für Ihre Situation geeignet ist, und wir können Klassen problemlos emulieren, wenn es uns wichtig ist. In diesem Fall mische ich jedoch Aspekte funktionaler (übergebender Handler) herum) mit OOP.

Noch wichtiger ist, dass sich das, was ich habe, ziemlich mächtig anfühlt. Ich denke nicht an ein Objekt, das auf ein anderes einwirkt. Ich entscheide im Grunde genommen, worum es den Objekten geht, gebe ihnen die Werkzeuge, die sie zum Sortieren benötigen, und lasse sie einfach in einen Mixer fallen und lasse sie aufeinander reagieren.

Ich denke also, was ich sage, ist Folgendes: Es ist kein Problem mit einer switch-Anweisung. Es ist Mix and Match. Das Problem sind Sprachen und Moden, die wollen, dass Sie glauben, es sei eine Sache über alles. Wie kann ein Junior Java dev zum Beispiel OOP) wirklich schätzen, wenn er denkt, dass er es standardmäßig immer richtig macht?

3
Erik Reppen

Ich denke, einige der Schwierigkeiten treten auf, wenn Leute versuchen, OOP) zu verwenden, um die Realität darzustellen. Jeder weiß dass ein Auto vier Räder und einen Motor hat. Jeder weiß, dass Autos Start(), Move() und SoundHorn() können.

Ein Licht ging in meinem Kopf an, als mir klar wurde, dass ich aufhören sollte, dies die ganze Zeit zu versuchen. Ein Objekt ist nicht das, mit dem es einen Namen teilt. Ein Objekt ist (d. H. Sollte es sein) eine ausreichend detaillierte Partition von Daten, die für den Umfang des Problems relevant sind. Es ist ought, genau das zu haben, was die Lösung des Problems benötigt, nicht mehr und nicht weniger. Wenn ein Objekt, das für ein bestimmtes Verhalten verantwortlich ist, dazu führt, dass mehr Codezeilen als dasselbe Verhalten die Aufgabe eines nebulösen Dritten sind (manche nennen es einen „Poltergeist“), verdient der Poltergeist seine Chips.

2
Tom W

Die Art und Weise, wie es mir erklärt wurde, war mit einem Toaster und einem Auto. Beide haben Federn, also hätten Sie ein "Feder" -Objekt und sie hätten unterschiedliche Größen, Stärken und was auch immer, aber beide wären "Federn" und würden diese Metapher dann auf das Auto ausweiten, wenn Sie viele Räder hätten (Räder natürlich plus Lenkrad usw.) und das machte sehr viel Sinn.

Sie können sich das Programm dann als eine Liste von Objekten vorstellen, und es ist viel einfacher zu visualisieren als "Es ist eine Liste von Dingen, die Dinge tun, also ist es nicht wie die Liste von Anweisungen, die Sie zuvor gesehen haben".

Ich denke, das eigentliche Problem mit OOP ist, wie es den Leuten erklärt wird. Oft (in meinen Uni-Klassen) sehe ich es erklärt, indem ich sage: "Es geht um viele Klassen, die kleine Dinge tun, und Sie kann daraus Objekte schaffen "und das alles verwirrt viele Menschen, weil es im Wesentlichen abstrakte Begriffe verwendet, um diese Konzepte zu erklären, anstatt konkrete Ideen, die die Menschen verstanden haben, als sie 5 Jahre alt waren und mit Lego spielten.

2
Trezoid

Es ist die natürliche Art, durch Kategorisierung an die Welt zu denken. Das ist mehr oder weniger das, worum es bei OO] geht. OOP ist schwierig, weil die Programmierung schwierig ist.

Nein. Es gibt verschiedene Möglichkeiten, ein Problem mithilfe der Programmierung zu lösen: funktional, prozedural, logisch, O.O.P., andere.

In der realen Welt verwenden Menschen manchmal das funktionale Paradigma, und manchmal verwenden wir das prozedurale Paradigma und so weiter. Und manchmal haben wir uns verwechselt. Und schließlich repräsentieren wir sie als einen bestimmten Stil oder ein bestimmtes Paradigma der Programmierung.

Es gibt auch das in LISP verwendete Paradigma "Alles ist eine Liste oder ein Element". Ich möchte etwas anderes als die funktionale Programmierung erwähnen. PHP verwendet dies in assoziativen Arrays.

O.O.P. und "Alles ist eine Liste oder ein Gegenstand" -Paradigmen werden als zwei der MEHR NATÜRLICHEN Programmierstile betrachtet, wie ich mich in einigen Klassen für künstliche Intelligenz erinnere.

Klingt für mich komisch, "O.O.P. ist nicht natürlich", vielleicht so, wie Sie lernen oder wie Sie über O.O.P. unterrichtet wurden. ist falsch, aber nicht O.O.P. selbst.

1
umlcat

Ich denke, die Sprachen OOP und OOP) haben auch Probleme.

Wenn Sie es richtig verstehen, handelt es sich bei OOP] um Blackboxen (Objekte), auf denen Drucktasten gedrückt werden können (Methoden). Klassen sind nur dazu da, diese Blackboxen zu organisieren.

Ein Problem ist, wenn der Programmierer die Drucktasten auf das falsche Objekt legt. Das Terminal kann keinen Text auf sich selbst anzeigen, der Text kann sich nicht auf dem Terminal anzeigen. Die Fenstermanager-Komponente des Betriebssystems, die dies kann. Terminalfenster und Text sind nur eine passive Einheit. Aber wenn wir so denken, erkennen wir, dass die meisten Entitäten passive Dinge sind und wir nur sehr wenige Objekte haben, die tatsächlich etwas tun (oder einfach nur eines: der Computer). Wenn Sie C verwenden, organisieren Sie es in Modulen. Diese Module repräsentieren die wenigen Objekte.

Ein weiterer Punkt ist, dass der Computer führt Anweisungen nur nacheinander aus. Nehmen wir an, Sie haben ein VCR und ein Television Objekt. Wie würden Sie Videos abspielen? Sie schreiben wahrscheinlich so etwas:

connect(television, vcr);
vcr.turnOn();
television.turnOn();
insert(vcr, yourFavoriteCasette);
vcr.play();
while (vcr.isPlaying()) {} // Wait while the VCR is playing the casette.
vcr.eject();
vcr.turnOff();
television.turnOff();

Dies wäre so einfach, aber dafür würden Sie mindestens 3 Prozessoren (oder Prozesse) benötigen: Einer spielt die Rolle von Ihnen, der zweite ist der Videorecorder, der dritte ist der Fernseher. Aber normalerweise haben Sie nur einen Kern (zumindest nicht genug für alle Ihre Objekte). Im College haben viele meiner Klassenkameraden nicht verstanden, warum die GUI einfriert, wenn ein Druckknopf eine teure Operation ausführt.

Ich denke, ein objektorientiertes Design kann die Welt recht gut beschreiben, aber es ist nicht die beste Abstraktion für den Computer.

1
Calmarius

Um die Komplexität zu verwalten, müssen wir die Funktionalität in Module gruppieren, und dies ist im Allgemeinen ein schwieriges Problem. Es ist wie das alte Sprichwort über den Kapitalismus: OOP ist das schlechteste System zum Organisieren von Software da draußen, außer für alles andere, was wir versucht haben.

Der Grund, warum wir Interaktionen innerhalb der Substantive gruppieren, obwohl häufig Unklarheiten darüber bestehen, mit welchem ​​der beiden Substantive sie gruppiert werden sollen, besteht darin, dass die Anzahl der Substantive zufällig in überschaubare Größenklassen eingeht, während die Gruppierung nach Verben dazu neigt, entweder zu produzieren sehr kleine Gruppen wie Einzelstücke oder sehr große Gruppen für eine Funktion wie show. Wiederverwendungskonzepte wie Vererbung funktionieren auch beim Gruppieren nach Substantiven viel einfacher.

Auch die Frage, ob show mit dem Fenster oder dem Text gesetzt werden soll, ist in der Praxis fast immer viel klarer als in der Theorie. Zum Beispiel gruppieren fast alle GUI-Toolkits add mit dem Container, aber show mit dem Widget. Wenn Sie versuchen, Code in die andere Richtung zu schreiben, wird der Grund ziemlich schnell offensichtlich, obwohl die beiden Methoden abstrakt erscheinen, wenn Sie abstrakt darüber nachdenken.

1
Karl Bielefeldt

Wie/warum kam es angesichts dieser Probleme dazu, dass die derzeit gängige Vorgehensweise OOP so populär wurde? Und was, wenn überhaupt, kann getan werden, um sie zu entthronen?

OOP wurde populär, weil es Tools bietet, mit denen Sie Ihr Programm auf einer höheren Abstraktionsebene organisieren können als die populären prozeduralen Sprachen, die ihm vorausgingen. Es war auch relativ einfach, eine Sprache zu erstellen, die eine prozedurale Struktur innerhalb der Methoden und eine objektorientierte Struktur um sie herum hatte. Auf diese Weise konnten Programmierer, die bereits wussten, wie man prozedural programmiert, nacheinander OO Prinzipien) aufgreifen. Dies führte auch zu vielen OO-in-name-only-Programmen, die prozedurale Programme waren, die in eine Klasse eingeschlossen waren oder zwei.

Um OO zu entthronen, erstellen Sie eine Sprache, die es einfach macht, schrittweise von dem, was die meisten Programmierer heute wissen (meistens prozedural, mit ein wenig OO), zu Ihrem bevorzugten Paradigma überzugehen. Stellen Sie sicher, dass es praktische APIs für allgemeine Aufgaben bietet, und bewerben Sie es gut. Die Leute werden bald X-in-Name-Programme in Ihrer Sprache erstellen. Dann kann man erwarten, dass es Jahre und Jahre dauern wird, bis die Leute gut darin sind, X zu machen.

1
Sean McMillan

Schauen Sie sich DCI (Daten, Kontext und Interaktion) an, das vom Erfinder des MVC-Musters erfunden wurde.

Das Ziel von DCI ist (zitiert aus Wikipedia):

  • Geben Sie Systemverhalten erstklassigen Status über Objekten (Substantiven).
  • Um Code für sich schnell änderndes Systemverhalten (was das System tut) sauber von Code für sich langsam änderndes Domänenwissen (was das System ist) zu trennen, anstatt beide in einer Klassenschnittstelle zu kombinieren.
  • Unterstützung eines Objekt-Denkstils, der den mentalen Modellen der Menschen nahe kommt, und nicht dem Klassen-Denkstil.

Hier ist ein guter Artikel der Autoren und hier ist ein kleine Beispielimplementierung (.NET) , wenn Sie Code sehen möchten. Es ist viel einfacher als es sich anhört und fühlt sich sehr natürlich an.

0
Sire

Man kann oft hören, dass OOP natürlich der Art entspricht, wie Menschen über die Welt denken. Aber ich würde dieser Aussage stark widersprechen (...)

Da es seit Jahrzehnten in Büchern und anderswo evangelisiert wird, bin ich auch anderer Meinung. Trotzdem denke ich, dass Nygaard und Dahl es so ausgedrückt haben, und ich denke, sie haben sich darauf konzentriert, wie einfacher es war, über das Entwerfen von Simulationen im Vergleich zu den Alternativen der Zeit nachzudenken.

(...) aber der Fokus von OOP liegt auf dem Entwerfen einzelner Klassen und ihrer Hierarchien.

Diese Behauptung betritt ein vernünftiges Gebiet, wenn man bedenkt, wie weit verbreitet Missverständnisse von OOP] sind und wie sensibel OO] für die Definition ist. Ich habe mehr als zehn Jahre Erfahrung auf diesem Gebiet Ich kann Ihnen sagen, dass ich viele Jahre damit verbracht habe, "Mainstream OO" zu verlernen, weil ich bemerkte, wie unterschiedlich (und minderwertig) es von dem ist, was die früheren Schöpfer anstrebten. Aktuelle Behandlung des Themas Ich möchte auf die jüngsten Bemühungen von W. Cook verweisen:

"Ein Vorschlag für vereinfachte, moderne Definitionen von" Objekt "und" Objektorientiert " http://wcook.blogspot.com.br/2012/07/proposal-for-simplified-modern.html

Wie/warum kam es angesichts dieser Probleme dazu, dass die derzeit gängige Vorgehensweise OOP) so populär wurde?

Vielleicht der gleiche Grund QWERTY Tastaturen wurden populär oder der gleiche Grund, warum das DOS-Betriebssystem populär wurde. Die Dinge werden trotz ihrer Eigenschaften nur mit populären Fahrzeugen gefahren und werden selbst populär. Und manchmal auch ähnliche, aber schlechtere Versionen von etwas werden als die eigentliche Sache angesehen.

Und was kann, wenn überhaupt, getan werden, um es zu entthronen?

Schreiben Sie ein Programm mit einem überlegenen Ansatz. Schreiben Sie dasselbe Programm mit einem OO -Ansatz. Zeigen Sie, dass Ersteres in allen wichtigen Aspekten bessere Eigenschaften als Letzteres aufweist (sowohl Eigenschaften des Systems selbst als auch technische Eigenschaften). Zeigen Sie, dass das Programm ausgewählt wurde ist relevant und der vorgeschlagene Ansatz erhält die hohe Qualität der Eigenschaften aufrecht, wenn er auf andere Arten von Programmen angewendet wird. Seien Sie bei Ihrer Analyse streng und verwenden Sie bei Bedarf präzise und akzeptierte Definitionen.

Teilen Sie uns abschließend Ihre Erkenntnisse mit.

0
Thiago Silva