Meine aktuelle 11. Klasse in Informatik muss eine Hausaufgabenverwaltung als Anwendung des Kompositum-Entwurfmusters programmieren. Und wie immer spaltet sich die Gruppe in die erfahrenen Programmierer („Kann ich nicht eine ArrayList nehmen?“, „Java ist doch eh Sche… . In C#/C++/Python/…. wäre das viel einfacher.“) und die Schüler mit wenig Erfahrung auf („Herr Bartling, bei mir werden nur 2 Elemente in die Liste aufgenommen. Können Sie mal kommen?“).

Da das Ganze als kleiner Leistungsnachweis gedacht ist, gibt es wieder eine Grundanforderung zum Erreichen der Note 2 und ein paar Anregungen zum Erreichen der 1. Das entsprechende Blatt im Word-Format, so dass es verändert und angepasst werden kann, stelle ich hier mal zur Verfügung: hausaufgabenverwaltung .

Eine mögliche „1er“-GUI aufgrund der vielfältigen Möglichkeiten wäre, wenn sie vollständig funktioniert, dieser Entwurf von mir:

bildschirmfoto-2016-12-10-um-08-50-44

Das Abgabedatum wird dabei automatisch mit Hilfe der Systemzeit voreingestellt. Zum einfacheren Testen wird noch ein Dummy-Text erzeugt in dem ich mir von der Internetseite www.loremipsum.de einfach 100 Zeichen geholt habe und per Zufall Text ausschneiden. Erstellt werden bei mir im Unterricht solche Oberflächen mit Hilfe des Programms Java-Editor . Man kann den Java-Editor  einfach im Netzwerk installieren. Allerdings habe ich den Eindruck, dass bei einem Starten von mehreren Benutzern die Software nicht 100%ig funktioniert: Das Umbenennen der Objekte funktioniert nicht korrekt. Nach dem ich mehrere Buttons einfügt und über das Eigenschafts-Fenster umbenannt habe, habe ich so merkwürdigen Namen wie jButton1_sortierenDatum_Speichern_SortierenPriority, jButton1_sortierenDatum_Speichern, jButton1_sortierenDatum. Ich denke, wenn die Software lokal läuft, hat man das Problem wahrscheinlich nicht, aber das habe ich noch nicht ausprobiert.

Als nächstes muss die Verwaltung der Hausaufgaben in einer verketteten Liste nach dem Kompositum-Muster umgesetzt werden. Ich halte das zwar für eine nicht optimale, aber eine mögliche Anwendung des Kompositum-Musters gemäß des Lehrplans:

 

  • Implementierung einer einfach verketteten Liste als Klasse mittels Referenzen unter Verwendung eines geeigneten Softwaremusters (Composite); Realisierung der Methoden zum Einfügen, Suchen und Löschen
  • Einsatz der allgemeinen Datenstruktur Liste bei der Bearbeitung eines Beispiels aus der Praxis: Verwaltung von Elementen verschiedener Datentypen mittels Vererbung

 

Geschicktere Anwendungen wären Menü-Strukturen, Gruppierungen oä. Mehr zu diesem Entwurfsmuster und anderen  findet man bei philipphauer.de nachvollziehbar dargestellt und diskutiert.

Ein anderes Entwurfsmuster ist das MVC: Model-View-Control . Model sind die Daten, View ist hier die Oberfläche und die Control-Klassen kontrollieren und Steuern den Datenfluss zur und von der Oberfläche zu den Daten. Die Schwierigkeit besteht dabei in der wirklichen Trennung der Control-Funktionen von der Oberfläche und den Daten. So ist es beispielsweise viel einfacher die Kontrolle der eingegebenen Daten in der Oberfläche zu realisieren statt im Controller. Bei Fehlern so einfach ein neuer Wert angezeigt werden und automatisch an das Backend weitergeleitet werden. Allerdings müsste man dann bei einer anderen Oberfläche diese Prüfung zusätzlich implementieren anstatt einfach die Funktionalität des Controllers zurück greifen zu können

Viel schwieriger ist die Einhaltung der Trennung von Struktur und Inhalt beim Kompositum. Einfache Funktionen, wie das Zählen der Elemente, sind schnell und korrekt umgesetzt. ABER wenn es um spezielle Funktionen geht, wie das Finden aller Eingegebener Tage, so landet mal schnell bei Methoden wie

abstract public String getAllDates();

Hierbei wird die Trennung von Struktur und Inhalt im Kompositum aufgehoben, denn es wird, zumindest wenn man es nicht richtig macht, auf ein spezielles Attribut Datum der Hausaufgaben eingegangen.

bildschirmfoto-2016-12-10-um-10-03-36

Der „falsche“ Quelltext würde lauten:

HA_Liste

    public String getAllDates() {
        return first.getAllDates();
    }

Datenknoten

    public String getAllDates() {
        String curDate = meinInhalt.getInfos()[1];
        String otherDates = next.getAllDates();
        if (otherDates.indexOf(curDate) == -1 ) {
            otherDates += "#"+curDate;
            //Der String wird später über split in ein Array zerlegt
            //und dadurch das DropDown-Menü angepasst.
        }
        return otherDates;
    }

„Richtiger“ wäre es, denke ich, einfach alle Daten sich von der Listen zurückgeben zu lassen und dann in der Oberfläche die Daten zu filtern und anzuzeigen. Ähnlich wie bei Datenbanken. Man holt sich über FROM die Daten und filtern dann u.a. die Daten über SELECT.

Oder man filtert in einer Controller-Klasse, die hier aber noch nicht umgesetzt wurde.