Programmieren lernen - besser kein OOP.



  • Bemerkung schrieb:

    Hallo

    Man sollte hier differenzieren:

    Um objektorientiertes *Denken* zu trainieren, ist C++ vermutlich nicht die Sprache der Wahl. Das kann man besser mit prinzipienreinen Objekt-Sprachen wie Smalltalk oder Self, bei denen das Programmieren tatsächlich eine Manipulation einer in sich geschlossenen Objektwelt darstellt. Auch UML wäre hier zu nennen.

    UML ist keine Programmiersprache, zum Lernen des Programmierens ist sie also mit nichten zu gebrauchen.

    Um objektorientiertes *Codieren* zu trainieren, ist C++ angesichts seiner Praxisrelevanz hingegen gut geeignet, da man dabei die seit Jahrzehnten dominierende C-Syntax benutzt, an die ja auch fast alle anderen modernen Sprachen (Perl, Python, Ruby, C#, ... ) angelehnt sind.

    Die Syntax von C# und Java ist sicherlich an C angelehnt (leider). Für die
    anderen genannten Sprachen trifft das ganz und gar nicht zu.



  • Hi Bemerkung,

    Du siehst die Sache ganz richtig. Nur kenne ich Smalltalk, UML... nicht um mir da ein Urteil erlauben zu können. Keine Ahnung wie Anfängergeeignet die sind, ob da ein totaler Anfänger ne Chance hat mit klarzukommen. Prolog wurde auch unter dem Gesichtspunkt geschrieben das Programmieren einfacher zu machen, ich bezweifle aber, daß es einem Anfänger ohne Hilfe möglich ist in Prolog einzusteigen. (der Vergleich hinkt sicher).

    Abgesehen davon muß man aber auch davon ausgehen, daß Anfänger sowas auch unter dem Gesichtspunkt der Nützlichkeit angehen. Das heist eine sich selbst viel gestellte Frage ist dabei wie verbreitet ist die Sprache und kann ich damit später mein Geld verdienen und meine Familie ernähren.
    Daher landen eben viele bei C++ oder Delphi oder wenn sie aus der Admin-Ecke kommen bei sprachen wie Pearl, PHP, Python...
    Die wenigsten werden vermutlich eine Sprache erlernen nur um ihr objektorientiertes Denken zu schulen, bei den meisten wird da doch schon der Gedanke im Hinterkopf sitzen, daß ich es ja schon auch so schaffen werde und in der Zeit die der Umweg kostet (koster er wirklich?) ja schon was konkretes machen und ein paar Flöhe damit verdienen kann.
    Dein Ansatz ist sicher der, den man an Unis und anderen Lehreinrichtungen wo man die Abfolge vorgeben kann überdenken sollte.

    Gruß Mümmel



  • muemmel schrieb:

    Warum nicht schon in der ersten Lernphase strings, referenzparameter und Streamausgaben nützen.

    Das ist doch unsinnig. Wenn man mit C anfängt geht es doch gerade um die Grundlagen. Was haben da C++-Strings zu suchen? Die mögen vielleicht bequemer in der Handhabung sein, sind aber ganz sicher keine konzeptuelle Vereinfachung. Und ein grundsätzliches Verständnis bekommt man damit schon gleich gar nicht. Wenn schon C, dann wirklich C. Alles andere ist Unsinn. Und mal ehrlich, wer es nicht auf die Reihe bekommt, dass ein String eine Aneinanderreihung von Zeichen (also ein Array von char) ist, der hat ganz andere geistige Probleme als von der Programmierung überfordert zu sein. Ähnliches gilt für printf. Genau wie man bei ASCIIZ-Strings nicht mit Zeigerarithmetik anfangen muss, gibt es keinen Grund sich bei printf in Formatierungsorgien zu verlieren. Es geht um das Lernen von allgemeinen Grundlagen. Das hat man bei printf, aber nicht bei C++-Streams. Vereinfachungen für Anfänger sind gut und notwendig - aber deswegen muss man sie auch nicht gleich für BWLer halten.



  • Wer zwingt den jemand das Schlüssewort class zu benutzen. Dachte C++ sei eine Multiparadigma-Sprache 😃



  • Hi,

    es geht nicht darum, daß man dem Anfänger das umgehen mit char-Arrays abnehmen will, sondern daß er sich gar nicht erst angewöhnen soll alles im C-Stil zu machen, wenn er in Richtung C++ will. Sicher muß er das auch beherrschen, und wenn er das nicht frißt ist er bei C++ sowieso auf der falschen Schiene.

    Um es noch mal auf den Punkt zu bringen: Ich bin der Meinung, daß ein C++-Programmierer-Anfänger vorher KEIN lupenreiner C-Programmierer werden muß. Denn SEIN Ziel ist nicht C-Programmierung, sondern C++-Programmierung. Aber er sollte auch nicht gleich mit der gesamten Komplexität der Sprache erschlagen werden.
    Und er sollte sich KEINE C-Gewohnheiten zu eigen machen die in C++ deplaziert sind.

    Ziel kann es aus MEINER Sicht nicht sein, ihn erst zu einem C-Programmiere zu machen und ihn dann zu einem C++-Programmierer UMZUERZIEHEN, sondern ihn Schritt für Schritt stufenweise vom leichten zum schweren gleich C++ lernen zu lassen. Und aus meiner Sicht ist nun mal das Verstehen wie Rechner überhaupt ticken, also Anweisungen, Kontrollstrukturen, Funktionen ... die Basis die erst mal sitzen muß.

    Gruß Mümmel



  • Hi Aprollo,

    das wird in dieser NG anscheinend anders gesehen.

    Gruß Mümmel



  • Aprollo schrieb:

    Wer zwingt den jemand das Schlüssewort class zu benutzen.

    Ich. Weil: struct sieht so altmodisch aus.



  • muemmel schrieb:

    es geht nicht darum, daß man dem Anfänger das umgehen mit char-Arrays abnehmen will, sondern daß er sich gar nicht erst angewöhnen soll alles im C-Stil zu machen, wenn er in Richtung C++ will. Sicher muß er das auch beherrschen, und wenn er das nicht frißt ist er bei C++ sowieso auf der falschen Schiene.

    Um es noch mal auf den Punkt zu bringen: Ich bin der Meinung, daß ein C++-Programmierer-Anfänger vorher KEIN lupenreiner C-Programmierer werden muß. Denn SEIN Ziel ist nicht C-Programmierung, sondern C++-Programmierung. Aber er sollte auch nicht gleich mit der gesamten Komplexität der Sprache erschlagen werden.
    Und er sollte sich KEINE C-Gewohnheiten zu eigen machen die in C++ deplaziert sind.

    Ziel kann es aus MEINER Sicht nicht sein, ihn erst zu einem C-Programmiere zu machen und ihn dann zu einem C++-Programmierer UMZUERZIEHEN, sondern ihn Schritt für Schritt stufenweise vom leichten zum schweren gleich C++ lernen zu lassen. Und aus meiner Sicht ist nun mal das Verstehen wie Rechner überhaupt ticken, also Anweisungen, Kontrollstrukturen, Funktionen ... die Basis die erst mal sitzen muß.

    Ich weiß ja nicht, was man mit einem anfangen kann, der nur C++ Programmierer werden will. Es geht darum Programmieren zu lernen und da sollte man am Anfang die Grundlagen lernen ohne Libraries die einem alles abnehmen und ganz ohne "verstümmelte" OOP.



  • 555-CARSERVICE schrieb:

    Ich weiß ja nicht, was man mit einem anfangen kann, der nur C++ Programmierer werden will. Es geht darum Programmieren zu lernen und da sollte man am Anfang die Grundlagen lernen ohne Libraries die einem alles abnehmen und ganz ohne "verstümmelte" OOP.

    Die Bibliothek möchte ich mal sehen, die einem alles abnimmt. Es kann sinnvoll sein wenn man sich auch mal die "Basics" der Sprache anschaut und das ein oder andere mal selbst schreibt, nicht desto trotz braucht man Bibliotheken schon recht früh (oder wie willst du z.B. unter C++ eine Bildschirmausgabe machen), dabei ist es aber vollkommen egal ob du nun mit der prozeduralen oder objektorientierten Lehre beginnst.

    Und warum bitte schön "verstümmelte" OOP?
    Man kann OOP Konzepte schon von Beginn an sauber lernen, ebenso wie prozedurale Programmierung. Einen der ernsthaft C++ lernen will, würde ich z.B. eher auf OOP beginnen lassen, die wesentlichen Grundlagen von den anderen unter C++ bestehenden Sprachparadigmen kann man noch nebenher erklären wenn Zeit ist.

    Zum Glück kann trotz der Diskussion hier jeder noch für sich selbst entscheiden, was für einem das beste ist. Ich persönlich habe zwar mit prozeduraler Programmierung begonnen, hatte aber dafür eine Umgewöhnungsphase die ich mir hätte sparen können wenn OOP damals schon verbreiteter gewesen wäre. Jemanden anderen habe ich Programmierung auf OOP-Basis erklärt und der kam damit sehr gut klar (zumal er noch kein anderes Sprachparadigma kannte). Ich persönlich finde OOP leichter zu erklären wenn man es anhand von der realen Welt erklärt.

    cu André



  • asc schrieb:

    ...nicht desto trotz braucht man Bibliotheken schon recht früh (oder wie willst du z.B. unter C++ eine Bildschirmausgabe machen)...

    videomemory[x+y*LINELENGTH] = '*';
    

    😉



  • asc schrieb:

    Die Bibliothek möchte ich mal sehen, die einem alles abnimmt. Es kann sinnvoll sein wenn man sich auch mal die "Basics" der Sprache anschaut und das ein oder andere mal selbst schreibt, nicht desto trotz braucht man Bibliotheken schon recht früh (oder wie willst du z.B. unter C++ eine Bildschirmausgabe machen), dabei ist es aber vollkommen egal ob du nun mit der prozeduralen oder objektorientierten Lehre beginnst.

    Du musst die Spuerbibliothek nehmen 🙄 Man kann auch alles falsch verstehen wollen.

    Und warum bitte schön "verstümmelte" OOP?
    Man kann OOP Konzepte schon von Beginn an sauber lernen, ebenso wie prozedurale Programmierung. Einen der ernsthaft C++ lernen will, würde ich z.B. eher auf OOP beginnen lassen, die wesentlichen Grundlagen von den anderen unter C++ bestehenden Sprachparadigmen kann man noch nebenher erklären wenn Zeit ist.

    Zum Glück kann trotz der Diskussion hier jeder noch für sich selbst entscheiden, was für einem das beste ist. Ich persönlich habe zwar mit prozeduraler Programmierung begonnen, hatte aber dafür eine Umgewöhnungsphase die ich mir hätte sparen können wenn OOP damals schon verbreiteter gewesen wäre. Jemanden anderen habe ich Programmierung auf OOP-Basis erklärt und der kam damit sehr gut klar (zumal er noch kein anderes Sprachparadigma kannte). Ich persönlich finde OOP leichter zu erklären wenn man es anhand von der realen Welt erklärt.

    Na wenn du meinst, dass man einem der noch nicht mal weiß was ne Variable oder n Array ist, gleich noch zusätzlich Klassen und so Zeug wie public, private usw. erklären muss, dann mach es halt so.



  • Undertaker schrieb:

    asc schrieb:

    ...nicht desto trotz braucht man Bibliotheken schon recht früh (oder wie willst du z.B. unter C++ eine Bildschirmausgabe machen)...

    videomemory[x+y*LINELENGTH] = '*';
    

    😉

    Na, also man will doch Protected Mode verwenden... 🤡



  • 555-CARSERVICE schrieb:

    Na wenn du meinst, dass man einem der noch nicht mal weiß was ne Variable oder n Array ist, gleich noch zusätzlich Klassen und so Zeug wie public, private usw. erklären muss, dann mach es halt so.

    1. Variablen sind etwas das auch in OOP existiert (ebenso wie Arrays, auch wenn man dort meist eher zu Vectoren oder vergleichbaren greift).
    2. Das Konzept für Klassen ist Interessanterweise für jemanden der zuvor noch nicht Programmiert hat teilweise recht einfach zu verstehen (ebenso wie public, private), solange man das Konzept nicht zwangsweise technisch rüberbringt.

    Letzteres habe ich mal extrem stark festgestellt bei einer Auszubildenenbetreuung. Einige wollten es schon hinschmeißen, weil sie nichts verstanden hatten, und ich habe dann versucht eine Basis zu finden, am Schluß habe ich einfach mit den Sachen die auf dem Tisch lagen Programmierung am Beispiel OOP gezeigt, und das kam überraschend gut an (und hat die Grundlage für das technische Verständnis gelegt). Ja, OOP ist nicht 1:1 auf die Welt übertragbar, doch logisch liegt es IMHO näher als die prozedurale Programmierung, da wir Menschen sehr viel abstrahieren.

    cu André



  • asc schrieb:

    1. Variablen sind etwas das auch in OOP existiert (ebenso wie Arrays, auch wenn man dort meist eher zu Vectoren oder vergleichbaren greift).
    2. Das Konzept für Klassen ist Interessanterweise für jemanden der zuvor noch nicht Programmiert hat teilweise recht einfach zu verstehen (ebenso wie public, private), solange man das Konzept nicht zwangsweise technisch rüberbringt.

    Letzteres habe ich mal extrem stark festgestellt bei einer Auszubildenenbetreuung. Einige wollten es schon hinschmeißen, weil sie nichts verstanden hatten, und ich habe dann versucht eine Basis zu finden, am Schluß habe ich einfach mit den Sachen die auf dem Tisch lagen Programmierung am Beispiel OOP gezeigt, und das kam überraschend gut an (und hat die Grundlage für das technische Verständnis gelegt). Ja, OOP ist nicht 1:1 auf die Welt übertragbar, doch logisch liegt es IMHO näher als die prozedurale Programmierung, da wir Menschen sehr viel abstrahieren.

    Und wie programmieren die dann? Um ne Klasse mit Leben zu füllen braucht man doch erst mal Grundwissen. Klar kann man alles auch gleich in Klassen reinstecken, aber dann muss man doch nur mehr lernen. Die Funktionsweise von nem Methoden oder Funktionsaufruf ist doch die selbe, nur das ich bei ner Methode einer Klasse auch noch sowas wie public und private berücksichtigen muss. Die Umsetzung eines (rekursiven) Algorithmus nur dass ich mir bei OOP noch überlegen muss, ob ich die Methoden public oder private mache.
    Man sieht hier halt oft Code von Leuten, die irgendwelche Libraries verwenden und noch nicht mal ne Schleife hin bekommen oder irgendwelche wirren Klassenkonstrukte aufbauen ohne irgend nen vernünftigen Algorithmus zur eigentlichen Lösung des Problems im Kopf zu haben.



  • Hi,

    nochmal zur eigentlichen Frage:
    "wenn man erst mal mit C anfängt und das solange macht, bis man die Grundlagen wirklich versteht"

    Und genau in dem "bis man die Grundlagen wirklich versteht" liegt der Hase im Pfeffer. Die Grundlagen sind soliedes Handwerk, oop ist dagegen in erster Linie ein Denkmodell was dahinter liegen muß.
    Das ist wie beim Häuslebauen. Da kann einer noch so viel von Static und Design und Architektur verstehen, wenn er die Grundlagen des Mauerns nicht beherrscht fällt die ganze Bruchbude ein.
    Da wir hier keine Sekte gründen wollen kommt es doch nicht in erster Linie auf die reine Lehre an.
    Auch oop bestehrt aus den Grundlagen plus eben noch was dazu. Klassen werden schließlich nicht mit Murmeln gefüllt sondern mit Anweisungen.
    Außerdem sind immer noch viele, die sich die ganze Sache im Selbstlauf beibringen.
    Selbstverständlich ist es nicht so schwer, jemandem beizubringen was Klassen und Klassenfunktionen sind. Aber das kratzt doch höchstens an der Oberfläche. Die eigentliche oop beruht doch nicht darauf, das ich das was ich füher in einzelnen Dateien gemacht und mit static versteckt habe nun in Klassen zu stecken und mit private zu verstecken.
    Die eigentliche oop beginnt doch da, wo ich mir über Abstraktion von Dingen Gedanken mache, über Schnittstellen zur Außenwelt und zu Nachfolgern nachdenke, mir Gedanken darüber mache was Gemeinsamkeiten und Unterschiede sind und was wovon abhängt und abgeleitet werden könnte.
    Oder um bei Meyers zu bleiben bei den verschiedenen Katzen, die alle ihre eigenen liebenswerte Art zu schlafen und zu fressen haben. Erkennen, daß ich es hier mit Klassen zu tun habe, aber auch gedanken darüber machen, was nehme ich als "Basiskatze", eine Katze, oder besser ein Säugetier weil ich vielleicht auch Hunde ableiten will...
    Da sind die Dinge, die nicht mal so En passant zu lernen sind, vor allem ohne Lehrer und ohne Verständnis der Grundlagen.
    Warum soll andererseits alles oop weggelassen werden. Auch Anfänger wollen nicht nur Hello World schreiben sondern auch mal was fürs Auge machen, was motiviert. Spätestens, wenn sie das mit dem C++Builder machen und sich da ein Formular zusammenklicken sind sie voll drin in der oop, auch ohne auch nur eine einzige eigene Quelltextzeile geschrieben zu haben. Dabei lernen sie oop dann gleich am praktischen Beispiel (ein Formular, abgeleitet von TForm) kennen. Und sobald sie eine eigene Komponente von was vorhandenen ableiten ist es nicht nur formelles oop, sondern dann MUSS ich mir Gedanken machen wie es funktionieren soll. Wovon leite ich ab, von TEdit oder TCustomEdit. Was will ich überschreiben, was sichtbar machen. Welche zusätzlichen Dinge brauche ich. Dabei kann man wenn man es ernsthaft macht eine gewaltige Menge über oop lernen.

    Gruß Mümmel


Anmelden zum Antworten