Rolf B: Manöverkritik zu Einsteiger-Tutorial OOP in JS

Beitrag lesen

problematische Seite

Hallo Felix,

ich find's gut, dass Du da ran willst.

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.

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

Sollte man nicht erstmal formal erklären, was die Idee eines Objekts ist? Die Begriffe "Eigenschaft" und "Methode" einführen? Nicht in aller Ausführlichkeit und mit allen JS-Besonderheiten, aber die Konzepte sollte man erklären. Ich hatte damit mal begonnen, bin aber stecken geblieben und mein Text erklärt auch zu viel für ein Einstiegstutorial. Vielleicht nützt er Dir etwas. Vielleicht ist er didaktisch auch untauglich.

Danach könnte man auf in JS eingebaute Objekte eingehen. Aber nicht Function, das ist zu abstrakt. Lieber String und Number. Da kann man ein paar Eigenschaften und Methoden vorstellen. Man könnte auch "Objekt", "Eigenschaft" und "Methode" an Hand von Strings einführen. length ist eine Eigenschaft des Strings. Und ich würde in diesem Moment noch lügen und erklären, dass substr eine Methode des Strings sei. Dass "Hallo Welt" die substr-Methode über die Prototypenkette aus dem String.prototype Objekt übernimmt, ist jetzt noch zu kompliziert. Man kann andeuten, dass die Wahrheit komplizierter ist, aber noch nicht drauf eingehen.

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. 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. Was die Erwähnung von this nach sich zieht - aber mit Bedacht, Closures machen den Leser jetzt noch verrückt. Man kann die alte und neue Syntax beschreiben, die in einem Objektliteral eine Methode bereitstellt. Man kann getter und setter (mit der neuen Syntax) vorstellen. Was es in dem Zusammenhang mit Property-Descriptoren auf sich hat, was der Unterschied zwischen data- und accessor-descriptors ist, das kann man in einem Extrakapitel für besonders Interessierte hintenanstellen. Und was ist mit Klassen? Nix!

Und dann kann man erklären, was ein Prototyp ist, wie die Prototypenvererbung funktioniert und zeigen, wie man mit Object.create einem Objekt einen Prototypen gibt. Klassen? Nada!

Als nächstes kann man auf das Konzept der Konstruktorfunktion mit ihrem prototype-Property eingehen. Man kann erklären, dass hiermit das aus anderen Sprachen bekannte Klassenkonzept nachgebildet werden kann, und sollte den Begriff der Klasse vielleicht auch etwas genauer erläutern, um ihn vom Prototypen abzugrenzen.

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

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.

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.

Man muss auch schauen, wo sich das Tutorial von den Texten unter "Umgang mit Objekten" abgrenzt. Wo man bewusst zu wenig erklärt und auf weiterführende Abschnitte an anderen Stellen verweist.

Rolf

--
sumpsi - posui - obstruxi