Clean - Architecture Erweiterung
This commit is contained in:
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@ -13,7 +13,7 @@
|
|||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="19" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_19" default="true" project-jdk-name="19" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/out" />
|
<output url="file://$PROJECT_DIR$/out" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
3
luca.qmd
3
luca.qmd
@ -448,7 +448,8 @@ public class ExecutionState {
|
|||||||
`Controller_Frontend` implementiert ein Interface, wodurch die Substituierbarkeit gemäß LSP gewährleistet ist:
|
`Controller_Frontend` implementiert ein Interface, wodurch die Substituierbarkeit gemäß LSP gewährleistet ist:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public class Controller_Frontend extends PICComponent implements FrontendControllerInterface { }
|
public class Controller_Frontend extends PICComponent
|
||||||
|
implements FrontendControllerInterface { }
|
||||||
|
|
||||||
public void resetPC() {
|
public void resetPC() {
|
||||||
programCounter = 0;
|
programCounter = 0;
|
||||||
|
|||||||
59
paul.qmd
59
paul.qmd
@ -260,9 +260,58 @@ Das genutzte Observer-Pattern und seine Verwendungen im (Nicht-Test-) Code.
|
|||||||
|
|
||||||
|
|
||||||
# Clean Architecture
|
# 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
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user