{"beispielaufgaben":[{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"Ein Anbieter von Fitnessstudio-Software entwickelt eine Datenverwaltung, in der sowohl Kurs-Objekte als auch Geraete-Objekte in derselben Behaelterklasse abgelegt werden sollen. Statt fuer jeden Objekttyp eine eigene Klasse zu schreiben, schlaegt das Entwicklungsteam vor, dafuer eine generische Klasse Behaelter<T> zu verwenden. Erlaeutern Sie am Begriff der generischen Klasse, was der Typparameter T bedeutet und wie er die Wiederverwendbarkeit einer solchen Klasse fuer unterschiedliche Objekttypen ermoeglicht.","typ":"absatz"}],"beispiel_id":"bsp-generische-programmierung-erlaeutern-freitextantwort-01","freigabeart":"maschinell","loesung":[{"text":"Erwartet wird eine sinngemaesse Erlaeuterung: Eine generische Klasse ist eine typparametrisierte Klasse; ihre Methoden und Variablen werden fuer einen vorgegebenen, aber beliebigen Typ (Platzhalter T) definiert (2 Punkte). Der konkrete Typ wird erst bei der Instanziierung festgelegt, sodass dieselbe Klasse ohne erneutes Schreiben fuer Kurs- und Geraete-Objekte wiederverwendbar ist (1 Punkt). Fachlich gleichwertige Formulierungen sind anzuerkennen. Insgesamt 3 Punkte.","typ":"absatz"}],"operator_id":"operator.erlaeutern","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":3,"punkterahmen":{"max":3,"min":3},"quellen":["ap2-fiae-2022-winter-ae2-a01-c"]},{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"In einer Anwendung zur Auftragsbearbeitung werden verschiedene Objektarten wie Bestellungen und Ruecksendungen zwischengespeichert. Ein Entwickler implementiert dafuer die generische Klasse Warteschlange<T>. Zusaetzlich moechte er sicherstellen, dass nur solche Objekte aufgenommen werden koennen, deren Typ eine bestimmte Anforderung erfuellt. Erlaeutern Sie den Begriff der generischen Klasse und gehen Sie darauf ein, wie sich der zulaessige Typ T durch eine Einschraenkung begrenzen laesst.","typ":"absatz"}],"beispiel_id":"bsp-generische-programmierung-erlaeutern-freitextantwort-02","freigabeart":"maschinell","loesung":[{"text":"Erwartet wird sinngemaess: Eine generische Klasse ist eine typparametrisierte Klasse, deren Methoden und Variablen fuer einen vorgegebenen, aber beliebigen Typ T definiert werden, der erst bei der Nutzung konkretisiert wird (2 Punkte). Fuer den Typparameter koennen Einschraenkungen (Schranken) formuliert werden, sodass nur Typen zugelassen sind, die eine geforderte Bedingung erfuellen (1 Punkt). Gleichwertige Formulierungen zaehlen. Insgesamt 3 Punkte.","typ":"absatz"}],"operator_id":"operator.erlaeutern","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":3,"punkterahmen":{"max":3,"min":3},"quellen":["ap2-fiae-2022-winter-ae2-a01-c"]},{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"In der Softwareabteilung eines Versandhändlers wird eine Bibliothek zur Verwaltung von Datensammlungen entwickelt. Um dieselbe Sammlungslogik sowohl für Artikel-Objekte als auch für Kunden-Objekte nutzen zu können, empfiehlt ein Entwickler den Einsatz generischer Programmierung, etwa in Form einer Klasse Sammlung<T>. Erläutern Sie am Beispiel einer solchen typparametrisierten Klasse, was unter generischer Programmierung zu verstehen ist und welchen Vorteil sie bei der Wiederverwendung von Code bietet.","typ":"absatz"}],"beispiel_id":"bsp-generische-programmierung-erlaeutern-freitextantwort-03","freigabeart":"maschinell","loesung":[{"text":"Erwartete Lösung: Generische Programmierung bedeutet, dass eine Klasse (oder Methode) über einen Typparameter T definiert wird, der bei der Verwendung durch einen konkreten Typ ersetzt wird. Ihre Methoden und Variablen sind so für einen zunächst offenen, beliebigen Typ formuliert (1 P.). Am Beispiel: Sammlung<T> speichert Elemente eines einheitlichen Typs T, sodass eine Instanz Sammlung<Artikel> ausschließlich Artikel-Objekte, eine Instanz Sammlung<Kunde> ausschließlich Kunden-Objekte aufnimmt (1 P.). Vorteil: Derselbe Code ist ohne Duplizierung für unterschiedliche Typen wiederverwendbar und bleibt dabei typsicher (1 P.). Sinngemäß gleichwertige Formulierungen sind anzuerkennen; die bloße Nennung 'für mehrere Typen verwendbar' ohne Bezug zum Typparameter ist unvollständig.","typ":"absatz"}],"operator_id":"operator.erlaeutern","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":3,"punkterahmen":{"max":3,"min":3},"quellen":["ap2-fiae-2022-winter-ae2-a01-c"]},{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"Ein Softwarehaus entwickelt Werkzeuge für die Aufbereitung von Importdaten aus unterschiedlichen Quellen. Immer wieder wird dabei ein kleiner, typsicherer Zwischenspeicher gebraucht, der genau zwei zusammengehörende Werte gleichen Typs hält und deren Reihenfolge bei Bedarf umkehren kann. Dieser Baustein soll unabhängig vom konkreten Datentyp einsetzbar sein, damit er in mehreren Modulen wiederverwendet werden kann.","typ":"absatz"},{"text":"Setzen Sie diesen Baustein in der Programmiersprache Java um. Die Java-Syntax Ihrer Lösung wird bewertet; halten Sie die vorgegebenen Signaturen exakt ein.","typ":"absatz"},{"text":"Erstellen Sie eine generische Klasse mit der Deklaration public class Wertepaar<T>. Die Klasse speichert zwei Werte vom Typparameter T. Sie besitzt den Konstruktor public Wertepaar(T ersterWert, T zweiterWert), die Methode public T links(), die Methode public T rechts() sowie die Methode public void kehreUm(), die die beiden gespeicherten Werte gegeneinander vertauscht.","typ":"absatz"},{"text":"Zeigen Sie in einer Methode public static void main(String[] args), dass die Klasse mit zwei verschiedenen konkreten Datentypen wiederverwendbar ist: Legen Sie je ein Wertepaar für Zeichenketten und für ganze Zahlen an, kehren Sie jeweils die Reihenfolge um und geben Sie die Ergebnisse auf der Konsole aus. Reichen Sie vollständigen, eigenständig lauffähigen Quellcode ein.","typ":"absatz"}],"beispiel_id":"bsp-generische-programmierung-anwenden-quellcode-01","freigabeart":"maschinell","loesung":[{"text":"Bewertet wird ausschließlich eine Java-Lösung, da die Aufgabe die vorgegebenen Java-Signaturen prüft.","typ":"absatz"},{"text":"Erwartete Lösung (gleichwertige, korrekte Java-Umsetzungen zulässig):","typ":"absatz"},{"text":"public class Wertepaar<T> {\n    private T ersterWert;\n    private T zweiterWert;","typ":"code"},{"text":"    public Wertepaar(T ersterWert, T zweiterWert) {\n        this.ersterWert = ersterWert;\n        this.zweiterWert = zweiterWert;\n    }","typ":"code"},{"text":"    public T links() {\n        return ersterWert;\n    }","typ":"code"},{"text":"    public T rechts() {\n        return zweiterWert;\n    }","typ":"code"},{"text":"    public void kehreUm() {\n        T zwischen = ersterWert;\n        ersterWert = zweiterWert;\n        zweiterWert = zwischen;\n    }","typ":"code"},{"text":"    public static void main(String[] args) {\n        Wertepaar<String> texte = new Wertepaar<>(\"alpha\", \"beta\");\n        texte.kehreUm();\n        System.out.println(texte.links() + \" \" + texte.rechts());","typ":"code"},{"text":"        Wertepaar<Integer> zahlen = new Wertepaar<>(10, 20);\n        zahlen.kehreUm();\n        System.out.println(zahlen.links() + \" \" + zahlen.rechts());\n    }\n}","typ":"code"},{"text":"Punkteverteilung (7 P):","typ":"ueberschrift"},{"eintraege":["Generische Klassendeklaration public class Wertepaar<T> mit zwei Feldern vom Typparameter T: 2 P","Konstruktor Wertepaar(T, T) sowie links() und rechts() mit Rückgabetyp T korrekt umgesetzt: 2 P","kehreUm() vertauscht die beiden Felder korrekt (Zwischenvariable vom Typ T): 1 P","main() erzeugt Wertepaar-Objekte für zwei verschiedene konkrete Typen (z. B. String und Integer), ruft kehreUm() auf und gibt beide Paare aus: 2 P"],"typ":"liste"},{"text":"Hinweis: Eine rohe bzw. auf Object gestützte, ungetypte Umsetzung erfüllt die generische Anforderung nicht. Die konkret gewählten Demonstrationswerte und Ausgabetexte sind frei und werden nicht auf feste Werte geprüft.","typ":"absatz"}],"operator_id":"operator.anwenden","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":7,"punkterahmen":{"max":7,"min":7},"quellen":["ap2-fiae-2022-winter-ae2-a01-d"]},{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"Ein Entwicklungsteam pflegt ein Redaktionssystem, in dem an vielen Stellen Listen ohne Wiederholungen gebraucht werden, etwa Schlagwortlisten oder Kennnummernfolgen. Da die Einträge je nach Anwendungsfall unterschiedliche Datentypen besitzen, soll ein einziger, typsicherer Hilfsbaustein für beliebige Elementtypen entstehen, statt für jeden Typ eine eigene Variante zu pflegen.","typ":"absatz"},{"text":"Setzen Sie diesen Baustein in der Programmiersprache Java um. Die Java-Syntax Ihrer Lösung wird bewertet; halten Sie die vorgegebene Signatur exakt ein.","typ":"absatz"},{"text":"Erstellen Sie eine generische Methode mit der Signatur public static <T> List<T> eindeutig(List<T> quelle). Die Methode liefert eine neue Liste zurück, die jeden Wert aus quelle in ursprünglicher Reihenfolge, jedoch nur bei seinem ersten Auftreten enthält; spätere Wiederholungen werden übersprungen. Nutzen Sie zum Vergleich der Elemente deren equals-Verhalten.","typ":"absatz"},{"text":"Zeigen Sie in einer Methode public static void main(String[] args), dass die Methode mit zwei verschiedenen konkreten Elementtypen wiederverwendbar ist: Rufen Sie sie einmal für eine Liste von Zeichenketten und einmal für eine Liste ganzer Zahlen auf und geben Sie die bereinigten Listen auf der Konsole aus. Reichen Sie vollständigen, eigenständig lauffähigen Quellcode einschließlich der benötigten Importe ein.","typ":"absatz"}],"beispiel_id":"bsp-generische-programmierung-anwenden-quellcode-02","freigabeart":"maschinell","loesung":[{"text":"Bewertet wird ausschließlich eine Java-Lösung, da die Aufgabe die vorgegebene Java-Signatur prüft.","typ":"absatz"},{"text":"Erwartete Lösung (gleichwertige, korrekte Java-Umsetzungen zulässig):","typ":"absatz"},{"text":"import java.util.ArrayList;\nimport java.util.List;","typ":"code"},{"text":"public class Redaktionshilfe {","typ":"ueberschrift"},{"text":"    public static <T> List<T> eindeutig(List<T> quelle) {\n        List<T> ergebnis = new ArrayList<>();\n        for (T element : quelle) {\n            if (!ergebnis.contains(element)) {\n                ergebnis.add(element);\n            }\n        }\n        return ergebnis;\n    }","typ":"code"},{"text":"    public static void main(String[] args) {\n        List<String> woerter = new ArrayList<>();\n        woerter.add(\"rot\");\n        woerter.add(\"rot\");\n        woerter.add(\"blau\");\n        System.out.println(eindeutig(woerter));","typ":"code"},{"text":"        List<Integer> zahlen = new ArrayList<>();\n        zahlen.add(3);\n        zahlen.add(3);\n        zahlen.add(7);\n        System.out.println(eindeutig(zahlen));\n    }\n}","typ":"code"},{"text":"Punkteverteilung (7 P):","typ":"ueberschrift"},{"eintraege":["Korrekte generische Methodensignatur public static <T> List<T> eindeutig(List<T> quelle) mit Typparameter T in Ein- und Ausgabetyp: 2 P","Neue Ergebnisliste vom Typ List<T> angelegt und über quelle iteriert: 1 P","Duplikaterkennung über equals/contains mit Beibehaltung der Reihenfolge und nur erstem Auftreten: 2 P","main() ruft eindeutig() mit zwei verschiedenen konkreten Elementtypen (z. B. String und Integer) auf und gibt beide Ergebnisse aus: 2 P"],"typ":"liste"},{"text":"Hinweis: Eine rohe bzw. auf Object oder ungetypte Sammlungen gestützte Umsetzung erfüllt die generische Anforderung nicht. Die konkret gewählten Beispieldaten und Ausgaben sind frei und werden nicht auf feste Werte geprüft.","typ":"absatz"}],"operator_id":"operator.anwenden","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":7,"punkterahmen":{"max":7,"min":7},"quellen":["ap2-fiae-2022-winter-ae2-a01-d"]},{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"Ein regionaler Verkehrsverbund programmiert eine Web-Anwendung für Fahrgastinformationen. An mehreren Stellen sollen zwei zusammengehörige Werte unterschiedlichen Typs gemeinsam gehalten werden, ohne für jede Kombination eine eigene Klasse zu schreiben. Programmieren Sie in TypeScript eine generische Klasse Paar<A, B> mit zwei Typparametern. Der Konstruktor erhält einen Wert vom Typ A und einen Wert vom Typ B; die Methoden ersten(): A und zweiten(): B geben den jeweiligen Wert typgerecht zurück. Schreiben Sie vollständigen, lauffähigen Code und legen Sie anschließend zwei Objekte an: ein Paar<number, string> für Liniennummer und Haltestellenname sowie ein Paar<string, boolean> für Verbindungskennung und Barrierefreiheit. Geben Sie für beide Objekte beide Werte über console.log aus. Beide Typparameter müssen in der Klassendeklaration und in den Rückgabetypen der Methoden genutzt werden; eine Lösung, die ausschließlich any verwendet, erfüllt die Aufgabe nicht.","typ":"absatz"}],"beispiel_id":"bsp-generische-programmierung-anwenden-quellcode-03","freigabeart":"maschinell","loesung":[{"text":"Lauffähige TypeScript-Lösung; fachlich gleichwertige Umsetzungen in anderen Sprachen sind anzuerkennen, sofern der Typparameternutzen erhalten bleibt.","typ":"absatz"},{"text":"class Paar<A, B> {\n    private a: A;\n    private b: B;","typ":"code"},{"text":"    constructor(ersterWert: A, zweiterWert: B) {\n        this.a = ersterWert;\n        this.b = zweiterWert;\n    }","typ":"code"},{"text":"    ersten(): A {\n        return this.a;\n    }","typ":"code"},{"text":"    zweiten(): B {\n        return this.b;\n    }\n}","typ":"code"},{"text":"const haltestelle = new Paar<number, string>(12, \"Hauptbahnhof\");\nconsole.log(haltestelle.ersten(), haltestelle.zweiten()); // 12 Hauptbahnhof","typ":"code"},{"text":"const verbindung = new Paar<string, boolean>(\"V-4711\", true);\nconsole.log(verbindung.ersten(), verbindung.zweiten()); // V-4711 true","typ":"code"},{"text":"Bewertung (7 P.): Klassendeklaration mit zwei Typparametern A und B 1 P.; Konstruktor mit Parametern vom Typ A und B und korrekt gesetzten Feldern 2 P.; Methode ersten(): A korrekt 1 P.; Methode zweiten(): B korrekt 1 P.; Anlegen von Paar<number, string> und Paar<string, boolean> mit korrekter Ausgabe beider Werte 2 P. Eine ausschließlich auf any gestützte Lösung erhält für die Generizität keine Punkte.","typ":"absatz"}],"operator_id":"operator.anwenden","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":7,"punkterahmen":{"max":7,"min":7},"quellen":["ap2-fiae-2022-winter-ae2-a01-d"]}],"konzept_id":"fachkonzept.generische-programmierung","schema_version":3}