Child pages
  • ST2-Workshop 03.05.2021


ST2-Workshop 03.05.2021

In diesem Workshop geht es um praktische Übungen zum Thema SOLID und Clean Code. Dies ist auch der Gegenstand des Meilensteins M1, der heute vorgestellt wird. 

Agenda

  • Fragen zu den Inhalten oder zu aktuellem Meilenstein
  • Aufgabenstellung für heute: Verbessern des Text Adventures
  • Bearbeitung
  • Ergebnisvergleich und Diskussion

Übungsaufgabe für diesen Workshop

Das Textadventure kennen Sie noch vom letzten Workshop. Wir haben es etwas vereinfacht - es sind jetzt nur noch ca. 300 LoC. Aus diesem Grund haben wir darauf verzichtet, zwei Aufgabenstellungen bereitzustellen - das hätte den Aufwand nicht gerechtfertigt, und ich weiß auch nicht, ob man die Effekte von "schlechtem Code" bei einem noch kürzeren Beispiel noch sehen würde. 

Hier ist das aktualisierte Beispiel: https://git.st.archi-lab.io/students/st2/ss21/exercises/textadventure. (Wir haben einfach auf 2 Level reduziert, dadurch schrumpft der Code.)

Änderungen

Bitte setzen Sie folgende Änderungen um und achten Sie dabei auf SOLID-Prinzipien und Clean-Code-Regeln.

  1. Es gibt zunächst nur ein Dungeon, das aber größer ist (5 x 5 oder größer). 
  2. In diesem Dungeon befinden Sie sich (der Player) und mindestens ein Monster. 
  3. Nach jedem Zug wird weiterhin das Dungeon ausgeprintet, aber es zeigt neben Ihrer Position auch das (oder die) Monster an. 
  4. Auf jedem Feld des Dungeons kann immer nur ein "Lebewesen" stehen - egal ob Player oder Monster.
  5. Monster bewegen sich zufällig über das Dungeon, jeweils ein Feld in s/w/e/n Richtung. Sie können selbst entscheiden, ob Monster sich in jedem Zug bewegen oder seltener. 
  6. Wenn der Player neben einem Monster steht, kann er
    1. kämpfen, indem er eine Waffe benutzt ("u"),
    2. oder etwas anders tun ("d" oder "t") - in diesem Fall wird das Monster ihn angreifen,
    3. oder weglaufen. 
  7. Waffen liegen als Items auf den Feldern des Dungeons, wo sie gefunden und aufgesammelt werden können.
    1. Sie können sich selbst ausdenken, welche Waffen (in welcher Reihenfolge ...?) nötig sind, um das Monster zu besiegen. 

Hinweis

Sie müssen nicht unbedingt ein Refactoring des Codes machen (da bleiben Sie eng am existierenden Code und verbessern diesen). Sie können auch eine verbesserte Version "daneben" hochziehen und quasi das Spiel neu schreiben (und sich ggfs. mit Code-Schnipseln bedienen). 

Folgende Aufgaben sollten Sie bearbeiten.

A) Designen Sie Ihre Entities

Welche Entities haben Sie in diesem Adventure, wenn Sie vom dem jetzigen "alles in einer Main-Klasse"-Stil wegkommen wollen? Designen Sie ein logisches Datenmodell.

  • Am besten grob, nicht zu viel Details. Die wichtigsten Attribute wären sinnvoll. 
  • Beziehungsrichtung wären ebenfalls sinnvoll.

Achten Sie auf das Single Responsibility Principle.

B) Designen Sie sinnvolle Abstraktionen

Für das Open-Closed und das Interface Segregation Principle sollten Sie (wo sinnvoll) Abstraktionen designen, die Schnittstellen für Ihre Entities bereitstellen. Das können Role Interfaces oder abstrakte Klassen sein. 

C) Überführen Sie den vorhandenen Code in Ihre neue Struktur (oder schreiben Sie die Anwendung von Grund auf neu)

Setzen Sie das Refactoring um und beachten Sie dabei die Clean-Code-Regeln - hier noch einmal in der Übersicht: 


Clean Code Regelmöglicher Verstoß
1. Meaningful nameswelche Variable würden Sie umbenennen?
2. Comments only where necessarySind welche zu viel? Wo fehlen Ihnen welche?
3. Keep your methods small... die ist einfach ...
4. No side effect in a methodGibt es irgendwo Seiteneffekte im Code?
5. Only 1 level of abstractionSieht man irgendwo verschiedene Abstraktions-Level direkt nebeneinander?
6. Stepdown ruleWenn Sie als erstes mal die Riesenmethode in Main zerteilen würden, schafft man es, die Stepdown Rule anzuwenden?
7. Proper error handling (exceptions)Wo im Code würden Exceptions helfen?