Objektorientierte Programmiertechniken
LVA 185.A01, VU, 3 ECTS, 2016/2017 W
1. Übungsaufgabe
Thema:
Aufbau der Zusammenarbeit in Gruppe
Termine:
| Ausgabe: |
12.10.2016 |
| Abgabe: |
19.10.2016, 12:00 Uhr |
Abgabeverzeichnis:
Aufgabe1-3
Programmaufruf:
java Test
Grundlage:
Erstes Kapitel des
Skriptums
Aufgabe
Welche Aufgabe zu lösen ist:
Herbst ist Erntezeit und höchste Zeit für Wintervorbereitungen.
Bei den Eichhörnchen geht es jetzt um alles – nicht nur ums Überleben, sondern darum, am Ende des Winters für gesunden Nachwuchs zu sorgen.
Verschiedene Strategien zur Sicherung ausreichender Winternahrungsvorräte stehen zur Verfügung:
- In der Erde vergrabene Nüsse und Samen versprechen ein Festmahl.
Jedoch sind viele Lager bei Schnee und Eis nicht zugänglich und werden vergessen oder geplündert.
- Einfache oberirdische Verstecke in Ritzen und Spalten bleiben eher zugänglich, die Gefahr von Plünderungen ist jedoch erheblich.
- Man muss nicht selbst Vorräte anlegen.
Vielleicht ist die Zeit besser in das Auskundschaften der Verstecke anderer investiert.
- Wer besonders mutig ist, wagt sich in die Nähe menschlicher Behausungen und lässt sich füttern.
Gefahr droht dabei nicht nur von Menschen sowie ihren Autos und Haustieren, sondern wegen langer Wegstrecken am Boden auch durch natürliche Fressfeinde.
Vermutlich ist eine Kombination aus diesen Strategien am erfolgversprechendsten.
Aber mit welcher Kombination wird ein einzelnes Eichhörnchen unter bestimmten Annahmen (Witterungsverlauf, Gefahr durch Fressfeinde, Konkurrenz durch Artgenossen, etc.) am ehesten erfolgreich sein, das heißt, ausreichend Nahrung erhalten?
Wie wirkt sich die individuell erfolgreichste Kombination von Strategien sowie eine Mischung von verschiedenen Kombinationen über einen längeren Zeitraum auf die Gesamtpopulation der Eichhörnchen aus?
Entwickeln Sie ein Java-Programm zur vereinfachten Simulation einer Eichhörnchenpopulation, mit dessen Hilfe sich obige Fragen klären lassen.
Zumindest folgende Parameter sollen verwaltet werden:
- pro Individuum und Jahr im Winter benötigte Nahrungsmenge um fortpflanzungsfähig zu sein,
- pro Individuum und Jahr im Winter benötigte Nahrungsmenge um zu überleben (kleiner),
- durchschnittliche Zahl der jährlichen Nachkommen pro fortpflanzungsfähigem Individuum,
- Anzahl der Gruppen mit unterschiedlichen Strategie-Kombinationen innerhalb der Population,
- pro derartiger Gruppe folgende (gruppenspezifischen) Parameter:
- pro Individuum und Jahr gesammelte Menge an Vorräten,
- pro Individuum und Jahr ohne Bevorratung im Winter verfügbare Futtermenge (an Bäumen verbliebene Samen, Fütterung, etc.),
- Anteil der im Winter wiedergefundenen eigenen Vorräte (relativ zu den selbst gesammelten Vorräten),
- Anteil der im Winter gefundenen fremden Vorräte (relativ zu den durchschnittlich pro Individuum gesammelten Vorräten über alle Gruppen hinweg),
- Wahrscheinlichkeit eines Individuums, einen Winter wegen Alter, Krankheit oder Fressfeinden (also alles außer Nahrungsmangel) nicht zu überleben,
- Anfangsgröße der Gruppe.
Ein Simulationslauf über mehrere Jahre verwendet pro Jahr dieselben Parameterwerte (ausgenommen die Anfangsgrößen) und errechnet pro Jahr eine neue Größe jeder Gruppe.
Dabei fallen Nachkommen in dieselben Gruppen wie die Eltern.
Am Ende eines Simulationslaufs wird ein Text produziert, der alle verwendeten Parameterwerte sowie die jährlichen Veränderungen der Gruppengrößen in Form einer Tabelle enthält.
Schreiben Sie nur den Kern eines solchen Programms ohne Benutzerschnittstelle sowie ein Testprogramm.
Der Kern soll die oben beschriebene Funktionalität aufweisen, aber keinerlei Eingabe von der Tastatur oder Ausgabe auf den Bildschirm (und auch nicht von/auf eine Datei) machen.
Daher müssen alle benötigten bzw. erzeugten Daten über Parameter und Rückgabewerte von Methoden übergeben werden.
Das Testprogramm soll mittels java Test von Aufgabe1-3 aus aufrufbar sein und die oben beschriebene Funktionalität überprüfen.
Die Tests sollen selbständig ohne Benutzerinteraktion ablaufen, sodass Aufrufer keine Testfälle auswählen oder Testdaten eintippen müssen.
Testergebnisse sollen (in nachvollziehbarer und verständlicher Form) am Bildschirm ausgegeben werden.
Neben dem Testprogramm soll die Klasse Test.java als Kommentar eine kurze, aber verständliche Beschreibung der Aufteilung der Arbeiten auf die einzelnen Gruppenmitglieder enthalten – wer hat was gemacht.
Wie die Aufgabe zu lösen ist:
Der Programmcode Ihrer Lösung soll möglichst einfach sein und keine unnötige Funktionalität haben.
Der Code soll auch wiederverwendbar sein, da die nächste Aufgabe voraussichtlich auf Teilen davon aufbaut.
Vermeiden Sie jedoch Vorgriffe, das heißt, schreiben Sie
keine Programmteile aufgrund der Vermutung, dass diese Teile in der nächsten Aufgabe verlangt sein könnten.
Achten Sie bei der Lösung der Aufgabe besonders auf Datenabstraktion:
Alles, was kaum trennbar miteinander verbunden ist, soll in einem Objekt gekapselt sein, leicht voneinander trennbare Einheiten sollen zu verschiedenen Objekten gehören.
Es soll in Ihrem Programm mehrere, voneinander möglichst unabhängige Objekte geben (auch wenn sich das aufgrund der Aufgabenbeschreibung nicht von alleine ergibt).
Auf Daten soll nur über dafür vorgesehene Methoden zugegriffen werden.
Unnötige Zugriffe und unnötige Zugreifbarkeit von Daten und Methoden sind zu vermeiden.
Achten Sie auf hohen Klassenzusammenhalt und schwache Objektkopplung.
Diese Aufgabe hilft auch den Tutor(inn)en bei der Einschätzung Ihrer Kenntnisse sowie der Zusammenarbeit in der Gruppe.
Bitte sorgen Sie in Ihrem eigenen Interesse dafür, dass Sie diese Aufgabe in der Gruppe lösen (ohne Abschreiben) und jedes Gruppenmitglied etwa in gleichem Maße mitarbeitet.
Sonst könnten Sie bei einer Fehleinstufung wertvolle Zeit verlieren.
Scheuen Sie sich bitte nicht, Ihre(n) Tutor(in) um Hilfe zu bitten, falls Sie bei der Lösung der Aufgabe Probleme haben oder keine brauchbare Zusammenarbeit in der Gruppe zustandekommt.
Warum die Aufgabe diese Form hat:
Der Umfang der Aufgabe ist so gewählt, dass die Programmierung bei guter Organisation nicht viel Zeit in Anspruch nehmen sollte.
Nutzen Sie die Gelegenheit um die Aufgabenteilung und interne Abläufe innerhalb der Gruppe zu organisieren.
Auf eine genaue Spezifikation der Aufgabenstellung wird aus folgenden Gründen bewusst verzichtet:
- Sie sollen in der Gruppe diskutieren, wie Sie die Aufgabe verstehen und welche Lösungswege geeignet erscheinen.
- Sie sollen sich von Anfang an daran gewöhnen, dass Aufgaben in der Regel nicht vollständig spezifiziert sind, aber trotzdem bestimmte Vorgaben eingehalten werden müssen.
- Sie sollen sich eine eigene brauchbare Faktorisierung überlegen und dabei von Merkmalen wie Datenkapselung, Klassenzusammenhalt und Objektkopplung (statt starrer Vorgaben) leiten lassen.
- Sie sollen auch die Verantwortung für die Korrektheit Ihrer Lösung (so wie Sie sie selbst verstehen) übernehmen, indem Sie entsprechende Tests durchführen.
Allgemeine Informationen zur Übung
Folgende Informationen betreffen diese und auch alle weiteren Aufgabenstellungen.
Was Sie bei der Lösung der Aufgabe beachten sollen:
Unter der Überschrift
Wie die Aufgabe zu lösen ist
finden Sie einerseits Hinweise darauf, wie Sie die Lösung der Aufgabe vereinfachen können und welche Fallen Sie umgehen sollen, erfahren andererseits aber auch, welche Aspekte bei der Beurteilung als besonders wichtig betrachtet werden.
Bei der ersten Aufgabe kommt es beispielsweise besonders auf Datenabstraktion, Klassenzusammenhalt, Objektkopplung und die Einfachheit der Lösung an.
Das heißt, in späteren Aufgaben können Ihnen bei solchen Hinweisen auch für unnötig komplizierte oder umfangreiche Lösungen Punkte abgezogen werden, weil Sie sich nicht an die Vorgaben gehalten haben.
Fleißaufgaben
sind in diesem Fall also unerwünscht.
Unterschiedliche Aufgaben haben unterschiedliche Schwerpunkte.
Verlassen Sie sich nicht darauf, dass die nächste Aufgabe nach demselben Schema beurteilt wird wie die vorangegangene, sondern richten Sie sich nach der jeweiligen Aufgabenstellung.
Ein häufiger Fehler besteht darin, eine Aufgabe nur nach Gefühl zu lösen ohne zu verstehen, worauf es ankommt.
Meist bezieht sich die Aufgabe auf ein Thema, das kurz zuvor in der Vorlesung behandelt wurde.
Versuchen Sie, eine Beziehung zwischen der Aufgabenstellung und dem Vorlesungsstoff herzustellen.
Achten Sie besonders darauf, Fachbegriffe (wie Datenabstraktion, Klassenzusammenhalt und Objektkopplung) nicht nur umgangssprachlich zu interpretieren, sondern verwenden Sie diese Begriffe so wie in der Vorlesung und im Skriptum beschrieben.
Die ersten Aufgaben sind vermutlich auch ohne Skriptum leicht lösbar, spätere aber kaum.
Als Hilfestellung sind in jeder Aufgabenstellung Teile des Skriptums genannt, in denen die relevantesten Themen behandelt werden – bei komplizierten Themen oft nur wenige Seiten.
Versuchen Sie nicht, Teile der Aufgabenstellung durch Tricks oder Spitzfindigkeiten zu umgehen.
Beispielsweise gibt es immer wieder Lösungsversuche, in denen die Test-Klasse nur den String Tests erfolgreich
ausgibt statt tatsächlich Tests durchzuführen.
Solche Versuche werden durch händische Beurteilungen mit hoher Wahrscheinlichkeit erkannt.
Spätere Aufgaben enthalten oft Schwierigkeiten, die mit Allgemeinwissen alleine oder über aufgabenbezogene Internet-Recherchen kaum zu lösen sind.
Gerade in solchen Fällen ist davon abzuraten, die Schwierigkeiten durch Tricks zu umgehen.
Hinweise zur richtigen Lösung lassen sich im Skriptum und auf den Vorlesungsfolien finden.
Was Ihr(e) Tutor(in) von Ihnen wissen möchte:
Ihr(e) Tutor(in) wird Ihnen in Kürze eine Mail schreiben, in der sie oder er sich vorstellt und um Informationen über Sie bittet.
Geben Sie ihr oder ihm diese Information möglichst bald, damit die Tutorin bzw. der Tutor die für Sie am besten geeignete Form der Betreuung wählen kann.
Unabhängig von der Form der Betreuung kann natürlich jedes Gruppenmitglied jederzeit konkrete Fragen an den Tutor oder die Tutorin richten.
Scheuen Sie sich bitte nicht, sich auch mit organisatorischen oder gruppeninternen Problemen, die Sie möglicherweise nicht selbst lösen können, an den Tutor oder die Tutorin zu wenden.
Je früher Tutor(inn)en von Problemen erfahren, desto einfacher sind sie zu lösen.