From ffb8d6a5b370a2ceed3c37af2ce1f38f62550ed2 Mon Sep 17 00:00:00 2001 From: Nicolas Ganz Date: Fri, 26 Nov 2021 09:10:39 +0100 Subject: [PATCH] added evalutation --- Bewertung_TextEditor.md | 136 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 Bewertung_TextEditor.md diff --git a/Bewertung_TextEditor.md b/Bewertung_TextEditor.md new file mode 100644 index 0000000..6df5923 --- /dev/null +++ b/Bewertung_TextEditor.md @@ -0,0 +1,136 @@ +# Bewertung Text Editor +## 🥇 13 Punkte von 15 + +👫 brandleo@students.zhaw.ch; fassband@students.zhaw.ch; schrom01@students.zhaw.ch; zieglmic@students.zhaw.ch; amadoste@students.zhaw.ch + +## Allgemeine Anforderungen (all-or-nothing) + +> Voraussetzung für Punkterteilung: Die Applikation ist lauffähig. + +## Entwicklung + +👨‍🏫 9.5 Punkte von 11 + +### Funktionalität: 3.5 Punkte von 4 + +> Vorführung oder Test durch Betreuer +> - (ADD, DEL, REPLACE) Einfügen und Löschen ganzer Absätze; Globales Suchen und Ersetzen von Text innerhalb > eines Absatzes. +> - (FORMAT RAW, PRINT) Unformatierte, absatzweise Ausgabe des Textes mit Angabe der Absatznummer +> - (INDEX) Ausgabe eines Indexes (Wortverzeichnisses) aller Worte, die öfter als zweimal auftreten mit Angabe des Absatzes +> - (FORMAT FIX, PRINT) Formatierte Ausgabe von Text mit einer einstellbaren maximalen Spaltenbreite Zeichen, Zeilenumbruch jeweils auf dem letzten Lehrzeichen +> - Sonderzeichen werden gefiltert +> - Fehlermeldungen auf `System.err` + +* `FORMAT RAW` sollte das Standardverhalten sein. +* `FORMAT FIX`: + * Wenn ein Wort länger ist als die Breite sollte es im Wort umgebrochen werden. + * Es bricht um wenn der Text `>= columnWidth` ist. Die Idee ist es *nach* der Spaltenbreite umgebrochen wird (Leerzeichen zählt nicht dazu) + +### CleanCode und Konstrukte: 1.5 Punkte von 2 + +> Sie halten die Vorgaben hinsichtlich einsetzbarer Konstrukte und Clean Code ein, und Ihr Code ist sauber dokumentiert. (Kriterium: Codeanalyse durch Betreuer, ggf. Erläuterung) + +* Der `TextLogic` Konstruktor macht viel zu viel + * Ein Konstruktor sollte nur das Objekt einrichten/vorbereiten + * Besser: `TextLogic textLogic = new TextLogic(); textLogic.run();` + * Zudem ist er zu lange. Es würde sich lohnen mehrere Funktionen daraus zu machen (z.B. jeder Befehl seine eigene Funktion) +* `Text.createWordList` sollte nicht eine leere Map als Parameter übernehmen, sondern die Map selbst erstellen und zurückgeben. +* `Text.add`und `TextOutput.formatRaw` geben immer `true` zurück. Rückgabewert kann weggelassen werden. +* *Tipp:* Beachten Sie die Meldungen von IntelliJ. Sie können auch das ganze Projekt überprüfen lassen (Code -> Inspect Code) + +### Klassendesign: 2.5 Punkte von 3 + +> Sie haben eine sinnvolle Aufteilung in Klassen und Klassendefinitionen gefunden. (Dokumentation der Klassenhierarchie ist mit hochzuladen. Kriterium: Analyse durch Betreuer, ggf. Erläuterung) + +* Gute Aufteilung der Klassen und deren Aufgabenbereiche +* Die Pfeile zeigen in die falsche Richtung. Ein Assoziationspfeil (`A -> B`) bedeutet: `A` verwendet `B` +* Hinweis: + * Es macht es etwas übersichtlicher, wenn unterschiedliche Pfeile sich nicht überschneiden +### Test: 2 Punkte von 2 + +> Sie haben sinnvolle Test Cases für die Funktion Index definiert, diese in JUnit umgesetzt und erfolgreich ausgeführt. + +* Sehr gute Auswahl von Tests +* Hinweise + * Ein `BeforeEach` ist nicht immer nötig + * Nachteil von `BeforeEach`: Es macht die Tests unübersichtlicher; es genügt nicht die Test-Funktion anzusehen + * Nützlich wenn das Erstellen des Anfangszustandes komplex ist, nicht aber wenn es nur ganz einfache Konstruktoren sind; Besonders auch wenn es nicht in allen Test-Funktionen verwendet wird (`stringListe`) + * Nur bestimmte Werte einer Liste zu prüfen ist nicht zuverlässig. Es könnte z.B. zu viele Einträge haben. Beispiel: + +```java +Assertions.assertEquals("Word 1, 2", stringListe.get(0)); +Assertions.assertEquals("Test 1, 2, 3", stringListe.get(1)); + +// more precise: +Assertions.assertEquals(List.of("Word 1, 2", "Test 1, 2, 3"), stringListe); +``` + +* Tests können verschachtelt/gruppiert werden: + +```java +class TextTest { + @BeforeEach + void makeTestLists() { + // ... + } + + @Nested + class IndexTest { + @Test + void emptyTest() { + // ... + } + } +} +``` + +* Gedanken-Experiment: Wie würden Sie jetzt wo Sie Vererbung kennen die Konsolen-Ausgabe testen? + +## Vorgehen und Dokumentation + +👨‍🏫 3.5 Punkte von 4 + +### Dokumentation: 2.5 Punkte von 3 + +> - Ihr Code ist in Javadoc (mindestens für Klassen und Public Methods und zusätzlich für Konstruktoren, jedoch generell ohne Getter/Setter) und wo sinnvoll in Zeilenkommentaren zur Funktionalität dokumentiert. +> - Klassendiagramm ist auf GitHub abgelegt. +> - Relevante Informationen finden sich im README. + +* `@Class` und `@Constructor` Tags gibt es nicht. Dies verwirrt Generatoren von Dokumentationen. Z.B. IntelliJ zeigt diese auch nicht an. +* Verwenden Sie Tags für z.B. Autoren: `@author` + * Dies ermöglicht bessere Anzeige +* Hinweis + * Das Datum würde ich nicht in die Dokumentation schreiben + * Das sind redundante Informationen, welche bereits in git vorhanden sind + * Es ist schnell passiert, dass es vergessen wird anzupassen und schlechter als keine Dokumentation ist eine falsche Dokumentation + + +### Beitrag: 1 Punkt von 1 + +> Alle Gruppenmitglieder haben gleichermassen Code beigetragen und auf GitHub eingechecked. (Eine einfache Variante wäre, dass jedes Gruppenmitglied für bestimmte Klassen verantwortlich ist, andere Aufteilungen sind aber denkbar. Kriterium: Check durch GitHub Log, Dokumentation im Code.) + +* Alle haben gleichmässig beigetragen + +## Zusätzliche Hinweise (nicht bewertet) + +* Guard-Clauses können auch in Loops verwendet werden (Beispiel `Text.createWordList`): +```java +// without +for (String word : words) { + if (word.length() > 0) { + // complex implementation + } +} +// with guard-clauses +for (String word : words) { + if (word.length() == 0) { + continue; + } + // complex implementation +} +``` + +* Es sollte nicht im Default-Namespace gearbeitet werden + * Dies erschwert die Verwendung aus einem anderen Program + * Der Code ist nicht klar verpackt + * Gängig: wie eine umgekehrte Domain. Z.B. `ch.zhaw.text_editor`