Zur Haupt­na­vi­ga­ti­on sprin­gen [Alt]+[0] Zum Sei­ten­in­halt sprin­gen [Alt]+[1]

Mög­li­cher Un­ter­richts­gang

Im Fol­gen­den wer­den eine mög­li­che Ab­fol­ge der The­men skiz­ziert und Bei­spiel­auf­ga­ben vor­ge­stellt. Es wer­den weder Vor­ga­ben zum Zeit­rah­men ge­macht noch der An­spruch auf Voll­stän­dig­keit er­ho­ben. Die vor­ge­stell­ten Ideen sol­len als Aus­gangs­ba­sis für den ei­ge­nen Un­ter­richt die­nen.

1. Ken­nen­ler­nen des Pro­jekts, Be­griffs­klä­run­gen zu Ty­pi­sie­rung/Ty­pum­wand­lung

Im Pro­jekt sind ei­ni­ge Stel­len nur grob oder nicht fer­tig im­ple­men­tiert und kön­nen aus­ge­baut/ver­bes­sert wer­den. Diese sind im Code je­weils mit TODO: ge­kenn­zeich­net und es wird im Kom­men­tar be­schrie­ben was getan wer­den soll. Fol­gen­de Auf­ga­ben kön­nen ge­nutzt wer­den, um das Pro­jekt ken­nen zu ler­nen.

Film­samm­lung.java: TODO: Bounds Check , TODO: Korrekte Filmanzahl und TODO: Suche Se­ri­en­epi­so­de.java: TODO: Getter

Also nächs­tes kann es sinn­voll sein Ty­pi­sie­rung und Ty­pum­wand­lun­gen zu wie­der­ho­len. Hier­bei soll­te ins­be­son­de­re ein­schrän­ken­de und er­wei­tern­de Ty­pum­wand­lun­gen von ein­an­der un­ter­schie­den und der Be­griff Typ­in­fe­renz er­klärt wer­den. Im Hin­ter­grund-Do­ku­ment ist eine Er­klä­rung mit Bei­spie­len be­schrie­ben, wie sie auch im Un­ter­richt ein­ge­setzt wer­den könn­te.

Hilf­reich ist es, die Fach­be­grif­fe Typ, for­ma­le Wer­te­pa­ra­me­ter und kon­kre­te Ar­gu­men­te im Kon­text von Me­tho­den ein­zu­füh­ren. Sol­len Lamb­da­aus­drü­cke nicht be­han­delt wer­den, kann dies auch weg­ge­las­sen wer­den.

2. Ge­ne­ri­sche Da­ten­ty­pen – Not­wen­dig­keit, De­kla­ra­ti­on

Als Haupt­mo­ti­va­ti­on für ge­ne­ri­sche Da­ten­ty­pen soll­ten fol­gen­de zwei As­pek­te für die Schü­le­rin­nen und Schü­ler greif­bar wer­den:

  • Typ­si­cher­heit wo immer mög­lich: Es ist bes­ser, einen Feh­ler bei der Com­pi­lie­rung zu ent­de­cken, als erst zur Lauf­zeit. Ins­be­son­de­re gilt das für die Schu­le, da Aus­nah­me­be­hand­lung dort kein Thema ist.
  • Red­un­dan­zen durch Abs­trak­ti­on ver­mei­den: Um Typ­si­cher­heit zu er­rei­chen, muss mehr­fach Code ge­schrie­ben wer­den, der sich nur an we­ni­gen Stel­len vom bis­he­ri­gen Code un­ter­schei­det. Dies ist un­er­wünscht.

Fol­gen­de Auf­ga­ben kön­nen für die Mo­ti­va­ti­on ge­stellt wer­den:

  1. Siehe Pro­gram­mier­auf­trag „Auf­ga­be.a1“ im Code.

    Siehe Lö­sungs­ord­ner

  2. Gib an, wel­che Arten Ty­pum­wand­lun­gen statt­fin­den.

    /*

    * Falls fs eine Film­samm­lung von Se­ri­en:

    * fs.​get(0).get­Ti­tel(); //im­plit­zi­te er­wei­tern­de Ty­pum­wand­lung: Serie -> Film

    * ( (Serie) fs.​get­Film(0) ).ge­tAn­zahl­Epi­so­den(); //ex­pli­zi­te ein­schrän­ken­de Ty­pum­wand­lung: Film -> Serie

    *

    * Falls fs eine Film­samm­lung von Ki­no­fil­men:

    * Ex­cep­ti­on: java.​lang.​ClassCas­tEx­cep­ti­on (class Ki­no­film can­not be cast to class Serie)

    */

  3. Er­klä­re, wes­halb es beim Auf­ruf von Auf­ga­be.a1(..) mit einer Samm­lung von Ki­no­fil­men zu einer Aus­nah­me kommt.

    Der Re­fe­renz­typ Ki­no­film steht in kei­ner di­rek­ten Be­zie­hung zum Typ Serie und kann daher weder im­pli­zit noch ex­pli­zit in den Ziel­typ Serie um­ge­wan­delt wer­den.

  4. Mache Vor­schlä­ge, wie si­cher ge­stellt wer­den, könn­te dass es nicht zu der Aus­nah­me kommt und be­wer­te diese.

    Für die Samm­lung von Se­ri­en­ob­jek­ten kann eine ei­ge­ne Klas­sen Se­ri­en­samm­lung ge­schrie­ben wer­den. Al­ler­dings ent­ste­hen dabei viele Red­un­dan­zen, der Code un­ter­schei­det sich nur im Typ der hin­ter­leg­ten Rei­hung und der Wert­pa­ra­me­ter und Rück­ga­be­wer­te in der Klas­se.

Es folgt eine kurze Er­klä­rung zur De­kla­ra­ti­on ge­ne­ri­scher Typen (siehe Hin­ter­grund­do­ku­ment). Für die Kurs­teil­neh­mer ist es nur wich­tig, den Code lesen zu kön­nen und die Fach­be­grif­fe zu ge­ne­ri­schen Typen zu­ord­nen zu kön­nen. Der Bil­dungs­plan sieht nicht vor, dass ge­ne­ri­sche Typen selbst de­kla­riert wer­den.

Ge­ge­be­nen­falls kann die ge­ne­ri­sche Film­samm­lung mit den SuS ge­mein­sam im­ple­men­tiert wer­den (die Klas­se muss dann aus dem Pro­jekt ge­löscht und ein­zel­ne Auf­ga­ben, die zu der Klas­se in Be­zie­hung ste­hen evtl. zu­nächst aus­kom­men­tiert wer­den) oder die ge­ge­be­ne Im­ple­men­tie­rung ana­ly­siert wer­den. Fol­gen­de Auf­ga­be kann davor oder da­nach ge­stellt wer­den.

Öffne die Java-Do­ku­men­ta­ti­on zu Ar­ray­List einem ge­ne­ri­schen Da­ten­typ. https://​docs.​ora­cle.​com/​en/​java/​ja­va­se/​11/​docs/​api/​java.​base/​java/​util/​Ar­ray­List.​html

  1. Un­ter­su­che die Me­tho­den­zu­sam­men­fas­sung und finde Me­tho­den, wel­che für FilmsammlungGeneric<E> be­nö­tigt wer­den.

    Die Kon­struk­to­ren, add(E e), add(int index, E ele­ment), re­mo­ve(int index), get(int index)

  2. Nenne die Me­tho­den, die über­schrie­ben und die zu­sätz­lich im­ple­men­tiert wer­den müs­sen.

    Ein Kon­struk­tor der eine Rei­hung als Ar­gu­ment nimmt, find(String titel), an­zahl­Fil­me, get­Be­wer­tung()

  3. Op­tio­nal: Im­ple­men­tie­re FilmsammlungGeneric<E>

    An­mer­kung: noch ohne upper Bound für den for­ma­len Typ­pa­ra­me­ter. Im Pro­jekt sind die Zei­len mit Bound aus­kom­men­tiert.

3. Ge­ne­ri­sche Da­ten­ty­pen – Nut­zung, Bounds

Die Syn­tax zur Nut­zung kann mit den Bei­spie­len aus dem Hin­ter­grund­do­ku­ment vor­ge­stellt wer­den. Der Dia­mant-Ope­ra­tor wird ein­ge­führt und er­klärt (Typ­in­fe­renz). Die Fach­be­grif­fe müs­sen ein­ge­führt wer­den. Die Fach­be­grif­fe kön­nen leicht ge­prüft wer­den: Hier­zu in einem Bei­spiel­code Stel­len mar­kie­ren und nach dem Be­griff fra­gen. Mög­li­che zu­sätz­li­che Auf­ga­ben/Fra­gen könn­ten lau­ten:

  1. Er­klä­re, wes­halb bei ArrayList<Integer> l3 = new ArrayList(); ein Lauf­zeit­feh­ler mög­lich ist.

    Der Dia­mant-Ope­ra­tor fehlt. Dem­nach wird l3 der Ori­gi­nal­typ zu­ge­wie­sen. Das Ver­hal­ten ist iden­tisch zu dem bis­he­ri­gen nicht pa­ra­me­tri­sier­ten Ver­hal­ten.

  2. Er­klä­re, wes­halb bei ArrayList l4 = new ArrayList<Integer>(); ein Lauf­zeit­feh­ler mög­lich ist.

    Der Ziel­typ ist nicht pa­ra­me­tri­siert. Das Ver­hal­ten ist iden­tisch zu dem bis­he­ri­gen nicht pa­ra­me­tri­sier­ten Ver­hal­ten.

  3. Siehe Pro­gram­mier­auf­trag „Auf­ga­be.a2“: im Code.

    Siehe Lö­sungs­ord­ner

  4. Gib an, wel­che Arten Ty­pum­wand­lun­gen statt fin­den, ver­glei­che mit Auf­ga­be.a1

    /*

    * fsG.​get(1).get­Ti­tel(); //keine Ty­pum­wand­lung, die von der Va­ter­klas­se ge­erb­te Me­tho­de wird auf­ge­ru­fen.

    * fsG.​get(1).ge­tAn­zahl­Epi­so­den(); //keine Ty­pum­wand­lung not­wen­dig, weder im­pli­zit noch ex­pli­zit

    */

  5. Serie.​java: TODO: Typsicherheit garantieren

    ohne Lö­sung

  6. Für die fol­gen­de Auf­ga­be müs­sen Zeile 11 und der Block ab Zeile 71 kom­men­tiert sein.

  7. Siehe Pro­gram­mier­auf­trag „Auf­ga­be.a3“: im Code. Wel­che kon­kre­ten Typ­pa­ra­me­ter sind er­laubt, wel­che nicht? [An­mer­kung: Hier muss den SuS der Tipp ge­ge­ben wer­den, ihnen be­reits be­kann­te an­de­re als im Pro­jekt de­fi­nier­te Typen als kon­kre­ten Typ­pa­ra­me­ter zu ver­wen­den.]

    Es sind alle Re­fe­renz­ty­pen er­laubt.

    Finde Bei­spie­le für die es zu Com­pi­lie­rungs/Lauf­zeit­feh­lern kom­men kann.

    Wähle z.B. String als kon­kre­ten Typ­pa­ra­me­ter: Com­pi­lie­rungs­feh­ler: can­not find sym­bol ...

  8. Al­ter­na­ti­ve zu Auf­ga­be 6 mit kom­men­tier­ter Zeile 10 und nicht kom­men­tier­ter Zeile 11 und dem Block ab Zeile 71

  9. Er­klä­re wes­halb es in Zeile 87 (sum += e.getBewertung();) zu einem Com­pi­lie­rungs­feh­ler kommt.

    Die Va­ria­ble e ist vom for­ma­len Typ E. Der kon­kre­te Typ ist zu Com­pi­lie­rungs­zeit nicht be­kannt und könn­te jeder denk­li­che kon­kre­te Typ­pa­ra­me­ter sein. Nicht jeder Typ im­ple­men­tiert die Me­tho­de get­Be­wer­tung()

Es kön­nen nun Bounds ein­ge­führt wer­den und der Code ent­spre­chend an­ge­passt wer­den. (Statt <E> : <E extends Film>) Die SuS könn­ten an­schlie­ßend noch­mals in „Auf­ga­be.a3“ im Code ex­pe­ri­men­tie­ren und da­durch er­ken­nen, dass es nicht mehr zu Com­pi­lie­rungs­feh­lern kommt.

4. In­ter­faces, Iterable – Ar­beit mit der Do­ku­men­ta­ti­on

Falls nicht be­reits im Un­ter­richt ge­sche­hen, soll­ten nun In­ter­faces ein­ge­führt wer­den, denn diese be­geg­nen dem Leser der Java-Do­ku­men­ta­ti­on immer wie­der. Der Ab­schnitt im Hin­ter­grund­do­ku­ment kann auch für den Un­ter­richt ver­wen­det wer­den. Die Schü­le­rin­nen und Schü­ler müs­sen je­doch keine In­ter­faces de­fi­nie­ren oder im­ple­men­tie­ren.

An­schlie­ßend soll an­hand des In­ter­faces Iterable die Ar­beit mit der Do­ku­men­ta­ti­on de­mons­triert wer­den.

Ge­star­tet wird auf der Start­sei­te der „Java® Plat­form, Stan­dard Edi­ti­on & Java De­ve­lop­ment Kit Ver­si­on 11 API Spe­ci­fi­ca­ti­on“

Die Ver­si­on 11 hat den Vor­teil, dass es im Ge­gen­satz zur Ver­si­on 8 ein Such­feld gibt: https://​docs.​ora­cle.​com/​en/​java/​ja­va­se/​11/​docs/​api/​index.​html .

Auf­ga­ben zur ge­mein­sa­men Be­ar­bei­tung im Un­ter­richt:

Öffne die Java-Do­ku­men­ta­ti­on: https://​docs.​ora­cle.​com/​en/​java/​ja­va­se/​11/​docs/​api/​index.​html und führe fol­gen­de Schrit­te durch. No­tie­re dir je­weils dir un­kla­re Be­grif­fe.

  1. Ein wich­ti­ge Schnitt­stel­le ist das Iterable-In­ter­face. Gib in der Such­mas­ke „Iterable“ ein und wähle java.​util.​Iterable aus. Wel­che Me­tho­den de­fi­niert das In­ter­face? Für was könn­te das In­ter­face die­nen?
  2. Finde her­aus was ein Ite­ra­tor ist. Tipp lies die Do­ku­men­ta­ti­on zu Ite­ra­tor<T>.

Diese Auf­ga­ben müs­sen zu kei­ner Lö­sung füh­ren, sie die­nen als Ge­sprächs­grund­la­ge für den nächs­ten Un­ter­richts­schritt

5. Das Collec­tions Frame­work und Ite­ra­ti­on

Mit Hilfe der Do­ku­men­ta­ti­on wird das Collec­tions Frame­work er­kun­det. Es folgt eine Aus­wahl an Auf­ga­ben, die hier­zu ge­stellt wer­den kön­nen.

  1. Gib im Such­feld „java.​util“ ein und wähle die Do­ku­men­ta­ti­on zum Paket java.​util. Wähle im „In­ter­face Sum­ma­ry“ das In­ter­face Collec­tion<E>. Be­trach­te die Me­tho­den, die das In­ter­face de­fi­niert. Fasse in we­ni­gen Sät­zen den Zweck zu­sam­men, zu dem Klas­sen, die das In­ter­face im­ple­men­tie­ren, ge­nutzt wer­den kön­nen.

    Zur Samm­lung gleich­ar­ti­ger Ob­jek­te.

  2. Ge­ge­ben sind die fol­gen­den In­ter­faces und Klas­sen: <ei­ge­ne Aus­wahl ein­set­zen>. Ver­su­che mit Hilfe der Do­ku­men­ta­ti­on eine Ver­er­bungs­hier­ar­chie als Klas­sen­dia­gramm dar­zu­stel­len.

    Fol­gen­des Klas­sen­dia­gramm be­schreibt eine Ma­xi­mal­aus­wahl und soll­te für den Un­ter­richt auf ein Teil­dia­gramm re­du­ziert wer­den.

    Programmierparadigmen

    Klas­sen­dia­gramm ZPG In­for­ma­tik [CC BY-SA 4.0 DE], aus 03_­un­ter­richts­ver­lauf.odt, be­ar­bei­tet

  3. In Kol­la­bo­ra­ti­on (Grup­pen­puz­zle, Mu­se­ums­rund­gang,…): Nutze die Do­ku­men­ta­ti­on und be­schrei­be die Fun­ki­on (Auf­bau und Ein­satz­zweck) einer der Klas­sen des Collec­tions Fram­work.
  4. Nenne das In­ter­face, das bei­na­he alle Klas­sen des Collec­tion-Fram­works im­ple­men­tie­ren müs­sen.

    Iterable<E>

  5. Im Un­ter­richt kann nun noch­mal auf Iterable<E> und Iterator<T> ein­ge­gan­gen wer­den und kurz ge­klärt wer­den, wel­chen Zweck die Me­tho­den hasNext() und next() er­fül­len. Der Ab­schnitt im Hin­ter­grund­do­ku­ment ist hier auch für den Un­ter­richt ge­eig­net.

    Zur Übung reicht die Ite­ra­ti­on mit einer while-Schlei­fe und der er­wei­ter­ten for-Schlei­fe.

  6. Siehe Pro­gram­mier­auf­trag „Auf­ga­be.a4“: im Code.

    An die­ser Stel­le muss auf die Ver­er­bung bei ge­ne­ri­schen Typen ein­ge­gan­gen wer­den. Film­samm­lung­Ge­ne­ric<Serie> er­wei­tert nicht Film­samm­lung­Ge­ne­ric<Film>, ob­wohl der Typ Serie den Typ Film er­wei­tert. (siehe auch Hin­ter­grund­do­ku­ment)

    Für die SuS gibt es zu­nächst nur die Mög­lich­keit, meh­re­re Me­tho­den zu schrei­ben. Im Lö­sungs­ord­ner fin­det sich eine Va­ri­an­te mit ge­ne­risch de­kla­rier­ter Me­tho­de. Dies kann ver­sier­ten SuS ge­zeigt wer­den.

  7. Siehe Pro­gram­mier­auf­trag „Auf­ga­be.a5“: im Code.

    siehe Lö­sungs­ord­ner

  8. Um die Nut­zung von Collec­tions und Ite­ra­ti­on üben und prü­fen zu kön­nen, ist es sinn­voll Auf­ga­ben fol­gen­der Art zu stel­len: Die Schü­le­rin­nen und Schü­ler er­hal­ten eine kurze Spe­zi­fi­ka­ti­on eines Pro­blems in Form einer Be­schrei­bung und eine zu nut­zen­de Collec­tion aus dem Collec­tion-Frame­work. Als vor­ge­ge­be­ne Collec­tion kann eine kon­kre­te Im­ple­men­tie­rung (z.B. Ar­ray­List) ge­ge­ben sein, dann ist eine De­kla­ra­ti­on/In­itia­li­sie­rung mög­lich. Es kann aber auch ein In­ter­face vor­ge­ge­ben wer­den, dann ist nur eine Ite­ra­ti­on mög­lich.

  9. Bei­spiel für eine sol­che Auf­ga­be:

    Spe­zi­fi­ka­ti­on: Eine Youtube­rin er­stellt re­gel­mä­ßig Rei­se­be­rich­te auf ihrem Kanal.

    Auf ihrer Web­sei­te möch­te sie die Namen alle Län­der die sie be­reits be­reist hat aus­ge­ben.

    Hier­für möch­te sie immer wenn sie in einem Land war, die­ses einer Samm­lung hin­zu­fü­gen.

    Es kann sein, dass sie ein Land mehr­mals be­reist. Um sich nicht mer­ken zu müs­sen, ob sie be­reits in die­sem Land war, fügt sie es ein­fach noch­mals ihrer Samm­lung hinzu.

    Ist ein Land be­reits in ihrer Rei­se­lis­te ent­hal­ten, wird es nicht er­neut an­ge­fügt. Die Rei­hen­fol­ge der be­reis­ten Län­der spielt keine Rolle.

    Eine Bei­spiel Ein­ga­be­fol­ge könn­te lau­ten: Deutsch­land, In­di­en, USA, Deutsch­land, Ös­ter­reich, Süd-Afri­ka, Frank­reich, USA

    Eine Aus­ga­be könn­te dann fol­gen­der­ma­ßen aus­se­hen: "In­di­en, Deutsch­land, USA, Süd-Afri­ka, Ös­ter­reich, Frank­reich, "

    Collec­tion: Hash­Set (https://​docs.​ora­cle.​com/​en/​java/​ja­va­se/​11/​docs/​api/​java.​base/​java/​util/​Hash­Set.​html)

    Mus­ter­lö­sung:

    //Deklaration und Initialisierung
    HashSet<String> coll = new HashSet<>();
    coll.add("Deutschland");
    coll.add("Indien");
    coll.add("USA");
    coll.add("Deutschland");
    coll.add("Österreich");
    coll.add("Süd-Afrika");
    coll.add("Frankreich");
    coll.add("USA");
    // Ausgabe aller im HashSet gespeicherten Werte,
    // Duplikate gibt es nicht,
    // die Einfüge-Reihenfolge wird nicht notwendigerweise eingehalten.
    Iterator<String> it = coll.iterator();
    while( it.hasNext() ) {
        String land = it.next();
        System.out.print(land + ", ");
    }
    

 

Un­ter­richts­ver­lauf: Her­un­ter­la­den [odt][216 KB]

 

Wei­ter zu Op­tio­nal