# Nachdenkzettel: Clean Code und Code Smells

Bearbeiten Sie die Aufgaben kurz und präzise. Ziel ist nicht, perfekten Code zu schreiben, sondern Code Smells zu erkennen und sinnvolle Verbesserungen zu begründen.

## 1. Vererbungsexplosion

Gegeben sind folgende Klassendefinitionen:

```java
class Formularfeld;
class Textfeld extends Formularfeld;
class Zahlfeld extends Formularfeld;
class TextUndZahlFeld extends Formularfeld;
class TextfeldOCR extends Textfeld;
class ZahlfeldOCR extends Zahlfeld;
class TextUndZahlFeldOCR extends TextUndZahlFeld;
class TextfeldSonderZ extends TextUndZahlFeld;
class TextfeldOCRSonderZ extends TextUndZahlFeldOCR;
// ...
```

Jede weitere Eigenschaft oder Spezialisierung führt zu vielen neuen Klassen durch Kombination. Die Folge ist ein explosives Anwachsen der Zahl der Klassen mit identischem oder sehr ähnlichem Code.

**Aufgaben:**

1. Benennen Sie den Code Smell.
2. Erklären Sie in zwei bis drei Sätzen, warum diese Lösung schwer wartbar ist.
3. Nennen Sie eine Alternative zur Vererbung.
4. Skizzieren Sie kurz, wie man `OCR`, `Sonderzeichen` und `Eingabetyp` eher als austauschbare Eigenschaften modellieren könnte.

## 2. Unvollständig initialisierte Objekte

Betrachten Sie die Klasse `ExamResult`:

```java
public class ExamResult {
    private String studentId;
    private String courseId;
    private int points;
    private int maxPoints;

    public void setStudentId(String s) {
        this.studentId = s;
    }

    public void setCourseId(String c) {
        this.courseId = c;
    }

    public void setPoints(int p) {
        this.points = p;
    }

    public void setMaxPoints(int m) {
        this.maxPoints = m;
    }
}
```

**Aufgaben:**

1. Was kann bei der Initialisierung eines `ExamResult`-Objekts schiefgehen?
2. Welche ungültigen Zustände sind möglich?
3. Warum sind die Parameternamen `s`, `c`, `p` und `m` ungünstig?
4. Schreiben Sie eine kurze verbesserte Variante mit Konstruktor und sprechenden Parameternamen.
5. Ergänzen Sie mindestens eine einfache Prüfung gegen ungültige Werte.

## 3. Kleine PMD-Analyse

PMD ist ein Werkzeug zur statischen Codeanalyse. Es kann typische Probleme wie ungenutzte Variablen, leere Kontrollstrukturen, unnötige Ausdrücke oder problematische Stilentscheidungen finden.

Nutzen Sie ein Maven-Projekt und ergänzen Sie in der `pom.xml` nur den PMD-Plugin-Eintrag mit den Standardeinstellungen:

```xml
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-pmd-plugin</artifactId>
            <version>3.28.0</version>
        </plugin>
    </plugins>
</build>
```

Führen Sie danach aus:

```bash
mvn pmd:pmd
```

Der Bericht wird typischerweise unter `target/site/pmd.html` erzeugt. Verwenden Sie für diese Aufgabe zunächst die Standardregeln von PMD. Eigene Rulesets sind hier nicht notwendig.

Analysieren Sie diese Klasse:

```java
public class SmellyCode {
    private int unusedField;

    public void calculate(int x) {
        int result = 0;

        if (x > 0) {
        }

        for (int i = 0; i < 10; i++) {
            result = result + x;
        }

        if (result == result) {
            System.out.println("Result: " + result);
        }
    }
}
```

**Aufgaben:**

1. Notieren Sie drei PMD-Meldungen oder Auffälligkeiten.
2. Welche dieser Meldungen ist aus Ihrer Sicht am sinnvollsten? Begründen Sie kurz.
3. Verbessern Sie den Code so, dass mindestens zwei Probleme verschwinden.
4. Gibt es eine PMD-Meldung, die Sie nicht automatisch übernehmen würden? Warum?

## 4. Clean Code mithilfe von KI

Nutzen Sie ein KI-Werkzeug Ihrer Wahl, um den Code aus Aufgabe 2 oder Aufgabe 3 verbessern zu lassen. Übernehmen Sie den Vorschlag nicht ungeprüft.

**Aufgaben:**

1. Geben Sie den Prompt an, den Sie verwendet haben.
2. Notieren Sie zwei Verbesserungen, die der KI-Vorschlag enthält.
3. Notieren Sie eine Stelle, die Sie kritisch sehen oder nicht übernehmen würden.
4. Vergleichen Sie kurz: Was findet PMD, was findet die KI?

## Abgabe

Geben Sie ab (in der PDF Ihres Nachdenkzettels, keine extra Code):

1. Ihre kurzen Antworten zu den Aufgaben.
2. Eine verbesserte Version von `ExamResult` oder `SmellyCode`.
3. Einen Screenshot oder kurzen Textauszug aus dem PMD-Bericht.
