Hi!
So, jetzt muss ich doch auch mal meinen Senf dazu geben...
Zunächst wollte ich schreiben, dass ich an C++ den Scope und die Lebenszeit von Objekten sehr zu schätzen weiß, auch die Kontrolle darüber, aber ich immer die Möglichkeit vermisst habe, Objekte zurück zu geben und so die Lebenszeit in den übergeordneten Scope zu verlängern. Ein Beispiel, was ich damit meine:
Code: Alles auswählen
object& someFunction() {
object o();
return o; //die Lebenszeit von o sollte nicht mit der Funktion enden, sondern an den übergeordneten Scope übergehen
}
void mainFunction() {
object& o = someFunction();
} //object o sollte erst hier zerstört werden
Ein anderes Problem ist ein reines Software-Design-Problem. Es gibt Objekte die sind nur temporär und sollen nur kurz leben, dafür ist der Stack und ein Scope hervorragend geeignet. Und ich finde, dass ist in C++ mit Destruktoren etc. hervorragend geregelt. Richtig eingesetzt sorgt es für ein hervorragendes aktuelles aufräumen dieser temporären Objekte ohne viel Aufhebens.
Dann aber gibt es Objekte die erzeugt werden und länger leben sollen, vielleicht viel rum gereicht werden. Solange die Besitzverhältnis leicht zu überblicken sind, und z.B. nur ein anderes Objekt für die Verwaltung zuständig ist, ist das Ganze noch recht einfach zu überblicken, das Besitzer-Objekt verwaltet und löscht auch, denn es weiß genau wann die erzeugten Objekte nicht mehr benötigt werden. Wenn die Verhältnisse komplizierter sind, dann gehe ich meist dazu über die Lebenszeit dem erzeugten Objekt selbst zu überlassen (z.B. mittels Referenzzählung) das ist aber nicht so einfach, wie es sich anhört. Zwar weiß in einer solch komplexen Situation dann das erzeugte Objekt noch am besten Bescheid, aber auch sein Wissen ist begrenzt. Es kennt ja nur sich selbst. Zyklische Abhängigkeiten führen dann zu Geisterobjekten. Diese Probleme sind nicht so einfach zu lösen und C++ bietet dort keine vorgefertigte einfache Hilfe wie im ersten Fall der temporären Objekte.
Allerdings bin ich inzwischen auch soweit, dass ich einen GC nicht mehr als die Lösung, sondern nur als eine Verschleierung des Problems ansehe. Trotzdem bereitet mir diese Situationen häufig Kopfzerbrechen und viel eigene Arbeit... Wenn hier also jemand dafür ein Patentrezept kennt?
Und jetzt muss ich am Ende doch noch eine Lanze für Java brechen.
Ich habe lange in C++ programmiert und es war sehr schwierig ein funktionierendes Programm hinzubekommen, das etwas komplexer ist. Da man sich um so viel selber kümmern muss und sobald ein Design nicht perfekt ist, muss man alles wieder von vorne Anfangen, neu designen etc. Hinzu kommt, dass es ein Alptraum ist, ein GUI in C++ zu schreiben und zu verwalten. Das liegt auch einfach daran, dass ein kompliziertes GUI für ein aufwendiges Programm eine sehr komplexe Sache ist. Das sieht man schon daran, dass auch "Profi"-Bibliotheken wie wxWidgets oder Qt sehr komplex sind und sich bei größeren Programmen einfach mal ohne ersichtlichen Grund verabschieden und das ganze Programm mitreißen. Meine C++ Programme sind nie am eigentlichen Arbeitsalgorithmus oder der Datenverwaltung gescheitert, immer nur an der mit C++ kaum zu beherrschenden Komplexität der GUI. Aber gerade für mich, der Programme auch häufig nur als Hilfsmittel und nicht nur als Selbstzweck entwickelt, sollte die GUI-Entwicklung einfach und schnell am besten durch Zusammenklicken von statten gehen.
Ein Beispiel: auf der Arbeit habe ich eine bestimmte Aufgabe zu erfüllen. Ich denke mir: statt von Hand ginge das mit einem Programm aber deutlich schneller. Vorausgesetzt ich schaffe die Programmierung in ca. 1 Woche. In C++ dauert alleine die GUI 1 Jahr, läuft dann immer noch nicht stabil und ich verliere irgendwann, wenn ich auf einen Button klicke alle meine ach so wichtigen Daten, weil das Programm einfach abbricht! In Java schaffe ich das locker in 3 Tagen und wenn dann noch Fehler drin sind, dann sieht höchstens plötzlich der Button komisch aus, aber die Daten habe ich eigentlich noch nie verloren. Mit Java habe ich es geschafft meine Programmierkenntnisse das erste Mal sinnvoll und nicht nur zum Selbstzweck einzusetzen. Somit kommt es, dass ich solche Sachen fast nur noch mit Java programmiere und kaum noch mit C++. In meiner Freizeit aber, benutze ich C++, da ich hier viel Zeit habe die Programme fertig zu stellen und ich sozusagen perfekten schönen Code schreiben möchte.
Viele Grüße und vielen Dank fürs Lesen ;-)
Stephan
P.S.: Interessant fand ich auch immer den unterschiedlichen Workflow: in C++ fand ich es immer einfach den eigentlichen Algorithmus richtig, sauber und performant zu schreiben. Aber das ganze Drumherum war ein Alptraum. In Java war es immer genau umgekehrt. Das Drumherum war schnell gemacht und sah ansprechend aus. Den eigentlichen Algorithmus aber performant und richtig hinzubekommen war meist sehr schwierig (Hacks waren häufig nötig).