Clean - Architecture Erweiterung

This commit is contained in:
2025-05-31 01:21:52 +02:00
parent cf1bddd231
commit 9d393deaa7
3 changed files with 57 additions and 7 deletions

View File

@ -260,9 +260,58 @@ Das genutzte Observer-Pattern und seine Verwendungen im (Nicht-Test-) Code.
# Clean Architecture
Die Clean Architecture ist dafür gedacht, Softwareprojekte langfristig betreiben, flexibel und wartbar halten zu könnnen. Man teilt das Softwareprojekt in verschiedene Schichten ein, bei denen ein klarer Abhängigkeitsfluss von den äußeren zu den inneren Schichten besteht. Unser Projekt besitzt eine [Interfaces-Schicht](https://git.paulmartin.cloud/paul/PIC-Simu/src/commit/f28603843d7ef6cbf4666ab2b2ceda02ca411eb7/src/main/java/fabrik/simulator/pic16f84/interfaces), die alle Klassen offenlegt, die miteinander kommunizieren. Alle Klassen im [`package fabrik.simulator.pic16f84`](https://git.paulmartin.cloud/paul/PIC-Simu/src/commit/f28603843d7ef6cbf4666ab2b2ceda02ca411eb7/src/main/java/fabrik/simulator/pic16f84), die nicht das [`FrontendSpecificObject`](https://git.paulmartin.cloud/paul/PIC-Simu/src/commit/f28603843d7ef6cbf4666ab2b2ceda02ca411eb7/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/FrontendSpecificObject.java) `extenden`, sind in einer Schicht weiter außen, dem Application Code. Alle Klassen - nicht Interfaces -, die das [`FrontendSpecificObject`](https://git.paulmartin.cloud/paul/PIC-Simu/src/commit/f28603843d7ef6cbf4666ab2b2ceda02ca411eb7/src/main/java/fabrik/simulator/pic16f84/frontendspecifics/FrontendSpecificObject.java) `extenden`, also [alle Klassen im `package fabrik.simulator.pic16f84.frontendspecifics`](https://git.paulmartin.cloud/paul/PIC-Simu/src/commit/f28603843d7ef6cbf4666ab2b2ceda02ca411eb7/src/main/java/fabrik/simulator/pic16f84/frontendspecifics), [`Controller_Frontend`](https://git.paulmartin.cloud/paul/PIC-Simu/src/commit/f28603843d7ef6cbf4666ab2b2ceda02ca411eb7/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java), [`CreateWindow`](https://git.paulmartin.cloud/paul/PIC-Simu/src/commit/f28603843d7ef6cbf4666ab2b2ceda02ca411eb7/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java), [`IOPorts`](https://git.paulmartin.cloud/paul/PIC-Simu/src/commit/f28603843d7ef6cbf4666ab2b2ceda02ca411eb7/src/main/java/fabrik/simulator/pic16f84/IOPorts.java) und [`ToggleButtonGroupExt`](https://git.paulmartin.cloud/paul/PIC-Simu/src/commit/f28603843d7ef6cbf4666ab2b2ceda02ca411eb7/src/main/java/fabrik/simulator/pic16f84/ToggleButtonGroupExt.java).
Main-Klasse:
- Alle Objekte werden erstellt und dem Locator hinzugefügt
- WindowManagement startet das Frontend. Wenn man alle Referenzen darauf (Z. 19, 20, 23) entfernen würde, würde App trotzdem starten und funktionieren.
+ Evtl Schaubild
Die Clean Architecture ist darauf ausgelegt, Softwareprojekte langfristig betreibbar, flexibel und wartbar zu halten. Dazu wird das Projekt in **konzentrische Schichten** unterteilt, in denen die **Abhängigkeitsrichtung stets von außen nach innen** verläuft die sogenannte *Dependency Rule*. Der Kern der Anwendung bleibt dabei vollständig unabhängig von technischen Details wie Benutzeroberflächen, Datenbanken oder Netzwerken.
In unserem Projekt haben wir diese Schichtarchitektur wie folgt umgesetzt:
## 1. Interface/Adapter-Schicht
Diese Schicht enthält alle Klassen, die als Schnittstelle zwischen der Anwendung und der Benutzeroberfläche dienen.
Dazu zählen alle Klassen im Package, `fabrik.simulator.pic16f84.frontendspecifics` insbesondere:
- `Controller_Frontend`
- `CreateWindow`
- `IOPorts`
- `ToggleButtonGroupExt`
Diese Klassen erben vom `FrontendSpecificObject` und sind spezifisch für die grafische Oberfläche. Sie implementieren die Schnittstellen der inneren Schichten und leiten Benutzerinteraktionen weiter.
## 2. Application Code
Die nächstinnere Schicht beinhaltet die anwendungsspezifische Logik unsere *Use Cases*. Dazu zählen sämtliche Klassen im Package `fabrik.simulator.pic16f84`, **sofern sie nicht vom `FrontendSpecificObject` erben**. Diese Schicht ist weitgehend unabhängig von der GUI und bleibt stabil, selbst wenn sich die Darstellung oder Eingabeform ändert.
Diese Klassen gehören zur Anwendungslogik:
- `Timer`
- `PreScaler`
- `WatchdogTimer`
- `ProgrammStack`
## Main-Klasse als Plugin
Die `Main`-Klasse bildet den äußeren Rahmen (Plugin-Schicht) und initialisiert die gesamte Anwendung:
- Es werden alle Objekte erzeugt und dem `Locator` zugewiesen.
- Das `WindowManagement` startet das Frontend.
Ein besonders interessanter Aspekt: Wenn man sämtliche Referenzen auf das Frontend (z.B. in Zeile 19, 20, 23) entfernt, lässt sich die App **trotzdem erfolgreich starten und nutzen**. Das zeigt, dass die Schichten entkoppelt sind ein zentrales Ziel der Clean Architecture.
\newpage
## Visualisierung
```{mermaid}
flowchart TB
subgraph Interface/Adapter-Schicht
A1[Controller_Frontend, CreateWindow, IOPorts, ToggleButtonGroupExt]
end
subgraph Application Code
A2[Use Cases, WatchdogTimer, PreScaler, ProgrammStack, Timer, InstructionDecoder, AssemblerProgram, PicThread]
end
subgraph Kern
A3[Main.java]
end
A1 --> A2
A2 --> A3
```