severan hat geschrieben:Ich habe mich natürlich angesichts der Zukunftsaussichten etwas ausführlicher mit Java auseinandergesetzt, mir verschiedene Tutorials teils sporadisch teils genauer angesehen und ich erkannte schon einige Gemeinsamkeiten zumindest im Syntax.
Zunächst willkommen im Forum.
Und dann: Vorsicht! Nicht alles, was gleich aussieht bedeutet das gleiche. Wichtigstes Kritikmerkmal ist hier, dass der Punktoperator ( Klasse.Methode() ) in C und C++ sehr sicher ist, während der Pfeil-Operator ( Klasse->Methode() ) den Programmierer warnt, dass hier ein Risiko besteht. Was in Java als Klasse.Methode() geschrieben wird, sieht erstmal sicher aus, ist aber in Wirklichkeit das gleiche wie in C++ der Pfeiloperator. Das ist kein Versehen, das soll hübsch aussehen, damit Leute, die nur mal so gucken, denken, dass es auch gleich ist. Ist es aber nicht - Java ist gefährlich, denn die sicheren Alternativen von C++, die gibt es in Java nicht.
Hier gibt es noch einige weitere Stolpersteine.
severan hat geschrieben:Doch wer keine Vorkenntnisse in Programmierung hat, blickt da doch niemals durch. Für mich ist es so, dass das imperative Programmierparadigma bei C mich deutlich mehr anspricht und auch "einfacher" erscheint, während mir die Denkweise der objektorientierten kaum zusagt.
Objektorientiertes Programmieren ist kein Pradigma. Das wird Dir Dein Informatiklehrer vermutlich anders beibringen, er wird Dir Fachbücher zeigen, wo das drin steht und er kann Dir problemlos einen Prof ranschaffen, der das gleiche erzählt.
Trotzdem Schwachsinn.
Objektorientierte Programmierung ist ein sogenanntes Design-Pattern: Eine Standard-Lösung für ein Standard-Problem. Du kannst problemlos in C objektorientiert programmieren, obwohl C angeblich keine objektorientierte Programmiersprache ist, genauso wie Du in Java so programmieren kannst, wie Gott es selbst für C verboten hat.
Das C++-Tutorial hier zeigt Dir OOP mit C und zeigt Dir dann, wie es mit C++ läuft.
Und es zeigt Dir vor allem, warum Du OOP vermeiden solltest, wann immer es geht. Man braucht es nämlich ziemlich selten. Deswegen muss man es in C++ anfordern (per Default wird es nicht benutzt, weil es Rechenzeit kostet) und in Java ist es guter Stil, es abzuschalten, wenn man es nicht braucht (aber das weiß keiner und es wird Default genutzt).
Wieder haben wir optisch gleichen Code, aber unterschiedliches Verhalten der beiden Sprachen.
Nun, warum sollte OOP möglichst nicht verwenden? Es ist ein Design-Pattern: Standard-Problem => Standard-Lösung. Dass ein Standard-Problem in der Informatikwelt immer mal wieder auftritt, bedeutet nicht, dass es grundsätzlich auftritt. Man sollte also begreifen, welches Problem man lösen möchte und wenn man kein OOP-Problem hat, dann verändert die Lösung OOP nicht das Ergebnis aber die Laufzeit des Programms: es wird langsamer.
In Java darfst Du davon ausgehen, dass 95-100% der OOP-Verwendung das Ergebnis nicht verändern, aber Rechenzeit kosten. Rechenzeit ist billiger als Programmierer, die verstehen, was sie tun.
severan hat geschrieben:Da hätte ich noch eine Frage nebenbei: Viele behaupten, dass der Syntax von C und C++ ähnlich ist, fast alle Sprachelemente von C auch in C++ vorkommen und dazu C++ auch noch abwärtskompatibel zu C ist. Trotzallem ist C++ objektorientiert. Warum? Wie groß ist der Unterschied zwischen imperativ und objektorientiert tatsächlich?
C++ ist nahezu vollständig kompatibel zu C. Beide Sprachen entwickeln sich aber unterschiedlich, man versucht sie zusammenzuhalten, aber es gibt schon einige kleine Unterschiede, die normalerweise aber nicht zum tragen kommen. C wird heute meist mit C++-Compilern übersetzt.
C++ hat Erweiterungen zu C, die Objektorientierte Programmierung vereinfachen. C++ war ursprünglich ein Art Zusatzlibrary für C, kein eigener Compiler. Damit konnte man mit einem normalen C-Compiler vereinfacht objektorientiert programmieren. Weil's so praktisch war, wurde es dann eine eigene Sprache.
Ansonsten hat C++ heute Erweiterungen, die in C nicht mehr so einfach machbar sind, bzw. nur durch sehr böswilliges Hacken: Templates. Hier kannst Du generisch Programmieren. Und das meint 'generierend', nicht nur 'verallgemeinernd', wie es die Generics in Java tun: Du programmierst ein "Muster" (engl. Template) für Programm, welches das C++-Programm generiert, das Du schreiben möchtest - oder auch ein anderes mit ähnlichem "Muster".
Generics stehen auf eurem Lehrplan schon nicht mehr drauf. Das würde ich deutlich eher als "Paradigma" begreifen als OOP.
severan hat geschrieben:Nicht, dass ich gleich in Spieleprogrammierung steigen will, nur ist im Lehrplan vorraussichtlich soetwas ähnliches geplant
http://www.jrg-wedel.de/download/stoffv ... rmatik.pdf. Ich bin zwar nicht G8 (insgesamt 12 Jahre lang Schule) aber so oder so ähnlich wirds wohl sein.
Der Lehrplan hat zur Hälfte wirklich gute Sachen. Wenn ich aber sowas wie JavaKara sehe, möchte ich Deinen Informatiklehrer aber mit Robotern und irgendeinem anderen Müll bewerfen, der mich im Info-Unterricht quälte. Marienkäfer machen es da nicht besser.
severan hat geschrieben:Ich hatte jetzt auch nicht vor, aprubt aufzuhören in C zu schreiben. Es gibt schon Gemeinsamkeiten, soweit ich das ausloten und erlesen konnte, aber einige Konzpete wie Threads oder Sockets sind mir suspekt
Was Xin da schreibt, klingt aber echt schlimm, muss ich sagen. Und vorallem kompliziert.
Wenn Du interessiert bist, lässt sich das alles auseinander nehmen.
Es klingt natürlich kompliziert, weil viele Dinge teilweise professionellen Programmieren, also studierten Informatikern, nicht bewusst sind. Wer verstehen will, warum Java ein Griff ins Klo ist, muss über Java hinaus denken können. Dafür reicht es bereits C++ denken zu können, denn über Java wurde schon hinaus gedacht, bevor Java entwickelt wurde. Und wer verstehen will, was C++ alles anbietet, muss sich schon auch mal ein Jahrzehnt damit beschäftigen. Nach 10 Jahren Programmierpraxis macht man aber auch kein JavaKava mehr, sondern ernstzunehmende Projekte und dann ist es schon ärgerlich, wenn beim Java-Programmierer willkürlich die Fehler durch die Gegend geworfen werden und der C++ Programmierer von seinem Compiler vor dem Compilieren auf seine Fehler aufmerksam gemacht wird, viele Fehler also gar nicht mehr formulieren kann.
So sieht das dann auch im professionellen Einsatz aus: Die Fehler, die Java vermeidet, macht in C++ keiner mehr, die echt bösen Fehler, die in großer Software von einem Entwickler nicht mehr begriffen werden können, prüft Java nicht. C++ aber wenigstens teilweise.
Wenn Du Dich freiwillig für den Informatikunterricht entschieden hast - wunderbar. Mach den Kurs, Du wirst da vieles lernen. Auch mit Java. Du kannst Java als Medium für dieses Wissen verwenden, wie Du einen Sortieralgorithmen schreibst, objektorientiert programmierst und so weiter. Java ist als Anfängersprache konzipiert - um billige Programmierer auszubilden. Billige Ausbildung => billiges Gehalt. Blöderweise aber halt auch billige Software.
Willst Du ernsthaft an die Grenzen gehen, brauchst Du ein ernsthaftes Werkzeug. Qualitative Konzepte für große Softwareprodukte sind in Java nicht formulierbar. Was nicht formulierbar ist, kann man nicht unterrichten, das verkürzt die Ausbildungsdauer. Was man nicht formulieren kann, kann man nicht denken. Darum ist Java für einen professionellen Anspruch höchstens als "Übergangssprache" interessant.
Als studierter Informatiker, sage ich Dir, dass Java im Vergleich zu C++ nichts zu melden hat, sogar Fehler provoziert. Ich habe als Java-Entwickler gearbeitet und damit ich das nochmal mache, muss das Gehalt also schon üppig ausfallen. Ich rate dazu, C++ zu lernen. Das Lernen ist härter, aber wenn Du beginnst echte Software zu schreiben, wird sich das auszahlen.
cloidnerux hat geschrieben:Wie groß ist der Unterschied zwischen imperativ und objektorientiert tatsächlich?
Es gibt keinen. Objektorientiert enthält imperativ aber nicht umgekehrt.
Objektorientiert ist imperative Programmierung und imperative Anweisungen können objektorientierte Abläufe beschreiben.
cloidnerux hat geschrieben:
Nützlicher wird es aber z.B wenn du Vektorklassen hast, und dann im Code schreiben kannst:
statt alle Komponenten einzeln zu Addieren.
Das ist Operatorüberladung und das geht mit der OOP-Sprache Java nicht.
Und es hat auch nichts mit OOP zu tun, selbst wenn es sich um Klassen handeln würde, so würde es nur Vektoren geben, also nichts, weswegen man ein Objekt vom anderen unterscheiden müsste.
Ob die Daten als Klassen (C++, Java, C#) oder Structs (C, C++, C#) gebündelt sind, spielt dabei keine Rolle. Folgende Zeile kann aus allen Sprachen sein und löst das Problem gleichwertig.
Objektorientierung (eigentlich Datentyporientierung) ist, wenn Funktionen anhand des Datentyps unterschiedliche Funktionen abarbeiten. Wenn ein Tier die Anweisung bekommt einen Laut zu geben
Dann entscheidet sich anhand des Tieres (des Tiertyps), welche Implementation der Funktion gibLaut() ausgeführt wird. Bei einer Katze würde eine "Miau"-Implementation kommen, bei einem Hund "Wau"-Implementation. Hunde und Katzen sind Ableitungen von "Tier", sie gehören also beide der Lebewesen-Klasse "class Tier" an, und können ihre Funktionen Tiertyp-beliebig implementieren, darum implementiert der Hund gibLaut() anders als die Katze. Es ist also abhängig vom Tiertyp/Datentyp.
Echte Objektorientierung wäre es, wenn jedes Objekt eine beliebige Implementation hätte, sich die Implementation also am individuellen Objekt orientieren würde, statt am Datentyp. Dann könnte auch jede Katze unterschiedlich miauen und jeder Hund unterschiedlich bellen. Man könnte sogar einzelne Katzen-Objekte züchten, die grunzen. Und Papageien könnten sprechen lernen, ohne dass aufgrund der Member-Variablen eine Fallunterscheidung stattfinden müsste. DAS nenne ich objektorientiert. ^^