Hmm, bin mir jetzt nicht ganz sicher, welche Features du jetzt genau meinst, aber wirds nicht noch komplexer, wenns vollständig sind? Oder meinst mit unvollständig was ganz anderes - also dass etwas nicht funktioniert, wie man sichs normalerweise vorstellt?
Um in OOP sinnvoll Software zu designen braucht man natürlich einiges an Übung , aber das Prinzip selber ist ja eigentlich relativ simpel: Du teilst dein Programm in Objekte, die einem bestimmten Zweck dienen und einen Zustand haben können. Kommunikation zwischen Objekten erfolgt über Nachrichten. Dann gibt es noch Vererbung + Polymorphie, und das war es dann fast auch schon. Alles andere ist laesst sich mehr oder weniger aus diesen Regeln logisch ableiten. Z.b. Klassen oder Instanzierung - Das sind aus OOP Sicht ja schon keine speziellen Features von OOP mehr, sondern eher Patterns die sich aus den Grundsaetzen ergeben: Klassen sind halt Objekte, die andere Objekte erzeugen. Wenn man die Grundlagen mal verstanden hat, ist es ziemlich logisch wie man beim Coden vorgeht.
In einigen Sprachen (z.b. Smalltalk oder Ruby) sind Programme groesstenteils genau so umgesetzt. Aber in C# eben nur sehr unvollständig. C# Programme bauen eben nicht auf diesen Grundsätzen auf, sondern enthalten zahlreiche Ausnahmen und Sonderegeln. Und das macht es (vor allem für einen Einsteiger) ziemlich schwer, objektorientiert zu denken.
Z.b. gibt es Objekte, die sich mit anderen Objekten praktisch gar keine Gemeinsamkeiten teilen (z.b. primitive Datentypen oder die null-Referenz). Der Programmierer kann die gar nicht wie Objekte behandeln.
Es gibt Objekte und "Klassen", die du nicht erweitern kannst. Zu diesen Objekten gehören alle Klassen, die Teil der Standardbiliothek sind, bzw. die Klassen aus externen Bibliotheken.
Allein wegen diesen beiden Aussnahmen werden schon die grundlegendsten Prinzipien von OOP verletzt.
Z.b. die Kapselung von Verantwortung: Sagen wir Du willst den Absolutwert der Zahl -5. Eigentlich solltest Du jetzt -5, einer Instanz von einer Klasse Zahl, eine Nachricht schicken und sie nach ihrem Absolutwert fragen. Stattdessen holst Du dir von irgendwo eine Funktionssammlung System.Math und uebergibst der dann ein "Ding" namens -5 als Parameter.
Oder sagen wir du hast eine Liste von Zahlen und willst eine Liste, wo die selben Zahlen in zufaelliger Reihenfolge stehen. OOP waere
neueliste = liste.shuffle
, richtig? Und wenn shuffle nicht existiert, dann tut man es halt da hinein. In C# geht das aber nur dann, wenn Du den Code der Collection zur Verfügung hast. In C# 3.0 gibt es die Möglichkeit, die Methode dahin zu stecken wo sie gehoert. Aber auch in C# 3.0 ist das wieder ein spezielles, stark eingeschraenktes Konstrukt. Ein komplizierter Sonderfall für etwas, was eigentlich ganz einfach sein sollte.
Also ich find grad Python mit der eher seltsamen Tatsache, dass Einrückungen Teil der Syntax sind, eher seltsam. Da wird man sich als Anfänger schon ein paar Mal wundern.
Für einen Anfänger ist es sicherlich ein erstes Hindernis Codebloecke zu verstehen. Das es für ihn einen Unterschied macht wie der Block angegeben wird, glaub ich aber nicht.
Beim lernen der Sprache selbst bringts nicht viel. Beim Programmiern schon. Mit ner ordentlichen Codevervollständigung ist Anfängern meistens sehr viel geholfen, da es einen Haufen Leserei in den oft miserablen docs erspart.
Nach meiner Erfahrung verwenden Anfänger in ihren Programmen nur ganz wenige Bibliotheken. Da gibt es nur wenig, was man sich anschauen muss. Und wenn man fremden Code benutzt, dann hilft es meiner Meinung nach mehr, wenn man lernt eine Dokumentation zu lesen als wenn man lernt mit einem komplizierten Werkzeug.
Du hast schon recht, dass das beim Programmieren selbst sehr praktisch ist. Aber beim Lernen finde ich das eher kontraproduktiv.
Und ab und zu braucht man halt ein paar Erfolgserlebnisse, auch wenn man die Sprache noch nicht vollständig beherrscht.
Ja, da geb ich dir auch 100% recht. Ich weiß aber nicht, ob du solche Erfolgserlebnisse durch eine IDE wirklich schneller bekommst, als mit einer möglichst einfachen, abstrakten Programmiersprache und (nach den ersten Schritten) guten Bibliotheken. In Smalltalk/Squeak kannst Du z.B. ganz einfach ein tolles, graphisches Spiel erstellen. Einfach indem du ein paar bestehende Objekte nimmst, neu zusammensteckst, und ein paar Parameter veränderst.
Ich finde das wichtigste, das ein Anfänger braucht, ist ein gutes Buch, das die Theorie gut erklärt, und das viele praktische Beispiele enthält.