Java im Informatikunterricht der Schule

Objektorientierte Programmiersprache auf Basis einer virtuellen Maschine (https://www.oracle.com/java/)
Antworten
severan
Beiträge: 5
Registriert: Mo Aug 06, 2012 8:27 pm

Java im Informatikunterricht der Schule

Beitrag von severan » Mo Aug 06, 2012 8:44 pm

Hi,

also mein Name ist Hendrik oder kurz Riki, wenn ihr wollt, und ich bin 16 Jahre alt. Ich hab vor einem Jahr damit angefangen, C auf tutorials.at zu lernen. Ich war auf Anhieb überrascht, wie schnell es doch ging, in die mir zuvor so sagenumwobene und unbekannte Programmierwelt einzusteigen und wie leicht es doch nun tatsächlich war zu programmieren. Deshalb gedenke auch weiterhin mit C und später vielleicht auch in C++ zu arbeiten. Doch jetzt, nachdem nun 6 wunderschöne Wochen Sommerferien nur so vorbeirauschten, finde ich mich in der elften Klasse wieder und ich fühle mich auch wieder vollkommen in den Beschlag genommen. Vor dem Eintritt in die Oberstufe habe ich freiwillig gemeldet am Informatikkurs meiner Schule teilzunehmen. Der alleinige Umstand, dass dieser auf freiwilliger Basis stattfindet hat mich schon damals stutzig gemacht, allerdings fand ich es sehr interessant mal unterrichtet zu werden, anstatt sich alles selbst beizubringen und wer weiß, vielleicht eröffnen sich mir ja neue Perspektiven auf das Programmieren.

Aber nun genug der langen Reden und zum eigentlichen Thema: Mit unbehagen habe ich von meinem Fachlehrer erfahren, dass an meiner Schule Java im Informatikunterricht gelehrt wird. Ich bin mir nicht sicher, ob das nun gut oder schlecht ist. Ich meine, ich lerne ja noch C und hab mich auch schon richtig gut darin eingelebt, aber Java noch dazu und das auch noch mit Punkten verbunden? Was haltet ihr davon? Soll ich mit C aufhören und mich vollends auf Java konzentrieren? Zuweilen Java nicht lernen, keine Option ist und es ja wichtig für die Noten ist. Oder doch lieber beide Wege beschreiten?


MfG Riki

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Java im Informatikunterricht der Schule

Beitrag von cloidnerux » Mo Aug 06, 2012 9:03 pm

Aber nun genug der langen Reden und zum eigentlichen Thema: Mit unbehagen habe ich von meinem Fachlehrer erfahren, dass an meiner Schule Java im Informatikunterricht gelehrt wird. Ich bin mir nicht sicher, ob das nun gut oder schlecht ist. Ich meine, ich lerne ja noch C und hab mich auch schon richtig gut darin eingelebt, aber Java noch dazu und das auch noch mit Punkten verbunden? Was haltet ihr davon? Soll ich mit C aufhören und mich vollends auf Java konzentrieren? Zuweilen Java nicht lernen, keine Option ist und es ja wichtig für die Noten ist. Oder doch lieber beide Wege beschreiten?
Du übersiehst hier etwas:
Programmieren als Oberbegriff besteht aus 2 Elementen: Dem egt programmieren, dem beherrschen eine Programmiersprache um das um zu setzten, was man vor hat und der Informatik/Mathematik, mit dem du dein Problem(Das Problem ist der Sachverhalt den es zu lösen gilt, ferner der Weg von einem Punkt zum anderen zu kommen) versuchst zu lösen. Um das mal verständlicher auszudrücken: Du hast einmal eine Programmiersprache, ein Werkzeug, mit dem du zum Ziel gelangst und einmal die Theorie, wie du deinen Weg beschreiten sollst. Dazu gehören Datenstrukturen, Algorithmen, Mathematik.
Und damit ergibt sich für dich und alle anderen die Tatsache: Es ist egal welche Programmiersprache du lernst, solange du das Programmieren, also auch die Informatik/Mathematik dahinter lernst.
Zudem unterscheidet sich Java von der Syntax her nur dahingehend, dass du noch zusätzliche Schlüsselwörter und Klassen-Spezifizierer hast. Zudem ist Java OOP, aber das schadet nicht, es zu lernen.
Damit ergibt sich für dich: Du verlierst erstmal nicht, wenn du Java lernst und nebenher weiter in C programmierst. Meiner Erfahrung nach ist es eher so, dass du sogar besser als Kurskameraden sein wirst, weil du immer wieder Dinge wiederentdeckst und du dir gewisse Denkweisen angewöhnst, die dir helfen schneller und effizienter zu Arbeiten und auch neue Sachverhalte zu verstehen, weil du dich nicht so sehr vond er Syntax ablenken lässt.

Im Endeffekt ist Java aber zum effektiven, also real-Problem orrientiert ein Grauen, weil es eben an vielen stellen zu kompliziert und zu unlogisch ist. Xin kann dir da viel erzählen.
Schaden kann es aber nicht, da Java z.B auch auf Smartphones und im Internet eine gewisse Rolle spielt.
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Java im Informatikunterricht der Schule

Beitrag von nufan » Mo Aug 06, 2012 9:06 pm

Hallo und willkommen im Forum :)
severan hat geschrieben:Was haltet ihr davon? Soll ich mit C aufhören und mich vollends auf Java konzentrieren? Zuweilen Java nicht lernen, keine Option ist und es ja wichtig für die Noten ist. Oder doch lieber beide Wege beschreiten?
Ich würde deswegen nicht aufhören C zu programmieren. Java ist zwar eine andere Sprache als C, trotzdem überschneiden sie sich in wichtigen Dingen. Aber du wirst eben in C Dinge kennen lernen, die du in Java einfach nicht 1:1 umsetzen kannst. Genauso hat Java Features, die es in C nicht gibt (oder nur in C++). Beide Sprachen haben Vor- und Nachteile. Eine Sprache die für alle Anwendungsfälle perfekt ist gibt es nicht. Du kannst dir ja mal diesen Artikel lesen, in dem Java und C++ gegenüber gestellt werden: http://www.proggen.org/doku.php?id=start:cppjava

Soweit mein Tipp. Vielleicht noch kurz zu meiner Person, da wir uns in dieser Hinsicht doch ziemlich ähnlich sind: Ich hab als ich 13 oder 14 war auf tutorials.at angefangen mich mit Programmierung zu beschäftigen. In den ersten 2 1/2 Jahren HTL (Höherer Technischer Lehrgang; Eine Schulform in Österreich mit technischen Schwerpunkt) habe ich auch C und C++ gelernt. Danach wechselten wir zu Java, was mich auch nicht besonders erfreute (Joa, ich hab sogar einen ähnlichen Forenbeitrag wie du geschrieben... ^^ http://www.proggen.org/forum/viewtopic.php?f=22&t=159). Privat habe ich trotzdem weiterhin C++ programmiert und ich hatte keine Probleme damit. Du kannst ja beides lernen, das eine schließt das andere nicht aus. Solange du dir das zeitlich einteilen kannst, ist das kein Problem.

severan
Beiträge: 5
Registriert: Mo Aug 06, 2012 8:27 pm

Re: Java im Informatikunterricht der Schule

Beitrag von severan » Mo Aug 06, 2012 9:56 pm

Hi Leute,

erstmal vielen Dank für die tollen Antworten :D
Du übersiehst hier etwas:
Programmieren als Oberbegriff besteht aus 2 Elementen: Dem egt programmieren, dem beherrschen eine Programmiersprache um das um zu setzten, was man vor hat und der Informatik/Mathematik, mit dem du dein Problem(Das Problem ist der Sachverhalt den es zu lösen gilt, ferner der Weg von einem Punkt zum anderen zu kommen) versuchst zu lösen. Um das mal verständlicher auszudrücken: Du hast einmal eine Programmiersprache, ein Werkzeug, mit dem du zum Ziel gelangst und einmal die Theorie, wie du deinen Weg beschreiten sollst. Dazu gehören Datenstrukturen, Algorithmen, Mathematik.
Und damit ergibt sich für dich und alle anderen die Tatsache: Es ist egal welche Programmiersprache du lernst, solange du das Programmieren, also auch die Informatik/Mathematik dahinter lernst.
Den letzten Aspekt, die Theorie intensiver zu erlernen, erhoffe ich mir durch die Teilnahme im Informatikkurs.

Damit ergibt sich für dich: Du verlierst erstmal nicht, wenn du Java lernst und nebenher weiter in C programmierst. Meiner Erfahrung nach ist es eher so, dass du sogar besser als Kurskameraden sein wirst, weil du immer wieder Dinge wiederentdeckst und du dir gewisse Denkweisen angewöhnst, die dir helfen schneller und effizienter zu Arbeiten und auch neue Sachverhalte zu verstehen, weil du dich nicht so sehr vond er Syntax ablenken lässt.
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. 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. 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?

Im Endeffekt ist Java aber zum effektiven, also real-Problem orrientiert ein Grauen, weil es eben an vielen stellen zu kompliziert und zu unlogisch ist. Xin kann dir da viel erzählen.
Schaden kann es aber nicht, da Java z.B auch auf Smartphones und im Internet eine gewisse Rolle spielt.
Smartphones sind nicht wirklich mein Ding :P Wie sieht es mit Rollenspielen aus? 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.

Ich würde deswegen nicht aufhören C zu programmieren. Java ist zwar eine andere Sprache als C, trotzdem überschneiden sie sich in wichtigen Dingen. Aber du wirst eben in C Dinge kennen lernen, die du in Java einfach nicht 1:1 umsetzen kannst. Genauso hat Java Features, die es in C nicht gibt (oder nur in C++). Beide Sprachen haben Vor- und Nachteile. Eine Sprache die für alle Anwendungsfälle perfekt ist gibt es nicht. Du kannst dir ja mal diesen Artikel lesen, in dem Java und C++ gegenüber gestellt werden: http://www.proggen.org/doku.php?id=start:cppjava
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.

Soweit mein Tipp. Vielleicht noch kurz zu meiner Person, da wir uns in dieser Hinsicht doch ziemlich ähnlich sind: Ich hab als ich 13 oder 14 war auf tutorials.at angefangen mich mit Programmierung zu beschäftigen. In den ersten 2 1/2 Jahren HTL (Höherer Technischer Lehrgang; Eine Schulform in Österreich mit technischen Schwerpunkt) habe ich auch C und C++ gelernt. Danach wechselten wir zu Java, was mich auch nicht besonders erfreute (Joa, ich hab sogar einen ähnlichen Forenbeitrag wie du geschrieben... ^^ viewtopic.php?f=22&t=159). Privat habe ich trotzdem weiterhin C++ programmiert und ich hatte keine Probleme damit. Du kannst ja beides lernen, das eine schließt das andere nicht aus. Solange du dir das zeitlich einteilen kannst, ist das kein Problem.
Wie die Welt doch klein sein kann :D Danke für den Link; Sehr aufschlussreich und ich erkenne, dass wenn man die Wahl hat, sich immer für alles andere als Java entscheiden sollte :lol: . Aber das mit der Zeit ist schon ein echtes Problem. In der Elften kann ich das vielleicht noch umsetzen, beide Sprache zu lernen. Allerdings in der Zwöflten zählen die Punkte ja schon mit ins Abitur rein.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Java im Informatikunterricht der Schule

Beitrag von cloidnerux » Mo Aug 06, 2012 10:24 pm

Wie groß ist der Unterschied zwischen imperativ und objektorientiert tatsächlich?
Es gibt keinen. Objektorientiert enthält imperativ aber nicht umgekehrt.
Was du nicht verwechseln darfst, ist dass imperativ nur bedeutet, dass du sagt: "Mach etwas!", aber deine Daten alle selbst einzeln verwalten musst. Dafür aber größtmögliche Kontrolle hast. Objektorientiert geht aber nun weiter, weil du eben bei größeren Programmen nicht 10k verschiedene Daten als Variablen in einem Programm verwalten kannst, sondern diese Gruppieren und bündeln musst. Und das geschieht durch OOP. Ein Objekt, bzw eine Klasse ist eine Sammlung von Attributen(Variablen) und Methoden, die ein Objekt beschreiben und Funktionalität verleihen. Damit kannst du abgeschlossene Einheiten bauen und nach außen hin sogar die Operatoren überladen, kannst also definieren, das du auf ein Objekt des Typs "Auto" eine beliebige Ganzzahl addiert werden, auch wenn es keinen offensichtlichen sinn hat. Nützlicher wird es aber z.B wenn du Vektorklassen hast, und dann im Code schreiben kannst:

Code: Alles auswählen

vectro3 = vector1 + vector2
statt alle Komponenten einzeln zu Addieren.
Dann ist es ja auch so, dass alle Funktionen Imperativ sind. Also kann man sagen, C ist C++ ohne Klassen doer C++ ist C mit OOP
Smartphones sind nicht wirklich mein Ding Wie sieht es mit Rollenspielen aus? Nicht, dass ich gleich in Spieleprogrammierung steigen will, nur ist im Lehrplan vorraussichtlich soetwas ähnliches geplant
Die Programmiersprache ist nur ein Werkzeug, was du damit machst, ist dir überlassen. Du kannst somit auch Rollenspiele in Java implementieren, Minecraft läuft ja auch auf Java.
Das einzig Limitierende sind wirklich nur dein Wissen und deine Vorstellungskraft, Implementieren lässt sich alles was durch ein endlichen Automat dargestellt werden kann.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Java im Informatikunterricht der Schule

Beitrag von Xin » Mo Aug 06, 2012 11:43 pm

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:

Code: Alles auswählen

vectro3 = vector1 + vector2
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.

Code: Alles auswählen

vector3 = vector_add( vector1, vector2 );


Objektorientierung (eigentlich Datentyporientierung) ist, wenn Funktionen anhand des Datentyps unterschiedliche Funktionen abarbeiten. Wenn ein Tier die Anweisung bekommt einen Laut zu geben

Code: Alles auswählen

Tier t = holeZufaelligesTier();

t.gibLaut();
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. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

severan
Beiträge: 5
Registriert: Mo Aug 06, 2012 8:27 pm

Re: Java im Informatikunterricht der Schule

Beitrag von severan » Di Aug 07, 2012 7:50 pm

Hi,

ich hoffe es stört euch nicht, dass ich etwas von der Informatik-Front erzähle aber ich habe nun heute die ersten 90 Minuten des Informatikkurses hinter mir und als ich las, was Xin über JavaKara geschrieben hat, musste ich doch schon schmunzeln ^^ Und wirklich, nach einer kurzen Absonderung der Programmierkenntnisse des Kurses, also wer unter Anderem schon Erfahrung mit Programmiersprachen hat oder mit Sortieralgorithmen in Java etwas anfangen kann (übrigens wurde uns dieses Video vorgeführt http://youtu.be/ywWBy6J5gz8), stellte er uns vor die Wahl, entweder mit JavaKara irgendetwas anzustellen oder mit Lego Robotern zu spielen. Ich hab Letzteres gewählt, weil mir Kara doch irgendwie bescheuert vorkam und ich mich fragte, was dass zum Unterricht beiträgt, zudem unserer Lehrer uns keinerlei Definition oder sonst was über die Informatik gab. Mit anderen Worten, es gab keine Einleitung in das Thema.
Ist es aber nicht - Java ist gefährlich, denn die sicheren Alternativen von C++, die gibt es in Java nicht.
Ich hab schon ein paar mal gehört, dass Java im Prinzip sicherer sein soll, weil man einen eingeschränkten Zugriff mit Interfaces erwirken kann und deshalb die Mehrfachvererbung, wie sie in C++ erlaubt ist, komplett streichen konnte. Ist Java alles in allem trotzdem unsicherer und unflexibler?

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.
Nun um ehrlich zu sein, habe ich das nicht erwartet. Ich konnte aber, wieder zugegebenermaßen, mir nicht wirklich Genaues vorstellen unter "objektorientiert". Könntest du mir bitte eine Seite vorschlagen, auf der ich mich näher mit Design-Patterns vor allem bezüglich "Objektorientierung" auseinandersetzen kann?

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.
Danke für den Tipp mit dem C++ Tutorial, ich werde es mir mal genauer ansehen.

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.
Bedeutet das, dass Probleme, die kein OOP vorraussetzen genauso gut mit C gelöst werden können und auch noch effizienter? Und bedeutet das folglich, dass Java einfach nur sehr viel von C bzw. C++ abgekupfert hat und bloß andere Namen für ein und die selben Funktionen ausgedacht hat?

In Java darfst Du davon ausgehen, dass 95-100% der OOP-Verwendung das Ergebnis nicht verändern, aber Rechenzeit kosten.
Ich glaube das musst du mir etwas näher erläutern. Sind also die meisten Anwendungen von OOP in Java schlichtweg redundant?

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.
Gibt es auch hier eine gute Seite, wo ich mich genauer informieren kann und der Unterschied zwischen "generierend" und "verallgemeinernd" deutlich wird, da das ja nicht in meinem Kurs gelehrt wird?

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.
Ich werde den Kurs wohl 3 Jahre belegen müssen und laut Lehrplan werden wir nur mit Java arbeiten. Klingt vielleicht blöd und naiv, aber ich hab echt Angst, dass mein Gehirn danach oder schon vorher so verwirrt sen wird, dass ich kaum bis gar nicht einen Einstiegspunkt in C++ finden kann. Das hast du ja schließlich auch geschrieben, dass es einem ungemein schwerer gemacht wird, wenn man sich vorher mit Java vollgemüllt hat.

Ich bin froh in diesem Forum ein paar helfende Programmiercracks gefunden zu haben ;) Ich hoffe es macht euch nichts aus, wenn ich Fragen zu meinem Unterricht poste, zu mir unverständlichen Sachverhalten oder einfach zu Unmöglichem und Unlogischem, das mein Lehrer verzapft.


MfG severan

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Java im Informatikunterricht der Schule

Beitrag von Xin » Di Aug 07, 2012 9:31 pm

severan hat geschrieben:zudem unserer Lehrer uns keinerlei Definition oder sonst was über die Informatik gab. Mit anderen Worten, es gab keine Einleitung in das Thema.
Auch hübsch.

Einfache Einleitung: http://www.proggen.org/doku.php?id=start:why
severan hat geschrieben:
Ist es aber nicht - Java ist gefährlich, denn die sicheren Alternativen von C++, die gibt es in Java nicht.
Ich hab schon ein paar mal gehört, dass Java im Prinzip sicherer sein soll, weil man einen eingeschränkten Zugriff mit Interfaces erwirken kann und deshalb die Mehrfachvererbung, wie sie in C++ erlaubt ist, komplett streichen konnte. Ist Java alles in allem trotzdem unsicherer und unflexibler?
Das Java sicherer sein soll, ist ein Marketing-Gag. Der Mythos, dass C++ unsicher sein soll, gehört eben zum Java-Marketing. Fakt ist aber, dass die Qualität von C++-Quelltexten stärker streut als in Java. Ein guter C++-Programmierer schreibt Code, der bei Architekturproblemen nicht übersetzbar ist, also kein falsches Executable erzeugt. Hier liefert Java keine Unterstützung, das Programm explodiert halt eventuell, wenn man Glück hat, bevor der Kunde es in der Hand hat.
Ein schlechter C++-Programmierer hat mehr Auswahl Mist zu bauen, als ein Java-Entwickler.
Das Resultat ist bei beiden allerdings gleich: Das Programm fliegt einem um die Ohren.
Darum solltest Du Dich darauf konzentrieren, zu lernen, was Du nicht machen darfst und warum das nicht geht.

Mehrfachvererbung ist ein Hilfsmittel, das ich sehr oft verwende. Wenn man nicht versteht, was man tut, kann man ein sogenanntes "Diamant-Problem" erzeugen. Das ist im C++-Bereich im Wiki beschrieben. Wenn man also nicht weiß, was man tut, kann das zu unerklärlichem Verhalten führen. Unerklärlich für den schlecht ausgebildeten Programmierer, das Verhalten selbst ist logisch.

Mehrfachvererbung hat man in Java gestrichen. Das bedeutet, dass man mehr Code schreiben muss, oftmals redundant (gleicher Code mit minimalen Unterschieden). Mehr Code bedeutet mehr Möglichkeiten Fehler zu machen. Geh davon aus, dass in 100 Zeilen eine falsch ist. Sehr qualitativer Code hat 2 Fehler auf 1000 Zeilen. Je weniger Code Du hast, desto besser kannst Du ihn testen, weil er viel benutzt wird. Bei Code, der viel genutzt wird, fallen Fehler schneller auf. Je mehr Code, desto mehr Fehler.
Darum ist generische Programmierung so wichtig geworden: Ein Template schreibt man nur, wenn man den Code mehr als an nur einer Stelle verwenden möchte.
severan hat geschrieben:Nun um ehrlich zu sein, habe ich das nicht erwartet. Ich konnte aber, wieder zugegebenermaßen, mir nicht wirklich Genaues vorstellen unter "objektorientiert". Könntest du mir bitte eine Seite vorschlagen, auf der ich mich näher mit Design-Patterns vor allem bezüglich "Objektorientierung" auseinandersetzen kann?
Objektorientierung ist im C++-Tutorial erklärt. Lern C, dann lern C++. Der Rest ergibt sich.
Design-Pattern wollte ich mal anfangen, habe aber zuviele andere Baustellen im Wiki. Kauf Dir das Buch der "Gang Of Four". Das Buch ist in der Programmierung keine Option, sondern eine Bibel. Das hat jeder halbwegs ernstzunehmende Software-Entwickler im Regal und gelesen.
severan hat geschrieben:Bedeutet das, dass Probleme, die kein OOP vorraussetzen genauso gut mit C gelöst werden können und auch noch effizienter?
Du kannst auch OOP-Probleme effizient in C lösen. In C++ und Java ist es nur einfacher, weil diese Sprachen Dich dabei mehr unterstützen.
C++ ist effizienter als C, insbesondere - wenn man es richtig anwendet - hilft es Dir, Fehler zu vermeiden. C solltest Du lernen, um die Grundlagen (if, while, Funktionen...) zu kennen. Das ist alles identisch zu C++. Und wenn Du das kannst, hast Du C mal gesehen, hast eine Vorstellung davon und benutzt ab dann C++.

Probleme, die kein OOP voraussetzen, sollten ohne OOP gelöst werden. Darum musst Du C++ explizit sagen, wann Du OOP verwenden willst, sonst wird es nicht benutzt.
severan hat geschrieben: Und bedeutet das folglich, dass Java einfach nur sehr viel von C bzw. C++ abgekupfert hat und bloß andere Namen für ein und die selben Funktionen ausgedacht hat?
Java hat eine sehr ähnliche Syntax zu C++, das könnte man als abgekupfert bezeichnen. Schlussendlich hat sich die C/C++-Syntax allerdings weit durchgesetzt und ist erfolgreich. Wenn man etwas anderes macht, sollte man also gute Gründe haben.
severan hat geschrieben:
In Java darfst Du davon ausgehen, dass 95-100% der OOP-Verwendung das Ergebnis nicht verändern, aber Rechenzeit kosten.
Ich glaube das musst du mir etwas näher erläutern. Sind also die meisten Anwendungen von OOP in Java schlichtweg redundant?
Nein, nicht die Anwendungen. Eventuell Code innerhalb der Anwendungen aufgrund der Benutzung von Interfaces, aber das hat nichts mit OOP zu tun.
Wenn mit Hilfe OOP eine Methode einer Klasse gerufen wird, dann kostet das mehr als würde man einfach die Methode der Klasse rufen. In Java muss man mit "final" erklären, dass man auf OOP verzichtet, in C++ muss man mit "virtual" verlangen, dass OOP verwendet wird.
Virtual braucht man auch gelegentlich. Aber eben nicht immer. Solange man "final" in Java nicht ausdrücklich schreibt, zahlt man in Java aber dafür, sofern der Compiler es nicht herausoptimieren kann.
severan hat geschrieben:Gibt es auch hier eine gute Seite, wo ich mich genauer informieren kann und der Unterschied zwischen "generierend" und "verallgemeinernd" deutlich wird, da das ja nicht in meinem Kurs gelehrt wird?
Hier noch nicht. Aber ich kann es Dir erklären, wenn Du generisch programmieren kannst. Und bis dahin habe ich die aktuelle Template-Geschichte im C++-Tutorial hoffentlich auch ersetzt.
severan hat geschrieben:Ich werde den Kurs wohl 3 Jahre belegen müssen und laut Lehrplan werden wir nur mit Java arbeiten. Klingt vielleicht blöd und naiv, aber ich hab echt Angst, dass mein Gehirn danach oder schon vorher so verwirrt sen wird, dass ich kaum bis gar nicht einen Einstiegspunkt in C++ finden kann. Das hast du ja schließlich auch geschrieben, dass es einem ungemein schwerer gemacht wird, wenn man sich vorher mit Java vollgemüllt hat.
Erstens hält Dich niemand davon ab, Dich privat mit C++ auseinander zu setzen. Das wird Dir im Informatikkurs auch helfen, weil Du verstehst, was Du in Java tust. Zweitens habe ich mit Basic angefangen. So richtig lecker mit vielen Gotos, globalen Variablen und so weiter. Menschen, die mit Basic anfangen, sind angeblich für ihr Leben versaut, weil sie nie wieder sauber programmieren lernen.
Mein Code ist nicht perfekt, er wächst ja auch aus dem Problem heraus. Aber wenn ich ihn gesäubert habe, dann kann Dir jedes einzelne Leerzeichen in meinem Code begründen. Falls ein Schüler mir nicht erklären kann, was er da tut, ist der Code falsch, egal ob am Ende das gewünschte Ergebnis rauskommt.
Man kann sein Programmierverhalten durchaus weiterentwickeln.
severan hat geschrieben:Ich bin froh in diesem Forum ein paar helfende Programmiercracks gefunden zu haben ;) Ich hoffe es macht euch nichts aus, wenn ich Fragen zu meinem Unterricht poste, zu mir unverständlichen Sachverhalten oder einfach zu Unmöglichem und Unlogischem, das mein Lehrer verzapft.
Ich kenne Deinen Lehrer nicht. Das kann durchaus ein fähiger Mann sein und Java gilt derzeit als Lehrsprache.
Vom bürokratischen Standpunkt ist euer Lehrplan wirklich interessant und vielseitig.
Und ich habe eine Meinung, die zwar gut begründen kann, aber mein Herangehen muss nicht perfekt für alle angehenden Entwickler auf diesem Planeten sein. Vielleicht ist für Dich dieser Lehrer sogar besser als alles andere. Geh offen an die Sache heran, lerne - darum geht's hier wie da - und entscheide selbst.

Wenn ihr in Java Interfaces durchnehmt, frag ihn, was das Diamant-Problem ist. Wenn er es erklären kann, super. Wenn er keine Ahnung, dann kannst Du mal fragen, was sich die Java-Entwickler eigentlich bei Interfaces gedacht haben....

Aber vorsicht... wer besser als sein Informatiklehrer ist bekommt auch schonmal Punktabzug, weil der Lehrer den Programmablauf in der Klausur nicht mehr versteht... ;-D
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Java im Informatikunterricht der Schule

Beitrag von mfro » Mi Nov 12, 2014 8:05 am

  1. das meiste, was oben schon geschrieben wurde, würde ich so unterschreiben
  2. ich mag Java auch nicht, aber möglicherweise aus etwas anderen Gründen
  3. Programmieren ist und bleibt ein komplexes, fehlerträchtiges Geschäft. Völlig unabhängig davon, mit welcher Programmiersprache man es betreibt:
    • wer mit Assembler (ganz dicht an der Maschine) anfängt, merkt das sofort
    • wer mit Pascal, C, einfachem C++, ... anfängt, denkt am ersten Tag noch: "ist ja ganz einfach", um am nächsten erst zu merken, daß das nicht wahr ist
    • wer mit Java oder C# programmiert, merkt das u.U. nie oder erst, wenn das Kernkraftwerk in die Luft geflogen ist
    "einfacher" ist Java deswegen nicht. Die Komplexität ist nur besser versteckt.
  4. ich habe nie verstanden, wozu es gut sein soll (außer für den Hardware-Hersteller natürlich), ein (ernsthaft produktives) Programm in einem Bytecode-Interpreter langsamer und ineffizienter auszuführen als unbedingt nötig. Für mich sind solche Sprachen der Ausbund an Ineffizienz (und das kann ich nicht leiden). Als Argument kommt dann: "Rechner sind heutzutage so leistungsfähig, daß das keine Rolle mehr spielt".

    Kein Mensch würde ein Auto kaufen, das mit dem Argument beworben würde, daß es so leistungsfähig sei, daß man ständig mit angezogener Handbremse rumfahren könne, ohne es zu merken.
Im Übrigen ist mir kein reales (komplexes, umfangreiches) in Java oder C# geschriebenes Programmpaket bekannt, das nicht mit erheblichen Performance- (und meist auch Stabilitäts-) Problemen zu kämpfen hätte. Ich kenne etliche reale Beispiele, wo Unternehmen dem Java-/C#-Hype aufgesessen sind und komplexe Programmpakete erstellt haben, die später mit ungeheurem Aufwand nach C++ portiert bzw. neu geschrieben wurden, weil sich das als Sackgasse entpuppt hat.

Dasselbe gilt für die (angebliche) Plattformunabhängigkeit: reale, umfangreiche, Java-basierte Programme sind in der Praxis genausowenig plattformunabhängig wie ihre direkt für die Maschine compilierten Gegenstücke. Ich hab' noch keins gesehen, das man tatsächlich (z.B.) von einer Windows-Maschine kopieren und auf einer AIX-Maschine hätte ausführen können.

Daß Java- oder C#-Programme in der Praxis meist an Stabilität zu wünschen übrig lassen, liegt wahrscheinlich nur indirekt an den jeweiligen Sprachen.

Die Idee, gute Programmierer bessere Programme schreiben zu lassen, weil sie sich mehr auf ihre Algorithmen denn auf die "komplizierten" Spracheigenschaften konzentrieren können, mag ja erst mal eine gute sein.

In der Praxis hat sie aber anscheinend dazu geführt, daß schlechter ausgebildete, schlechter bezahlte (= billigere) Programmierer schlechtere, ineffizientere Programme schreiben. Darauf kann ich dankend verzichten.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten