Was kommt nach den Grundlagen?
-
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 ebenfoo(a, 7, 4)
, statt KonstruktorenCreate()
und statt DestruktorenDestroy()
. 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 alsstruct
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 ebenfoo(a, 7, 4)
, statt KonstruktorenCreate()
und statt DestruktorenDestroy()
. 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 alsstruct
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)
-
Sarirtanas schrieb:
Welche Design Patterns wird man nur in C++ antreffen?
Ich meinte mit "nur" nicht "nirgends sonst", sondern "in C nicht".
Aber es gibt natürlich etliche C++-spezifischen Techniken und Idiome, auch wenn der Grossteil der Leute diese nicht als Design Patterns bezeichnen würde. Hier findest du eine ganze Menge davon.
-
Nexus schrieb:
"Reine OOP" wird sowieso überschätzt, mehr Reinheit führt nicht automatisch zu besserer Qualität.
ja, das hört man öfter aus der {C++ | java | etc}-Ecke.
-
Nexus schrieb:
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.Polymorphie gehört durchaus jenseits von bestimmten Programmiersprachen zu Objektorientierung. Was heißt denn, "in Objekten denken"? Wenn man in Objekten denkt, dann haben diese Objekte gewisse Eigenschaften und sie können gewisse Dinge ausführen. Und man denkt dann, dass diese Objekte über Nachrichten miteinander kommunizieren. Wenn ein Objekt einem anderen Objekt die Nachricht "Fahr mal vorwärts!" schickt, dann ist das Verhalten des Objekt auf diese Nachricht vom Objekt selbst und von der Situation abhängig. Ein Auto fährt anders vorwärts als ein Fahrrad. Das ist Polymorphie. Dieser Begriff und diese Denkweise hat gar nichts mit einer bestimmten Programmiersprache zu tun.
Du musst es anders sehen. Du verbiegst C derart, dass Du dort eine Art von Objekten hast und sagst dann, fahreVorwärts(a,50,30) ist praktisch nur eine andere Form, um a.fahreVorwärts(50,30) zu sagen. Dann siehst Du, dass bestimmte Konzepte auf dieser Basis schwieriger umzusetzen sind und definierst kurzerhand die Idee der Objektorientierung um. Du sagst dann, dass Dinge wie Polymorphie nur eine Eigenart bestimmter Sprachen ist, weil Du es vielleicht nicht nutzen möchtest. Aus meiner Sicht ist es aber eher so, dass Du dann in C ausschließlich eine Untermenge der Konzepte nutzt, die als Gesamtes die Objektorientierung ausmachen. Du sagst dann, die Untermenge ist OOP, also betreibst Du OOP in C. In Wirklichkeit ist die Untermenge aber nur eine Untermenge und nicht mehr.
Abgesehen davon kann es natürlich trotzdem sinnvoll sein, im Rahmen von C an Objekte zu denken. Das sehe ich ein.
Nexus schrieb:
!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.
Ja, das sehe ich auch so. Man muss bestimmten Programmierparadigmen nicht zu 100% anhängen. Es kann durchaus angebracht sein, bestimmte Teile eines Programms anders zu programmieren als andere. Allerdings glaube ich, dass ein Anfänger erstmal eine reine Sichtweise auf die unterschiedlichen Denkweisen bekommen sollte. Das Mischen von unterschiedlichen Techniken ist etwas fortgeschrittenes und man sollte sich sehr darüber im Klaren sein, warum man das an bestimmten Stellen macht. Wenn sich ein Anfänger sagt "ach, ich werfe da jetzt mal ein paar Dinge durcheinander", dann kommt da vermutlich eher nur ganz mieser Programmierstil raus.