Was kommt nach den Grundlagen?



  • Man kann doch trotzdem die Vorteile der Objektorientierung nutzen, obwohl man
    eine in C geschriebene Schnittstelle benutzt, oder?



  • Ja, sicher. OOP funktioniert auch in C selbst. Aber gewisse Techniken und Design Patterns wirst du nur in C++ antreffen. Und auch wenn du in eigenen Projekten viele von ihnen verwendest, ohne es zu wissen, lernst du einige davon nicht automatisch.

    Aber OOP-Design ist ja nur ein Teil. Die Herangehensweise ist halt je nach Framework und je nach Sprache ziemlich unterschiedlich. Es ist sicher gut viele Varianten zu sehen, sofern man etwas kritisch ist. Teilweise werden Dinge wegen Limitierungen der Sprache (in C, oder in C++ vor 15 Jahren) unnötig umständlich gelöst. Nicht dass du dir solche Dinge aneignest 😉

    Das könntest du aber auch schön verhindern, indem du Bücher wie "Effective C++" oder "Exceptional C++" liest. Das sind oft empfohlene Werke für Fortgeschrittene, die einige Tricks und Fallgruben in C++ ansprechen.



  • Du bist also der Meinung es spricht nichts dagegen sich mit Windows
    Programmierung zu beschäftigen, aber ich sollte mir zusätzlich
    einen guten Stil angewöhnen und mich mit Algorithmen und anderen
    Techniken beschäftigen?



  • Wenn du für Windows entwickeln willst ist es sicherlich nicht schlecht die Grundlagen der WinAPI zu kennen...



  • Nexus schrieb:

    Ja, sicher. OOP funktioniert auch in C selbst. Aber gewisse Techniken und Design Patterns wirst du nur in C++ antreffen. Und auch wenn du in eigenen Projekten viele von ihnen verwendest, ohne es zu wissen, lernst du einige davon nicht automatisch.

    Also um das mal klarzustellen, wenn Leute, wie hier Nexus, sagen, dass man auch in C OOP betreiben kann, dann meinen sie damit, dass man, wenn man es darauf anlegt, gegen jede Sprache kämpfen kann und mit ihr in einer Art und Weise programmieren kann, für die sie nicht gedacht ist.

    Das heißt aber nicht, dass C die Programmiertechniken, die man bei objektorientierter Programmierung einsetzt, in irgendeiner Weise unterstützt. Um es mal ganz klar auszudrücken: C ist nicht für objektorientierte Programmierung gedacht. Und es handelt sich dabei auch in keinster Weise um eine Sprache, mit der man OOP lernen kann.



  • Aber man kann doch beispielsweise die winapi funktionen nutzen, um komfortablere
    C++ Funktionen zu programmieren.



  • dot schrieb:

    Wenn du für Windows entwickeln willst ist es sicherlich nicht schlecht die Grundlagen der WinAPI zu kennen...

    Ich habe mich zwar nie mit WinAPI beschäftigt, aber ich halte das trotzdem einfach mal für Quatsch. 😉

    Warum sollte man sich bei GUI-Programmierung mit Low-Level Kram auseinandersetzen? Was sind die _wichtigen_ Einsichten, die man dadurch gewinnt? Für mich hört sich das so an, als ob man Sachen in Assembler schreiben sollte, weil man sonst nicht versteht, was der Rechner macht. Aber das ist genauso Quatsch.

    Die Einsichten, die man dadurch gewinnen könnte, sollte man sich lieber mit einem guten Buch über die entsprechende Thematik aneignen. Statt Assembler zu lernen, sollte man lieber ein Buch über Computer-Architektur und Design lesen. Und statt WinAPI zu nutzen sollte man vermutlich gar nichts lesen. Ich sehe dazu überhaupt gar keinen Grund.



  • twotime schrieb:

    Theoretisch ja, aber dieses Vorgehen ist wohl total langweilig und mühselig und wahrscheinlich unrealistisch. Und ein Framework lernt man nicht mal so nebenbei, vorallem wenn man das Thema (GUI-Programmierung) vorher noch nicht kennt. Außerdem lernt man auch was über Designpattern, wenn man Frameworks lernt. Wenn man immer nur C++ Konsolenprogrammierung bereit, werden einem die meisten Designpatters auch relativ sinnlos vorkommen. Und 4. würde ich während 1. und 2. machen.

    Ich habe nichts dagegen, dass der Threadersteller sich mit GUI-Programmierung beschäftigt. Aber ich sehe das nur als Anwendungsgebiet, in dem man die Dinge, die man wirklich lernt, ausprobieren kann.

    Klar, ich habe damals auch recht früh mal einen grafischen Taschenrechner und so programmiert. Aber das relevante dabei war nicht, herauszufinden, wie man irgendwelche Buttons realisiert. Das interessante dabei war das, was sich hinter der GUI abgespielt hat. Praktisch das Zusammenspiel der einzelnen Programmkomponenten. Dort liegt die Herausforderung. Die Herausforderung sollte nie in der GUI liegen.



  • Gregor schrieb:

    Also um das mal klarzustellen, wenn Leute, wie hier Nexus, sagen, dass man auch in C OOP betreiben kann, dann meinen sie damit, dass man, wenn man es darauf anlegt, gegen jede Sprache kämpfen kann und mit ihr in einer Art und Weise programmieren kann, für die sie nicht gedacht ist.
    [...]
    Um es mal ganz klar auszudrücken: C ist nicht für objektorientierte Programmierung gedacht.

    Nein, so meinte ich das nicht.

    Schau dir C-Bibliotheken an, du wirst sehr oft auf objektorientierte Programmierung treffen. Statt a.foo(7, 4) hast du eben foo(a, 7, 4) , statt Konstruktoren Create() und statt Destruktoren Destroy() . Dinge wie Vererbung und Polymorphie sind natürlich schwieriger, aber dennoch möglich. Aber darum gehts nicht – es ist wichtig zu sehen, dass sich das Denken in Objekten auch in C auszahlt, selbst wenn die Sprache nicht viel mehr als struct dafür anbietet.

    Du klammerst dich zu sehr an der OOP-Definition fest, wie sie z.B. in Java benutzt wird. Um OOP zu lernen, wie du sie verstehst, ist daher auch eine solche Sprache geeigneter. Daher auch "Aber gewisse Techniken und Design Patterns wirst du nur in C++ antreffen". Was ich sagen wollte, ist dass man auch in C objektorientiert programmieren kann und dadurch nicht selten besseren Code schreibt.



  • Gregor schrieb:

    dot schrieb:

    Wenn du für Windows entwickeln willst ist es sicherlich nicht schlecht die Grundlagen der WinAPI zu kennen...

    Ich habe mich zwar nie mit WinAPI beschäftigt, aber ich halte das trotzdem einfach mal für Quatsch. 😉

    Die Frage ist: Will er GUIs entwickeln oder will er sich in die Windowsprogrammierung einarbeiten?



  • Nexus schrieb:

    Gregor schrieb:

    dot schrieb:

    Wenn du für Windows entwickeln willst ist es sicherlich nicht schlecht die Grundlagen der WinAPI zu kennen...

    Ich habe mich zwar nie mit WinAPI beschäftigt, aber ich halte das trotzdem einfach mal für Quatsch. 😉

    Die Frage ist: Will er GUIs entwickeln oder will er sich in die Windowsprogrammierung einarbeiten?

    Ich möchte mein Grundwissen anwenden, egal ob GUI oder insgesamt
    Windowsprogrammierung.



  • Wenn du dir nicht sicher bist, dann schau dir doch verschiedenste Bereiche mit ihren Frameworks an und benutze das, das dir am meisten zusagt. Zum Beispiel könntest du auch in Richtung Spiele-/Grafikprogrammierung gehen 😉



  • Nexus schrieb:

    Schau dir C-Bibliotheken an, du wirst sehr oft auf objektorientierte Programmierung treffen. Statt a.foo(7, 4) hast du eben foo(a, 7, 4) , statt Konstruktoren Create() und statt Destruktoren Destroy() . Dinge wie Vererbung und Polymorphie sind natürlich schwieriger, aber dennoch möglich. Aber darum gehts nicht – es ist wichtig zu sehen, dass sich das Denken in Objekten auch in C auszahlt, selbst wenn die Sprache nicht viel mehr als struct dafür anbietet.

    Du klammerst dich zu sehr an der OOP-Definition fest, wie sie z.B. in Java benutzt wird. Um OOP zu lernen, wie du sie verstehst, ist daher auch eine solche Sprache geeigneter. Daher auch "Aber gewisse Techniken und Design Patterns wirst du nur in C++ antreffen". Was ich sagen wollte, ist dass man auch in C objektorientiert programmieren kann und dadurch nicht selten besseren Code schreibt.

    1. Objektorientierung ist eine Frage der Denkweise und keine Frage der Syntax, das sehe ich durchaus auch so. Ich habe Objektorientierung damals mit UML gelernt, also nicht ansatzweise mit irgendeiner Programmiersprache. Die Frage ist aber, ob die Programmiersprache die gedanklichen Konstrukte, die man bei einer objektorientierten Sichtweise hat, ebenfalls bietet oder ob sie das nicht tut. C++ macht das, Java macht das, C# macht das, C macht das nicht. In C muss man sich die Konstrukte selbst zurechtbiegen und sich dann halt sagen "Wenn da XYZ steht, dann ist das für mich eine Umsetzung von Polymorphie". C ist eine Programmiersprache, die auf prozedurale Programmierung ausgelegt ist und entsprechende Sprachmittel für eben dieses Programmierparadigma bietet. Wenn Du jetzt sagst, dass Du OOP in C betreibst, dann bringst Du gedanklich eine weitere Interpretationsschicht zwischen Dich und die Sprache und Du schränkst Dich bezüglich der Art der Nutzung der Programmiersprache ein. Du entscheidest Dich bewusst dafür, dass Du in dieser Programmiersprache anders programmierst, als es eigentlich gedacht ist.

    Aus meiner Sicht gibt es dafür nur einen Grund: Die Programmiersprache ist aus irgendeinem Grund festgelegt, Du siehst aber ein, dass die Denkweise, die zu dieser Programmiersprache passt, nicht aufs Anwendungsgebiet passt.

    Abgesehen davon: Der Threadersteller will glaube ich C++ lernen. Dann soll er auch lernen, die Sprachmittel zu benutzen, die C++ bietet.

    2. Du sagst, dass man auch in C OOP betreiben kann und dadurch nicht selten besseren Code schreibt. Besser im Vergleich zu was? Besser im Vergleich zu nicht-OOP C-Code? Oder besser im Vergleich zu OOP C++ Code? Im ersten Fall sagst Du praktisch aus, dass C für bestimmte Anwendungsgebiete einfach nicht geeignet ist, da dort wohl eine objektorientierte Sichtweise angebracht ist, die C nicht unterstützt. Eigentlich ist dann die richtige Konsequenz, wenn man diesbezüglich die Wahl hat, nicht C zu benutzen. Wenn Du den zweiten Fall meinst, dann müsstest Du mir das mal genauer erklären.



  • Im Prinzip bauen doch alle Windows Frameworks auf der Windows API auf,
    oder?



  • Nexus schrieb:

    Du klammerst dich zu sehr an der OOP-Definition fest, wie sie z.B. in Java benutzt wird. Um OOP zu lernen, wie du sie verstehst, ist daher auch eine solche Sprache geeigneter. Daher auch "Aber gewisse Techniken und Design Patterns wirst du nur in C++ antreffen".

    Welche Design Patterns ?



  • C ist nicht optimal geeignet, um OOP zu erlernen, kein Zweifel. Das sind C++ und java aber auch nicht. Reine OO-Sprachen sehen ganz anders aus.



  • Welche Design Patterns ?

    http://sourcemaking.com/design_patterns

    Das sind die üblichen Patterns. Viele davon lassen sich nur vergleichsweise schwer in C umsetzen, dafür aber in C++ (oder Java, Smalltalk, etc.) einfach, da sie Klassen, Vererbung, etc. direkt unterstützen.



  • Gregor schrieb:

    Die Frage ist aber, ob die Programmiersprache die gedanklichen Konstrukte, die man bei einer objektorientierten Sichtweise hat, ebenfalls bietet oder ob sie das nicht tut. [...] C macht das nicht. In C muss man sich die Konstrukte selbst zurechtbiegen und sich dann halt sagen "Wenn da XYZ steht, dann ist das für mich eine Umsetzung von Polymorphie".

    Nein, du denkst viel zu weit. Polymorphie und Vererbung sind Eigenschaften des Begriffs OOP, wie man ihn in Java oder C++ üblicherweise verwendet. Aber im Grunde genommen bedeutet "objektorientiert" nur, dass man in Objekten denkt und sein Programm entsprechend strukturiert. Das gilt für viele C-Programme, die keine Hacks benutzen. FILE* aus der Standardbibliothek ist auch ein berühmtes Beispiel.

    Gregor schrieb:

    Abgesehen davon: Der Threadersteller will glaube ich C++ lernen. Dann soll er auch lernen, die Sprachmittel zu benutzen, die C++ bietet.

    Da bin ich völlig deiner Meinung. Ich halte nichts davon, zuerst C zu lernen, wenn man C++ im Hinterkopf hat.

    Gregor schrieb:

    Im ersten Fall sagst Du praktisch aus, dass C für bestimmte Anwendungsgebiete einfach nicht geeignet ist, da dort wohl eine objektorientierte Sichtweise angebracht ist, die C nicht unterstützt.

    Ja, ich meinte den ersten Fall. Ich bezog mich wiederum auf objektorientiertes C innerhalb vernünftiger Grenzen (also keine Makro-Hacks zum Nachbau von Vererbung). Auch in C kann es sinnvoll sein, gemeinsame Daten zusammenzufassen, hierarchisch zu strukturieren und darauf operierende Algorithmen zu definieren. Kapselung ist ein weiteres Beispiel für einen Schritt Richtung OOP.

    !rr!rr_. schrieb:

    C ist nicht optimal geeignet, um OOP zu erlernen, kein Zweifel. Das sind C++ und java aber auch nicht. Reine OO-Sprachen sehen ganz anders aus.

    "Reine OOP" wird sowieso überschätzt, mehr Reinheit führt nicht automatisch zu besserer Qualität. Was ich an C++ so mag, ist zum Beispiel die Möglichkeit, verschiedenste Paradigmen (prozedural, objektorientiert, generisch, funktional) zu vereinen.



  • Ach ne.

    Nexus schrieb:

    Du klammerst dich zu sehr an der OOP-Definition fest, wie sie z.B. in Java benutzt wird. Um OOP zu lernen, wie du sie verstehst, ist daher auch eine solche Sprache geeigneter. Daher auch "Aber gewisse Techniken und Design Patterns wirst du nur in C++ antreffen".

    Welche Design Patterns wird man nur in C++ antreffen?



  • double-b schrieb:

    Im Prinzip bauen doch alle Windows Frameworks auf der Windows API auf,
    oder?

    Ja.

    Nachtrag:
    Der für Windows compilierte C/C++ Code baut allerdings auch auf der WinAPI auf. Deshalb läuft für Windows compilierter Code ja auch nicht auf UNIX System und umgekehrt. WinAPI ist ganz klar ein Schritt in richtung low-level bzw. C. Ich persönlich begrüße das zwar, aber im Endeffekt ist es dein Bier dich zu entscheiden. Es gibt hier keine klare Vorgehensweise. Wenn du lieber zu erst wissen möchtest wie das alles funktioniert etc. fang mit low-level an. Wenn du viel Wert auf schnelle klickibunti Fenster legst, fang mit high-level an.

    Aber stelle hier bloß niemals die Frage womit man anfangen sollte, das artet schon in Religionskriege aus! (An denen ich mich natürlich gerne beteilige :D)


Anmelden zum Antworten