{"id":9721,"date":"2017-08-06T13:56:40","date_gmt":"2017-08-06T11:56:40","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=9721"},"modified":"2023-06-12T09:14:38","modified_gmt":"2023-06-12T07:14:38","slug":"der-java-klassendiagramm-implementierungs-aufgaben-generator","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2017\/08\/der-java-klassendiagramm-implementierungs-aufgaben-generator.htm","title":{"rendered":"Der Java-Klassendiagramm-Implementierungs-Aufgaben-Generator"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2017\/08\/der-java-klassendiagramm-implementierungs-aufgaben-generator.htm#comments'>11 Kommentare.<\/a>)<\/small> <\/div><p><em>Nachtrag: aktualisierte Fassung des Programms ist am Ende des Beitrags<\/em><\/p>\n<p>Das mit dem Verstehen ist ja sch\u00f6n und gut, aber bei Sprachen &#8211; Programmiersprachen wie anderen &#8211; reicht es nicht, wenn man die grammatischen Kategorien kennt, man muss die Sprache auch anwenden k\u00f6nnen. In Bayern lernen die Sch\u00fcler in Informatik in der 10. Klasse Gymnasium (im naturwissenschaftlich-technologischen Zweig) die Grundprinzipien es objektorientierten Modellierens und Programmierens. Mit den Prinzipien haben sie auch wenig Schwierigkeiten; Klassendiagramme kriegen sie einigerma\u00dfen hin &#8211; aber das Umsetzen der Diagramme in Programmcode macht vielen mehr Probleme.<\/p>\n<p>Also habe ich mir vorgenommen, im n\u00e4chsten Durchgang mehr zu pauken. Eine Doppelstunde nur Klassendiagramme implementieren. Und dann nochmal, wenn es n\u00f6tig ist. Das kriegt man n\u00e4mlich nur durch \u00dcbung rein. &#8211; Ob ich das dann wirklich so mache, h\u00e4ngt nat\u00fcrlich von der konkreten Klasse ab. Aber ich habe mir schon etwas vorbereitet, und zwar den Java-Klassendiagramm-Implementierungs-Aufgaben-Generator. So sieht er aus:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9723\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/java-aufgabengeber.png\" alt=\"Benutzeroberfl\u00e4che Programm\" width=\"600\" height=\"422\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/java-aufgabengeber.png 600w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/java-aufgabengeber-150x106.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/java-aufgabengeber-300x211.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/java-aufgabengeber-200x140.png 200w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Wenn man auf den wei\u00dfen Knopf kriegt, erzeugt und speichert das Programm zwei Textdateien. Die eine ist ein Klassendiagramm f\u00fcr eine zuf\u00e4llig erstellte Klasse, mit 1 zuf\u00e4llig ausgew\u00e4hlten Attribut, einem Standardkonstruktor und je einer getter- und setter-Methode f\u00fcr das Attribut:<\/p>\n<pre>|--------------------\n| Raumschiff\n|--------------------\n| alter: int\n|--------------------\n| Raumschiff()\n| getAlter(): int\n| setAlter(int): void\n|--------------------<\/pre>\n<p>Wenn man sparsam mit den Leerzeilen ist, kann man das in sechs kurzen Zeilen programmieren. Wenn die Sch\u00fclerin das getan hat, importiert sie die zweite Datei, die das Programm erzeugt hat, in ihr Projekt. Diese Datei enth\u00e4lt den Code f\u00fcr eine weitere Java-Klasse, und zwar eine Testklasse, die \u00fcberpr\u00fcft, ob die Klasse auch semantisch richtig implementiert worden ist, also ob die Methoden auch das tun, was sie sollen, und ob das Attribut da ist, und ob die Datentypen und die Schreibung exakt mit dem Klassendiagramm \u00fcbereinstimmen. Die Testklasse sieht so aus, auch wenn die Sch\u00fclerin sich den Code nie anschauen muss:<\/p>\n<pre lang=\"JAVA\">import static org.junit.Assert.*;\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\n\npublic class RaumschiffTest {\n\n  Raumschiff testObject;\n\n  public RaumschiffTest() {\n  }\n\n  @Before\n  public void setUp() {\n    testObject = new Raumschiff();\n  }\n\n  @After\n  public void tearDown() {\n    testObject=null;\n  }\n\n  @Test\n  public void attributeUeberpruefen() {\n    testObject.alter = 8;\n  }\n\n  @Test\n  public void setAlterTest() {\n    testObject.setAlter(40);\n    assertEquals(40, testObject.alter);\n    testObject.setAlter(11);\n    assertEquals(11, testObject.alter);\n    testObject.setAlter(31);\n    assertEquals(31, testObject.alter);\n  }\n\n  @Test\n  public void getAlterTest() {\n    testObject.alter = -5;\n    assertEquals(-5, testObject.getAlter());\n    testObject.alter = 64;\n    assertEquals(64, testObject.getAlter());\n    testObject.alter = -17;\n    assertEquals(-17, testObject.getAlter());\n  }\n\n}\n<\/pre>\n<p>Mit einem Mausklick startet man den Test, und herauskommt eine Anzeige, welche Tests bestanden wurde:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9738\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/java-aufgabengeber_testergebnis.png\" alt=\"Java-Testergebnis\" width=\"456\" height=\"184\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/java-aufgabengeber_testergebnis.png 456w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/java-aufgabengeber_testergebnis-150x61.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/java-aufgabengeber_testergebnis-300x121.png 300w\" sizes=\"auto, (max-width: 456px) 100vw, 456px\" \/><\/p>\n<p>Dazu muss die von der Sch\u00fclerin erstellte Klasse erst existieren, und zwar grammatisch fehlerfrei. Die Tests \u00fcberpr\u00fcfen nur, ob das Programm auch das tut, was es soll, nicht ob es \u00fcberhaupt l\u00e4uft &#8211; das sagt einem schon der Compiler eine Stufe zuvor.<\/p>\n<p>Man kann sich auch Klassen mit zwei, drei oder vier Attributen erzeugen lassen. Wenn die Attribute nicht als <code>private<\/code> markiert sind, werden die Attribute \u00fcberpr\u00fcft und die getter\/setter-Methoden anhand dieser Attribute \u00fcberpr\u00fcft &#8211; ansonsten wird die getter-Methode anhand der setter-Methode auf Richtigkeit getestet, und umgekehrt. Man auch ausw\u00e4hlen, dass ein zweiter Konstruktor mit zu den Attributen passenden Argumenten erzeugt werden soll. Au\u00dferdem kann man noch ankreuzen, ob die neuen Objekte der Klasse bestimmte Startwerte f\u00fcr die Attribute haben sollen, die dann im Konstruktor festgelegt werden. Dann hei\u00dft es unter dem Klassendiagramm:<\/p>\n<pre>Der Wert des Attributs 'alter' soll am Anfang sein: 32<\/pre>\n<p>Die Werte f\u00fcr die Attribute werden ebenfalls zuf\u00e4llig ausgew\u00e4hlt. Attribute k\u00f6nnen vorerst nur vom Typ <code>String, boolean, char, double, int<\/code> sein. Die Testklasse wird jeweils unter Ber\u00fccksichtigung all dieser Entscheidungen erstellt.<\/p>\n<p>Das k\u00f6nnte man jetzt ausweiten und die Sch\u00fcler selber Klassenbezeichner und Attribute ausw\u00e4hlen lassen. Oder mit Referenzattributen arbeiten, dass also &#8211; f\u00fcr den Anfang &#8211; zwei Klassendiagramme erstellt werden, wobei das eine ein Referenz auf das zweite enth\u00e4lt.<\/p>\n<p>Wen es st\u00f6rt, dass das so eine Art Liegest\u00fctzen f\u00fcr Java sind, also eher sinnlose, wiederholende \u00dcbungen, der kann sich vielleicht daran erfreuen, dass die Sch\u00fcler so an den Umgang mit Testklassen und Testverfahren herangef\u00fchrt werden.<\/p>\n<ul>\n<li><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/Aufgabengeber.jar\">Download des .jar-Archivs.<\/a> Vorsicht: Erzeugt im selben Verzeichnis die Textdateien im Format <code>&lt;Klasse&gt;Test.java<\/code> und <code>&lt;Klasse&gt;Diagramm.txt<\/code> und \u00fcberschreibt vorhandene Dateien mit gleichem Namen ohne R\u00fcckfrage.\n<ul>\n<li>Erste Bugs gefunden, verbesserte Version von 2017-08-06, 19:50 Uhr<\/li>\n<li>Neue Version vom 2017-08-07, 09:00 Uhr, etwas aufger\u00e4umt im Code und assertEquals bei double verbessert<\/li>\n<li>Neue Version vom 2017-08-31: Code aufger\u00e4umt, die Varianten bei privaten Attributen etwas eingeschr\u00e4nkt, und jetzt kann man auch noch optional eine zuf\u00e4llige Methode schreiben lassen, die kein Getter oder Setter ist. Im Moment sind das aber nur <code>istGerade, verdoppeln, hoch3<\/code> und <code>betrag<\/code>, das w\u00e4re aber leicht zu erweitern. Hintergrund: Jetzt gibt es doch f\u00fcr jeden Pseudo-Datentyp eine eigene Klasse (und damit Postleitzahlen im Bereich 10000-99999 statt mit beliebigen int-Werten), und f\u00fcr jede Pseudo-Methode ebenfalls (die f\u00fcr ihren eigenen Testcode verantwortlich ist).<\/li>\n<li>Neue Version vom 2017-09-02. Nach au\u00dfen unver\u00e4ndert, aber viel innen umbenannt und neu gebastelt, unter anderem zus\u00e4tzliche Pseudo-Methoden.<\/li>\n<li>Neue Version vom 2018-10-21. Postleitzahlen funktionieren jetzt als String.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>(11 Kommentare.) Nachtrag: aktualisierte Fassung des Programms ist am Ende des Beitrags Das mit dem Verstehen ist ja sch\u00f6n und gut, aber bei Sprachen &#8211; Programmiersprachen wie anderen &#8211; reicht es nicht, wenn man die grammatischen Kategorien kennt, man muss die Sprache auch anwenden k\u00f6nnen. In Bayern lernen die Sch\u00fcler in Informatik in der 10. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":9723,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227,233],"class_list":["post-9721","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik","tag-programmierprojekte"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/java-aufgabengeber.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/9721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=9721"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/9721\/revisions"}],"predecessor-version":[{"id":17106,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/9721\/revisions\/17106"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/9723"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=9721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=9721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=9721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}