Felix Riesterer: Manöverkritik zu Einsteiger-Tutorial OOP in JS

Beitrag lesen

problematische Seite

Lieber Rolf,

ich merke, dass hier ein Fachmann mit Jahren an Erfahrung mit JavaScript spricht. Daher siehst Du die ganzen Aspekte des Themas in einem völlig anderen Licht, als ein Anfänger.

Ich erlebe immer wieder in Diskussionen über meine Anfänger-Tutorials, wie man meine Vereinfachung (didaktische Reduktion) als problematisch diskutiert. Das merke ich indirekt bei Dir daran, dass Du mit der prototypischen Objektorientierung argumentierst. Wenn man einen Anfänger aber an Objektorientierung heranführen will, sollte der doch möglichst bald die class-Syntax verwenden, findest Du nicht? Vor allem, wenn er auch noch mit PHP experimentiert, wo es die fast identische Schreibweise ja auch gibt! Und wie kommt man am schnellsten zu dieser Syntax?

Ich habe schon eine Weile überlegt, ob ich die Sache mit der prototypischen Wirklichkeit hinter der class-Syntax in ein nachgelagertes Kapitel einbringen will. Aber was soll ein Anfänger damit? Und oft kommen die hier im Forum mit gecopy-pastetem Code, wo man fragen muss, wo sie den her haben, weil er vielleicht noch ältere Konzepte in sich trägt, weshalb ich dachte, die Sache mit den Funktionen als Konstruktoren ohne class-Syntax unbedingt mit einfließen zu lassen - ohne Prototypen-Kette.

Den Einstieg finde ich allerdings... befremdlich. Du möchtest OOP erklären und fängst damit an, dass Funktionen Objekte sind und man sie als Parameter übergeben kann.

Anfänger hantieren erstaunlich früh mit Funktionen. Das kennen sie. Dass man die als Objekte verstehen kann, ohne ein genaues Verständnis davon zu haben, was Objekte in JavaScript überhaupt sind, wird wenigstens dadurch erreicht, dass man sie als Parameter übergeben kann. In PHP war das z.B. lange nicht möglich, da musste man allen Ernstes den Funktionsnamen als String übergeben, aber in JavaScript ist das schon seit Urzeiten möglich. Das hat mich als Anfänger damals sehr verblüfft, dass das in JS "so einfach" ging und in PHP (Version 4.x) nicht.

Ist das ein guter Einstieg? Bisher hast Du mehr auch noch nicht online - oder finde ich das nur nicht?

Woran bemisst Du "gut"? Für den Anfänger ist wichtig, dass er das Geschriebene nachvollziehen kann. Und wenn ich noch überhaupt nicht weiß, was ein Objekt eigentlich ist, dann ist das zumindest etwas Praktikables für ein erstes Beispiel. Und es dient auch dem Zweck, das Hinzufügen von Methoden von der Schreibweise her vorzuentlasten.

Sollte man nicht erstmal formal erklären, was die Idee eines Objekts ist?

Das ist die uralte und hier immer wieder neu aufflammende Frage, wie man einen Anfänger am besten da abholt, wo er steht. Mein Ansatz ist da jedes Mal der, dass ich mit etwas beginne, womit der Anfänger einigermaßen schon vertraut ist, um es zu entwickeln und in neue Zusammenhänge zu setzen.

Aber es mag auch andere Lerntypen geben, die gerne erst eine theoretische Betrachtung haben wollen. Das ist auch in Ordnung. Die dürfen dann zu Orlok gehen. Der macht das super.

Ich denke mit Schaudern an den Baby-Vorbereitungskurs, bei dem wir angehenden Eltern über sechs Zeitstunden lang (nein, kein Scherz, leider nicht!) mit Infos vollgepumpt wurden ehe wir an einer Baby-Puppe das Wickeln üben durften. So gehe ich nicht vor und empfehle es auch niemand anderem.

Die Frage "Was ist eigentlich ein Objekt?" stelle ich auf der Einführungsseite. Nicht gleich als erstes, aber ich stelle sie. Danach geht es dann zu Eigenschaften und Methoden.

Die Begriffe "Eigenschaft" und "Methode" einführen? Nicht in aller Ausführlichkeit und mit allen JS-Besonderheiten, aber die Konzepte sollte man erklären.

Da fand ich das Beispiel anhand von komplexen Datentypen ganz zielführend. Du nicht? Eine Geo-Koordinate hat... zwei Eigenschaften.

Ich hatte damit mal begonnen, bin aber stecken geblieben und mein Text erklärt auch zu viel für ein Einstiegstutorial.

Ich habe es mir angesehen und stimme Dir zu. Die Sache mit den Voraussetzungen, damit man mit dem Punktoperator arbeiten kann, finde ich prinzipiell sehr gut und wichtig, aber ab wann kommt ein Anfänger bei den gegebenen Beispielen auf die Idee, einen Namen für eine Eigenschaft mit Leer- oder Sonderzeichen zu schreiben? In dem Fall ist man meiner Meinung nach schon wieder jenseits eines reinen Anfänger-Tutorials.

Vielleicht nützt er Dir etwas. Vielleicht ist er didaktisch auch untauglich.

Für mich als ewig Lernenden nützt er auf jeden Fall! Dafür vielen Dank! Als Ideengrube für mein Tutorial finde ich ihn zu ausführlich. Er geht in Richtung eierlegende Wollmilchsau. Das versuche ich zu vermeiden.

Danach könnte man auf in JS eingebaute Objekte eingehen. Aber nicht Function, das ist zu abstrakt.

Hehe. Auf in JavaScript eingebaute Objekte gehe ich absichtlich nicht ein, weil das den Rahmen sprengen würde. Die Sache mit function habe ich ja oben schon erläutert.

Lieber String und Number.

Ah! Auf primitives bin ich auch absichtlich (noch?) nicht eingegangen. Das wäre in der Tat ein Feld, das dem Artikel bisher fehlt.

Als nächstes kann man eigene Objekte erzeugen. Aber nicht mit class oder new Foo(), sondern als Literal, so wie im Objekte-Exkurs des JS-Anfangstutorials.

Das kommt meiner Meinung nach darauf an, was man damit erreichen möchte. Daher habe ich auch die Hinweise ergänzt, wann man besser welche Schreibweise nimmt. {} eignet sich meiner Meinung nach besser für Singletons. Will ich mehrere Instanzen haben, lohnt eine Klasse. Für mein Projekt, in dem ich eine PWA baue, verwende ich selbst für den Client eine class, obwohl der ein Singleton ist.

Bei der Gelegenheit bietet es sich an, die Objektnatur von Funktionen zu beschreiben und zu erklären, dass Methoden nichts weiter sind als Eigenschaften, deren Wert eine Funktion ist.

Warum nennt man sie dann so? Aber ja, "Eigenschaften, deren Wert eine Funktion ist" finde ich sehr gut! Das sollte ich so übernehmen.

Und nachdem das alles bekannt ist, könnte man das class-Schlüsselwort als Syntaxzucker für all das beschreiben.

Geht das nicht ein bisschen in die Richtung: Also den USB-Stick darfst Du erst verwenden, wenn Du mit der 5¼"-Floppy das Abspeichern (unter DOS versteht sich!) gelernt hast.

Ich bin ja froh, dass es endlich diese class-Syntax gibt! Und was spricht gegen ihre sofortige Verwendung? Wo sind die Fallstricke für den Programmierer, wenn er sich dabei der Prototypen-Kette nicht bewusst ist?

Und dann geht's an das Eingemachte: Vererbung. Klassenvererbung vs Prototypvererbung. Was tut super() eigentlich, wenn man es im Konstruktor aufruft? Überschriebene Methoden. Der Unterschied - in der Klassenwelt - zwischen normalen und virtuellen Methoden, und der Umstand, dass in JS alle Methoden virtuell sind.

Da kenne ich mich selbst noch zu wenig aus. Da lerne ich auch erst noch dazu. Mir ist klar, dass jede Klasse eine Konstruktor-Methode haben muss. Und mir ist auch klar, dass eine erbende Klasse ihre eigene Konstruktor-Methode definieren kann, was die Frage aufwirft, was aus der Konstruktor-Methode der Elternklasse wird, wenn ein Objekt neu instanziiert wird. Dazu komme ich vielleicht auch irgendwann. Mit der Prototypen-Kette habe ich auch Jahre gebraucht, bis ich mich einigermaßen sicher genug gefühlt hatte, dieses Konzept tatkräftig anzugehen.

Und dann die OOP-Welt. Modellierung, Beziehungen (Vererbung, Assoziation, Aggregation), einfache Patterns, Delegation, Polymorphie. Das kann aber nur ein Ausblick sein, hier muss man wohl auf die Literatur verweisen.

Dein Ehrgeiz gefällt mir! :-)

Liebe Grüße

Felix Riesterer