Arbeitsthesen, Preconditions Kolloquium Informatik und Unterricht, Wintersemester 2007 Programmieren • Gibt eine fundamentale Einsicht in die Kerninformatik • Ist nicht ICT, Programmierkenntnisse sind für die meisten Computerbenützer unnötig • Ist für viele Webdesigner, Mathematiker, Naturwissenschafter und Ingenieure notwendig • Entwickelt ganz allgemein die intellektuellen Fähigkeiten und das Problemlösungsverhalten • Fördert die Phantasie und macht Spass • Gehört in den Unterricht, insbesondere im Gymnasium (Ergänzungsfach, Grundlagenfach?) Soll und kann ich mit Java programmieren? Aegidius Plüss, Bern www.aplu.ch Original: www.aplu.ch/kolloquium Kolloquium Informatik und Unterricht Wintersemester 2007 1 Kolloquium Informatik und Unterricht Inhalt Wintersemester 2007 2 Inhalt 1. Teil: Tabula rasa • • 4. Teil: Eignet sich Java als Unterrichts- und Einsteigersprache? Wir beginnen von ganz vorne, ohne Vorurteile Wir sind "erblich" (von unseren eigenen Lehrpersonen) unbelastet • • • • • 2. Teil: Programmier-Paradigmen • • • • Was ist Programmieren? Prozedurale Programmierung, Kapselung Datentypen, streng typisierte Sprachen Formularorientierte Programmierung 3. Teil: To OOP or not to OOP, that is the question • • 5. Teil: Einstiegsvarianten Falls GUI, keine Alternative! Optimales methodisches Vorgehen: • • Wahl der IDE Anatomie eines Java-Programms OOP in fünf Minuten Vermeidung von Vorwärtsbezügen Didaktische Klassenbibliotheken 6. Teil: Sample Session: OOP mit Java Zuerst ohne OOP, dann OOP hinzufügen OOP von Anfang an 7. Teil: Diskussion (hoffentlich heftiger Protest) Kolloquium Informatik und Unterricht Wintersemester 2007 3 Kolloquium Informatik und Unterricht Wintersemester 2007 4 1 1. Teil: Tabula rasa Was ist Programmieren? • Die Informatik hat zwar eine historische Dimension. Lehrplan und Methodik eines Programmierkurses snd nicht daran zu orientieren (Hinweise genügen) • Programmieren bezeichnet die Tätigkeit, Computerprogramme (Software) zu erstellen (sehr pragmatisch, was sind Computerprogramme?) • Die meisten Lehrpersonen sind durch ihren eigenen Wertegang, ihre Kenntnisse und ihre Vorlieben vorbelastet (Hardware-Plattform, Einsatzgebiet, Betriebssystem, Entwicklungsumgebung, Programmiersprache). Junge Menschen sind unbelastet • Programmieren ist die Umsetzung von Algorithmen in eine computerlesbare Form (etwas vornehm, der meiste Code besteht nicht aus Algorithmen, was sind Algorithmen?) • Programmieren ist eine Kunst... • Computer sind ausschliesslich sequentielle Maschinen. Diese Vorstellung ist falsch: Ereignisgesteuerte Programme, Threads, Client-Server-Systeme Kolloquium Informatik und Unterricht Wintersemester 2007 5 2. Teil: Programmier-Paradigmen Kolloquium Informatik und Unterricht Wintersemester 2007 6 Prozedurale Programmierung, Kapselung Prozedurale Programmierung, Kapselung • Programme sollten lediglich die drei Grundstrukturen Sequenz, Selektion, Iteration aufweisen (Böhm, Jacopini, Interface (Loch in Schutzhülle) Kapsel (Haut schützt) 1966) • Programme sollten aus funktionalen Blöcken (klassisch: Prozeduren, Funktionen, Methoden, Subroutinen; modern: Module, Objekte) bestehen, deren Schnittstelle klar beschrieben wird, und die interne Daten vor dem Zugriff schützen (Geheimnisprinzip, Kapselung). Sie sollten möglichst keine Veränderung an äusseren Daten vornehmen (keine Seiteneffekte) • Wichtige Begriffe: globale und lokale Variable, formale und aktuelle Parameter, Werte- und Variablenparameter Methoden (Würmer) Daten (Fruchtfleisch, Kerne) Dominiert das Programmieren seit 50 Jahren bis zum heutigen Tag! Kolloquium Informatik und Unterricht Wintersemester 2007 7 Kolloquium Informatik und Unterricht Wintersemester 2007 8 2 Beispiel: PHP PHP, einige Fragen... <?php function getMax($a, $b) { if ($a > $b) return $a; return $b; } • Ist PHP weit verbreitet? Brauchst Du es? • Ist PHP einfach? (Ist Java, C++, usw. einfach?) • Ist PHP wesentlich anders als andere prozedurale Programmiersprachen (Syntax, Semantik)? • Ist PHP eine universelle höhere Programmiersprache? • Ist es gut, dass man erst dann mit dem Erlernen einer Programmiersprache beginnt, wenn man für eine Website PHP braucht? • Wieviel Zeit verbratet man mit dummen Fehlern in PHP, wenn man keine Ahnung vom Programmieren hat? • Umgekehrt: Wie schnell hat man PHP im Griff, wenn man vorher die Grundprinzipien des Programmierens kennt? "PHP ist ein performanter Hack!" Anwendungslogik if (isset($_GET["Submit"])) { $a = $_GET["ta"]; $b = $_GET["tb"]; $result = getMax($a, $b); } ?> <html><body> Präsentationslogik <form name = "form1" method = "get"> <p>1. Zahl: <input type="text" name = "ta" value = "<? echo $value1 ?>"></p> <p>2. Zahl: <input type="text" name = "tb" value = "<? echo $value2 ?>"></p> <p>Resultat: <input type="text" name = "tr" value = "<? echo $result ?>" ></p> <p><input type="submit" name = "Submit" value = "Submit"> </p> </form></body></html> Kolloquium Informatik und Unterricht Wintersemester 2007 9 Datentypen, streng typisierte Sprachen Nicht typisierte Sprachen Pascal (Familie) C/C++ Java VB.NET PHP Python VBScript Kolloquium Informatik und Unterricht 10 Vorteile Typisierte Sprachen Nicht typisierte Sprachen • • • • Häufige Programmierfehler werden zur Compilationszeit angezeigt (sind Syntaxfehler) Datentypen spielen insbesondere in der OOP eine fundamentale Rolle (Klassen sind Datentypen) Für robuste, fehlertolerante System geeignet • • Für den schnellen Einstieg und das schnelles Prototyping gut geeignet Meist Interpreter, einzelne Anweisungen können als Test ausgeführt werden Als Zusatz zu bestehenden Systemen geeignet: Scriptsprachen, Websprachen Nachteile • • Wintersemester 2007 Wintersemester 2007 Typisierte versus nicht typisierte Sprachen • Streng typisiert: Eine Variable besitzt einen zur Compilationszeit festgelegten Datentyp. Es können ihr nur Werte von diesem Datentyp zugewiesen werden • Nicht typisiert: Eine Variable erhält zu Laufzeit den Datentyp des zugewiesenen Werts Streng typisierte Sprachen Kolloquium Informatik und Unterricht 11 Aufwändiger, das Typcasting (Umwandlung von Typen) ist anspruchsvoll Am Anfang etwas gewöhnungsbedürftig, da in der Mathematik keine Typenbindung von Variablen Kolloquium Informatik und Unterricht • • Viele dumme, aber auch heikle Programmierfehler werden erst zu Laufzeit (oder nie) gemerkt Der Datentyp ist zentraler Begriff einer Programmiersprache. Er wird als sekundär betrachtet Wintersemester 2007 12 3 Formularorientierte Programmierung Beispiel: VB.NET = "neues" Paradigma? Installation von Visual Studio Express gemäss Anhang. VB Sample Session: • Visual Basic verdankt seinen Erfolg: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim value1 As String Dim value2 As String Dim a As Integer Dim b As Integer value1 = TextBox1.Text value2 = TextBox2.Text a = CInt(value1) b = CInt(value2) TextBox3.Text = CStr(Ggt(a, b)) End Sub • Nachfolger altgedienter Interpreter (Turbo Basic, QuickBasic, Comodore Basic, usw.) • Formularbasierte Entwicklungsumgebung zur schnellen interaktiven Erstellung von GUI-Applikationen • Integration in die .NET-Sprachen, zusammen mit C++ und C# • Gratis-Version der Entwicklungsumgebung "Visual Studio Express" • Formularorientierte Programmierung ist • eventgesteuert, d.h. gemäss der Programmstruktur: "wann immer das Ereignis eintritt, dann tue..." • objektorientiert: GUI-Elemente besitzen Private Function Ggt(ByVal a As Integer, ByVal b As Integer) As Integer If b = 0 Then Return a End If Return Ggt(b, a Mod b) End Function • Eigenschaften (Attribute, Properties, Instanzvariablen) • Verhalten (Subroutines, Methoden, Prozeduren, Funktionen, Operationen) Kolloquium Informatik und Unterricht Wintersemester 2007 13 Visual Basic, einige Fragen Kolloquium Informatik und Unterricht Wintersemester 2007 14 3. Teil: To OOP or not to OOP Shakespeare's Hamlet: • • • • • Ist VB weit verbreitet? (MS-Windows only) Ist VB einfach? Ist die Syntax von VB modern? Ist VB eine volle objektorientierte Programmiersprache? Wie schnell kann man unter VB animierte Grafik machen (z.B. Julia-Menge)? • Ist in der Ausbildung die Ausrichtung auf formularorientierte Programmierung statthaft? Wo sind die klassischen sequentiellen Abläufe? To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? To die: to sleep; No more • OOP gehört zu den grundlegenden Informatikkenntnissen • Falls GUI- und Fensterprogrammierung, ist OOP eine Notwendigkeit! • Hybride Sprache: zuerst ohne OOP/GUI, dann hinzufügen? (Typisch C/C++) • Zwei Sprachen: zuerst Pascal, LOGO, Scriptsprache, dann OOP/GUI? Dieselben Fragen könnte man bezüglich Delphi/Lazarus stellen... (mit etwas unterschiedlichen Antworten) Kolloquium Informatik und Unterricht Wintersemester 2007 Sein oder Nichtsein; das ist hier die Frage: Obs edler im Gemüt, die Pfeil und Schleudern Des wütenden Geschicks erdulden oder, Sich waffnend gegen eine See von Plagen, Durch Widerstand sie enden? Sterben - schlafen Nichts weiter! 15 Kolloquium Informatik und Unterricht Wintersemester 2007 16 4 4. Teil: Eignet sich Java im Unterricht? Wahl der Entwicklungsumgebung (IDE) • Die IDE ist die erste und dann die tägliche Berührung mit der Programmiersprache. Besonders geeignet: These: Java ist eine Programmiersprache, die den Ansprüchen einer modernen Unterrichtssprache gerecht wird, und dies aus folgenden Gründen: • • • • • Setzt man didaktische Programmbibliotheken ein, so ist der Einstieg sanft und motivierend (Turtle, Grafikfenster) Ja, Sie können sich an Java heran wagen... • Meine bevorzugte IDE: NetBeans • Java ist die Programmiersprache mit der grössten Zahl von Lehrbüchern und Online-Beiträgen • Java wird weltweit an Lehrinstitutionen am häufigsten eingesetzt • Java ist auf alle üblichen Plattformen (Mac, Windows, Linux) gleichartig einsetzbar (sogar gleiche IDE) Kolloquium Informatik und Unterricht Wintersemester 2007 • • • • • • 17 kostenlos mehrere Sprachversionen (auch Deutsch) mehrere Plattformen (Linux, Mac, Windows) intelligenter Editor (automatische Syntaxprüfung) hervorragender GUI-Builder Kurzanleitungen: www.netbeans.org, www.aplu.ch/forum Kolloquium Informatik und Unterricht Online-Editor (www.java-online.ch) Wintersemester 2007 // MyTurtle.java Kommentar Bibliotheksimport import ch.aplu.turtle.*; Klassendeklaration class MyTurtle { Turtle t = new Turtle(); Instanzierung der Turtle MyTurtle() { • auch zum Selbststudium • Quellcode kann im Editor übernommen und ausgeführt werden Konstruktor Methodenblock } • Entwicklungsumgebung für Lego-Robotik (Edit/Compile/Download) • Entwicklungsumgebung für Handy-Programmierung (J2ME) Wintersemester 2007 18 Anatomie eines Java-Programms • Praktisch kein Installationsaufwand (nur JRE) • Basiert auf Applets und WebStart • Integrierte, im Unterricht erprobte Lernprogramme Kolloquium Informatik und Unterricht NetBeans (www.netbeans.org) Eclipse (www.netbeans.org) JCreator (www.jcreator.com) Online-Editor PHBern (www.java-online.ch) public static void main(String[] args) { new MyTurtle(); } Entry point (main) Erzeugung einer Applikationsinstanz } 19 Kolloquium Informatik und Unterricht Wintersemester 2007 20 5 Paradigmenwechsel Tue es nicht! • Man kann zwar in Java auch (fast) prozedural (ohne OOP) programmieren, indem man den Code in main() schreibt und alle Methoden static macht: Ein Programm ist nicht Aneinanderreihung von Code 10 20 30 40 50 60 INPUT A INPUT B IF A > B PRINT 'A IST GROESSER ALS B' GOTO 60 PRINT ‘A IST KLEINER ALS B’ END class TueEsNicht { static int ggt(int a, int b) { if (b == 0) return a; return ggt(b, a % b); } sondern: Ein Programm ist ein Objekt! (Instanz der Applikationsklasse) class MyProg { main() { new MyProg() } } public static void main(String[] args) { System.out.println(ggt(15, 12)); } } Kolloquium Informatik und Unterricht Wintersemester 2007 21 Kolloquium Informatik und Unterricht Tue es so! int ggt(int a, int b) { if (b == 0) return a; return ggt(b, a % b); } public static void main(String[] args) { new TueEsSo(); } 22 OOP in 5 Minuten: Kapselung in Klassen import ch.aplu.util.*; class TueEsSo { TueEsSo() { Console c = new Console(); c.print("a: "); int a = c.readInt(); c.print("b: "); int b = c.readInt(); c.print("Der Ggt ist " + ggt(a, b)); } Wintersemester 2007 // ------------------------ Klasse Rechteck -----------------class Rechte { double l; double b; Konstruktor Konstruktor (Initialisierung) public Rechteck(double laenge, double breite) { l = laenge; b = breite; } Consolefenster Methoden des Consolefensters Methode (Verhalten) public void zeige(GPanel p, double xMitte, double yMitte) { p.move(xMitte, yMitte); p.rectangle(l, b); } Methode (nicht statisch) public void fuelle(GPanel p, double xMitte, double yMitte) { p.move(xMitte, yMitte); p.color(Color.red); p.fillRectangle(l, b); } Applikationsinstanz erzeugen Instanzvariablen (Eigenschaften) Methode (Verhalten) } } Kolloquium Informatik und Unterricht Wintersemester 2007 23 Kolloquium Informatik und Unterricht Wintersemester 2007 24 6 OOP in 5 Minuten: Vererbung // ------------------------ Klasse Quadrat ------------------class Quadrat extends Rechteck { public Quadrat(double seitenlaenge) { super(seitenlaenge, seitenlaenge); } Klassendeklaration (abgeleitete Klasse) public void fuelle(GPanel p, double xMitte, double yMitte) { p.move(xMitte, yMitte); p.color(Color.green); UML-Diagramm: p.fillRectangle(l, b); } Methode (überschrieben) public class App { public App() { GPanel p = new GPanel(0, 10, 0, 10); Konstruktor Initialisierung der Basisklasse Rechteck r1 = new Rechteck(4, 2); Quadrat s1 = new Quadrat(3); Rechteck r2 = new Rechteck(1, 8); Vector<Rechteck> v = new Vector<Rechteck>(); v.add(r1); v.add(s1); v.add(r2); Klassenhierarchie } OOP in fünf Minuten: Polymorphie Basisklasse (Mutter) Ein Quadrat IST EIN Rechteck, kennt daher zeige() Abgeleitete Klasse (Kind) } Applikationsklasse Instanzierung GPanel Instanzierung Objekte Container-Klasse Elemente hinzufügen for (Rechteck re : v) re.zeige(p, 2.5, 5); Elemente durchlaufen for (Rechteck re : v) re.fuelle(p, 7.5, 5); Elemente durchlaufen Es wird das zum Datentyp gehörende fuelle() aufgerufen public static void main(String[] args) { new App(); } Instanzierung der Applikationsklasse } Kolloquium Informatik und Unterricht Wintersemester 2007 25 Ist der Mathematikunterricht einfacher? Kolloquium Informatik und Unterricht Wintersemester 2007 26 Vermeidung von Vorwärtsbezügen • Die Kunst des Unterrichtens besteht darin, den Unterricht in angepasst kleine Lernschritte zu strukturieren, dass der Lernende weder unter- noch überfordert wird. • Neue Begriffe sollen unter Berücksichtigung des gegenwärtigen Wissensstandes und der Persönlichkeit des Lernenden eingeführt werden und müssen von ihm logisch nachvollziehbar sein. Nichts ist umsonst: • • • • • Kolloquium Informatik und Unterricht Hochsprung Geigenspiel Elektrodynamik ... Programmieren • Zu einem systematisch aufgebauten Unterricht gehört der weitgehende Verzicht auf Unerklärbares und auf Hinweise, dass ein Verständnis erst später möglich sei. Freude herrscht, wenn Widerstand gebrochen! Wintersemester 2007 27 Kolloquium Informatik und Unterricht Wintersemester 2007 28 7 Java's Schwächen als Unterrichtssprache Didaktische Klassenbibliotheken • Ohne didaktische Klassenbibliotheken ist der Einstieg in Java (zu?) schwierig • Besonders geeignet: • Das ominöse Main: public static void main(String[] args) • Variablenkonzept: • Basistypen: int, double, usw. sind keine Objekte • Referenztypen: Variablendeklaration erzeugt kein Objekt, sondern nur eine Referenz auf ein Objekt. Diese werden ausschliesslich mit new erzeugt: Turtle t; // Variablendeklartion t = new Turtle(); // Objekterzeugung und Zuweisung • Es gibt nur Werte- aber keine Variablenparameter • Es gibt keine Zeiger, denn alle Referenzen sind bereits Zeiger Kolloquium Informatik und Unterricht Wintersemester 2007 29 – – – – Turtle (Mehrere Turtles im gleichen Fenster) Grafikfenster mit Benützerkoordinaten (GPanel) Konsolenfenster für Ein- und Ausgabe (Console) Hilfsklassen: HiResTimer, SoundPlayer, JRunner • Beim Einstieg kann weitgehend auf den OOPKlassenentwurf (Vererbung, Polymorphie) verzichtet werden • Für die Programmierung klassischer Algorithmen geeignet. Beispielprogramme aus C/C++, Basic und Pascal können in der Regel leicht übernommen werden Kolloquium Informatik und Unterricht Drei Arten der Komplexitätsreduktion • "Hello World" ausschliesslich mit dem Java API • konsolenorientiert • formularorientiert (GUI-Builder) • Applets • Web-Programmierung (JSP) • Java exemplarisch: • C++/Champ (enthält Multiple Turtle, CPWindow) • Logo (turtlebasiert!) • Kara (turtlebasiert!) • • • • • • Lernsprachen sind eine alte Tradition der ETH Zürich, gemäss der Lebensphilosophie von N. Wirth: "Gibt es keine Programmiersprache, welche meinen Vorstellungen entspricht, so erfinde ich sie" Wintersemester 2007 30 5. Teil: Java-Einstiegsvarianten • Klassenbibliotheken verdecken zwar eine Menge an kompliziertem Code, es werden aber nicht alle Fallgruben entfernt, sondern der Lernende muss sich in der harten Wirklichkeit zurechtfinden • Glashaus-Systeme: der Lernende befindet sich in einer "geschützten Umgebung". Beispiele: Kolloquium Informatik und Unterricht Wintersemester 2007 31 Turtle (Logo orientiert) Console (traditionell) GPanel ("ein Bild sagt mehr als tausend Worte") Lejos (robotikorientiert, Java für Lego Mindstorm) J2ME (handyorientiert) Kolloquium Informatik und Unterricht Wintersemester 2007 32 8 Sample Session: OOP mit Java Weihnachtssterne • Top-Down-Design • Sterne sind Objekte mit • Eigenschaften (Grösse, Farbe, usw.): Instanzvariablen • Verhalten ("erscheine an diesem Ort"): Methoden • Es lassen sich beliebig viele Sterne (Objekte) erzeugen • Zwei Programmkonzepte: • sequentieller Code (klassisch) • formularorientiert (eventgesteuert) Let's do it (Learning by Doing) Kolloquium Informatik und Unterricht Wintersemester 2007 33 9