Blatt 05: Git-Quest und LSF-Contact (Git Branches, Methoden-Referenzen, Logging)
(1 Punkt)
Ihr Code soll einheitlich formatiert und dokumentiert sein. Sie können beides prüfen:
./gradlew spotlessCheck
für die Formatierung und ./gradlew checkstyleMain
für die
Dokumentation1 mit Javadoc.2 Während Sie die Dokumentation bei Fehlern manuell anpassen
müssen (siehe Lektion “Javadoc”), können Sie mit ./gradlew spotlessApply
den Code
automatisch formatieren lassen - tun Sie das am besten vor jedem Commit.
A05.1: Git-Spiel (40%)
(Verteilung: 10%, 10%, 10%, 10%)
Betrachten Sie erneut die Vorgaben zur "Git-Quest". Die Geschichte des Helden Markus findet
im master
-Branch kein Ende, sondern erst im Hilfsbranch end
.
Machen Sie nun verschiedene Experimente mit Branches in Git, und starten Sie dabei jeweils mit einem frischen Klon der Vorgaben.
- Ändern Sie eine Datei, die im Branch
end
nicht verändert wurde. Erzeugen Sie mit diesen Änderungen auf demmaster
einen neuen Commit. Mergen Sie danach den Branchend
in denmaster
-Branch. - Ändern Sie nun eine Datei, die auch im Branch
end
verändert wurde. Achten Sie dabei darauf, die Änderung an einer anderen Stelle in der Datei vorzunehmen. Erzeugen Sie mit diesen Änderungen auf demmaster
einen neuen Commit. Mergen Sie danach den Branchend
in denmaster
-Branch. - Wie (2), aber ändern Sie nun eine Stelle, die auch im Branch
end
verändert wurde. Erzeugen Sie mit diesen Änderungen auf demmaster
einen neuen Commit. Mergen Sie danach den Branchend
in denmaster
-Branch. Was passiert, wenn die Änderung immaster
identisch zu der inend
ist? Was passiert, wenn die Änderung immaster
anders ist als inend
? - Wie (2), aber setzen Sie bitte den Branch
end
auf die Spitze vonmaster
, bevor Sieend
inmaster
mergen.
Was beobachten Sie jeweils? Erklären Sie Ihre Beobachtungen. Wenn es Konflikte gibt: Wie lösen Sie diese auf? Demonstrieren Sie das Vorgehen im Praktikum live.
LSF-Contact
Betrachten Sie die Vorgaben "LSF-Contact". Klonen Sie das Repo und laden Sie das Projekt als Gradle-Projekt in Ihre IDE.
A05.2: Methoden-Referenzen (40%)
Sie finden im Package lsfcontact
eine Klasse Student
. Jede Instanz dieser Klasse hat
mindestens einen Namen (String
), und man kann verschiedene Konktaktmöglichkeiten per Setter
setzen: EMail-Adresse, Telefonnummer, Post-Adresse (alle String
).
Die Klasse LsfContactUtil
soll ein Hilfsmodul im LSF simulieren, mit der man die
Studierenden kontaktieren kann. Es gibt drei verschiedene Methoden, die jeweils mit einer
Liste mit Student
-Objekten aufgerufen werden und die alle Studierenden mit der entsprechend
gesetzten Kontaktoption über diesen Kontaktweg ansprechen. Beispiel: Die Methode
emailStudents
filtert alle Studierenden, deren EMail-Adresse gesetzt ist (d.h. deren
EMail-Adresse ein nicht-leerer String ist) und "schickt" diesen Studierenden eine "EMail" über
den Aufruf der privaten Hilfsmethode email
.
Die Klasse Main
erzeugt einige Student
-Objekte, gruppiert sie in einer Liste und
demonstriert die Aufrufe der Methoden in LsfContactUtil
.
Es fällt auf, dass die drei Methoden emailStudents
, phoneStudents
und writeStudents
algorithmisch identisch sind und sich nur in der Abfrage der entsprechenden Kontaktoption und
dem Aufruf der internen Kontakt-Methode unterscheiden. Auch die internen Kontakt-Methoden
email
, phone
und write
sind recht einfallslose Code-Duplikate.
Schreiben Sie die Klasse LsfContactUtil
so um, dass es nur noch eine public
Methode für
das Kontaktieren einer Liste von Student
-Objekten gibt. Fassen Sie ebenfalls die drei
private
Hilfsmethoden zu einer neuen Hilfsmethode zusammen - dabei soll es inhaltlich bei
dem System.out.println()
mit den aktuell verwendeten Informationen bleiben. Überlegen Sie,
wie Sie die Abfrage der Kontaktmöglichkeit und auch die Kriterien für die Prüfung der Strings
von außen als Parameter in die Methode hineingeben können. Passen Sie die Schnittstellen an,
so dass der neuen public
Methode zusätzlich zur List<Student>
passende Methodenreferenzen
übergeben werden können. Ändern Sie die Demo-Aufrufe in Main
entsprechend. Die Klasse
Student
verändern Sie bitte nicht.
Tipp: Gehen Sie schrittweise vor und starten zunächst mit geeigneten Lambda-Ausdrücken. Schaffen Sie es, diese durch Methodenreferenzen zu ersetzen?
Achten Sie darauf, alle Schritte nachvollziehbar in Ihrer Arbeitskopie per Git Commit festzuhalten. Demonstrieren Sie dies im Praktikum.
A05.3: Logging (20%)
Bauen Sie für das LsfContactUtil
ein Logging auf der Basis von java.util.logging
ein: Jede
Benachrichtigung von Studierenden soll in ein gemeinsames CSV-File geloggt werden. Dabei soll
pro Logging-Vorgang eine neue Zeile mit den folgenden Informationen angehängt werden:
- Log-Level,
- Name der den Log-Vorgang auslösenden Methode,
- Name der Klasse, in der die den Log-Vorgang auslösenden Methode angesiedelt ist,
- Log-Meldung, bestehend aus
- Name des kontaktierten Studierenden,
- genutzte Adresse des Studierenden (Mail- oder Postadresse oder Telefonnummer),
- Kontaktmodus (wird eine Mail geschickt oder ein Brief geschrieben oder ein Anruf getätigt).
Demonstrieren Sie in der Abgabe, wie Sie im Test oder im Hauptprogramm den Logger steuern können, beispielsweise Änderung der Log-Level oder Abschalten des Loggings.