2021-12-02 digital life Warum Objektorientierung Quatsch ist Ein einziges Desaster Die Objektorientierung ist so gaengig in der Programmierung seit zwei Jahrzehnten, dass sie kaum in Frage gestellt wird. Als Ideo- logie wurde sie gerade im Rahmen von Java in die Welt gepumpt -- unhinterfragt. Dabei ist der Quatsch eigentlich offensichtlich. Man nimmt ihn nur nicht wahr wenn man nichts anderes kennt. Bei einer ueblichen Programmieranfaengersprache, als die Java eingesetzt worden ist und noch wird, hat man lauter unwissende Personen vor sich, die man einfach indoktrinieren kann: ``Das ist der Weg! Das muss so sein! Nicht fragen! Einfach so machen!'' Ich dachte immer, dass das Problem die haarstraeubend schlechte Objektorientierung von Java sei, denn wenn man z.B. bei Ruby mal gesehen hat wie Objektorientierung auch sein kann, dann kann man das Faustkeilartige der Java-OO kaum noch fassen. Dabei liegt das Problem woanders. Es ist so einfach wenn man erst darauf gestos- sen ist. Zunaechst -- als Kontext und Vergleich -- folgender Go-Code, der einen vollwertigen Echo-Webserver darstellt: package main import ( "fmt" "net/http" ) func main() { http.ListenAndServe("localhost:8080", http.HandlerFunc(hello)) } func hello(w http.ResponseWriter, req *http.Request) { fmt.Fprintf(w, "hello, world\n") } Dieses Beispiel entstammt einem Vortrag von Rob Pike. [0] Es ist fast gleich auch im Buch ``The Go Programming Language'' von Donovan und Kernighan enthalten. (Diese Netzwerkabstraktion, also mit Printf() direkt ueber das Netzwerk schreiben zu koennen ist ganz im Plan9-Stil. Vgl. [1] ) Und nun folgender Java-Code, ebenfalls aus einem Vortrag ... und in aehnlicher Weise auch in Java-Buechern zu finden: public class Vehicle { protected final String brand; protected final Integer wheels; public Vehicle(String brand, Integer wheels) { this.brand = brand; this.wheels = wheels; } public Integer getSpeed() { return this.wheels * 5; } public String getBrand() { return this.brand; } } Als ich diesen Code gesehen habe -- kurz nach dem vorigen -- da ist mir etwas klar geworden ... etwas das immer schon vor meiner Nase gelegen ist, ich aber bisher nie so klar erkennen habe koen- nen. Was ist es also, dieses grundsaetzliche Problem? Es sind nicht die Getter-Methoden und der Overhead, den sie erzeugen. Es ist auch nicht der Noise durch die Sicht- barkeitsschluesselworte. Das Problem ist viel grundsaetzlicher. Das Problem ist gleichzeitig der Grund warum Kernighan kein Buch ueber Java schreiben koennte ... oder ueber jede andere OO- Sprache. Das Problem ist folgendes: Mir ist bewusst geworden, dass ich in Vortraegen und Buechern noch nie ein einziges objektorientiertes Beispielprogramm gesehen habe, das nicht aus dem Sandkasten war! Tatsaechlich ist es voellig unmoeglich ein objektorientiertes Programm zu schreiben, das realitaetsnah und sinnvoll ist und auf eine Vortragsfolie oder Buchseite passt! Ein mit Go-Routinen parallelisierter und mit Channels verbin- dungslimitierter Webserver in Go hat nur etwa doppelt so viel Code wie obige Trivialversion. Er passt gerade noch auf eine Praesentationsfolie und locker auf eine Buchseite. Dagegen gibt es kein sinnvolles Programm mit Klassen, das auf eine Buchseite passt! -- Diese Aussage muss man erst richtig realisieren! -- Unter 300 Zeilen Code sind Klassen voelliger Overkill. Und unter 3000 Codezeilen macht Vererbung ueberhaupt keinen Sinn. (Das sind defensiv angesetzte Zahlen. Auch bei groesseren Programmen ist beides nicht unbedingt sinnvoll.) Folglich brauchen Anfaenger die Objektorientierung gar nicht. Dennoch konfrontiert man sie direkt damit (in Java mehr als ue- berall sonst). Noch schlimmer: Man zwingt es ihnen nicht nur auf, sondern lehrt es sie auch noch mit voellig praxisfernen Beispielen! Fahrzeuge, Autos, Anzahl der Raeder ... -- Wer hat je ein reales Programm geschrieben, das solche Klassen enthalten hat?! Im Vergleich dazu das Buch ``Software Tools'' von Kernighan und Plauger, das durchweg realen Code enthaelt, der in der Praxis genau so aussieht oder genau so aussehen koennte. Warum sehen wir dagegen nie eine reale Java-Klasse in der Lehre? Wir sehen sie nicht weil die Objektorientierung erst bei riesigen und komplexen Projekten Sinn macht, deren Code und vor allem deren Klassenaufbau ausschnittsweise gar nicht verstaendlich ist. Wie ist aber eine Programmiersprache und auch die Objektorien- tierung insgesamt zu bewerten, wenn die Objektorientierung mit so viel Beharrlichkeit geschult wird, sie aber nur fuer riesige, komplexe Codebasen relevant ist? Die Folge muss doch sein, dass genau diese entstehen. Es haette naemlich ueberhaupt keinen Sinn, Objektorientierung zu lernen wenn man nur kleine, uebersichtliche und ueberschaubare Programme schreibt ... was aber das einzige ist was Einsteiger tun sollten. Es ist komplett daneben, Einsteigern die Objektorientierung aufzubuerden -- sie brauchen sie nicht! (Nicht mal zum Ver- staendnis von objektorientierten Strukturen brauchen sie sie, denn `5.times' oder `"foo".length' ist auch ohne OO-Kenntnisse verstaendlich, aber von diesen Schoenheiten gibt es in Java ja eh nicht viel.) Schlimm an Java ist, dass es ohne Objektorientierung gar nicht genutzt werden kann. Selbst das einfachste Programm in Java ist massig mit OO ueberladen. -- Es heisst dann: ``Einfach `public static void main()' hinschreiben und nicht fragen wieso!'' Dabei ist nicht zu verstehen was man tut in der Informa- tik folgenreich ... Nun gut, wir muessen nur in die Welt schauen, dann sehen wir die Folgen der Java-Generation ... Die Objektorientierung ist nur eine von vielen moeglichen Arten ein Problem zu betrachten und den Code zu strukturieren. Fuer gar alle kleinen Programme und fuer viele grossen Programme ist es eine schlechte Art. Insbesondere hat die Objektorientierung bei Programmieranfaengern ueberhaupt nichts zu suchen. Am deutlichsten und gleichzeitig am einfachsten zu sehen ist das in der Unmoeglichkeit praxisnahe Lehrbeispiele zu finden. OOP- Lehre ist ein paedagogisches Desaster. Das liegt mit daran, dass auch OOP selbst ein Desaster ist. -- Ich kann nur sagen: Finger weg davon! Java muss raus aus der Lehre! Bisher dachte ich, dass Python sowohl die Sprache der Zukunft als auch die beste Wahl fuer Einsteiger sei. Go ist aber viel besser. Programmieranfaengern empfehle ich zukuenftig Go. Nachtrag 2022-07: Nachdem ich nun auch praktische Erfahrungen mit Go gesammelt habe bin ich nicht mehr der Meinung, dass die Sprache gut fuer Anfaenger geeignet ist. Auch als die Sprache der Zukunft sehe ich sie nicht mehr an. Leider gibt es keine Program- miersprache, die ich Anfaengern empfehlen koennte. [0] https://youtu.be/YXV7sa4oM4I?t=691 [1] Uriel: Plan9 (Fosdem 2006, 0:46:46) http://marmaro.de/apov/ markus schnalke