diff --git a/.gitignore b/.gitignore index 4e7cc61c5c38f407499b0c204bd89395970a3e56..bf69acdd32bbc0d642066a056ea6f2eb90b4f2f0 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,23 @@ com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties + +# macOS gitignore +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk \ No newline at end of file diff --git a/website/assignments/Softwarearchitektur.md b/website/assignments/Softwarearchitektur.md new file mode 100644 index 0000000000000000000000000000000000000000..4a59eb9e5e6407dc268528e892b16ed18798e626 --- /dev/null +++ b/website/assignments/Softwarearchitektur.md @@ -0,0 +1,26 @@ +# Übungen Software-Entwicklung 3: Software-Architektur + +## Ausgangslage +Nachdem Sie letzte Woche sich überlegt haben, welches Thema Sie bearbeiten wollen, sollen Sie nun in erste Umsetzungen starten. + +## Aufgabe +* Überlegen Sie sich welche Teilkomponenten für Ihre Projektaufgabe notwendig sind. +* Identifzieren Sie zusammengehörige Komponenten und bündeln diese. Erstellen Sie für z.B. ein Klassendiagramm. +* Definieren Sie, wie die Kommunikation zwischen diesen Komponenten stattfinden soll. Achten Sie auf Austauschbarkeit und Erweiterbarkeit. +* Denken Sie darüber nach, welche Teile Ihres Projekts besonders verlässlich bzgl. der Schnittstelle sind. +* Unterteilen Sie Ihr Projekt in `packages`. Nutzen Sie zur Zugriffssteuerung die verschiedenen Sichtbarkeiten für Klassen. +* Nutzen Sie `Interfaces` und `Factories` zur Kapselung und Modularisierung. + +## Tipps +* Beginnen Sie mit der einfachsten Umsetzung Ihrer Kernanforderungen. Fangen Sie erst im Anschluss mit der Strukturierung/Modularisierung Ihres Projekts an +* Schauen Sie in das [Vorlesungsprojekt](https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022projekt). Hier finden Sie eine Möglichkeit wie Sie ihr Projekt untergliedern und modularisieren können. +* **Wichtig für später**: Erstellen Sie Ihr Java-Projekt mit Maven. +* Stellen Sie sich vor, dass Ihre Module als einzelne Artefakte deploybar sein sollen. +* Wenn Sie möchten, schauen Sie sich Informationen zu Java Modules an und überlegen sich, ob sie diese für Ihr Projekt einsetzen wollen. + +## Ziele +* Grundstruktur Ihres Projekts steht. +* Aufteilung in modulare Einheiten. +* Nutzen von Interfaces statt konkreter Implementierung. +* Nutzung von Factories. + diff --git a/website/img/softwarearchitektur/big_ball_of_mud.png b/website/img/softwarearchitektur/big_ball_of_mud.png new file mode 100644 index 0000000000000000000000000000000000000000..b7624fc09e7894b851ab7581e1c3b7753d9d9f7f Binary files /dev/null and b/website/img/softwarearchitektur/big_ball_of_mud.png differ diff --git a/website/img/softwarearchitektur/saturn_v_collage.jpg b/website/img/softwarearchitektur/saturn_v_collage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2ad747f321fe25b93e3b5bba755aac5d7345afc Binary files /dev/null and b/website/img/softwarearchitektur/saturn_v_collage.jpg differ diff --git a/website/img/software_product_quality.png b/website/img/softwarearchitektur/software_product_quality.png similarity index 100% rename from website/img/software_product_quality.png rename to website/img/softwarearchitektur/software_product_quality.png diff --git a/website/index.html b/website/index.html index 428fd71f8fcfa9a819eafbd3b3add86c19ba9d4a..4a8eb532cf03815b066c23ec734b0d172df71634 100644 --- a/website/index.html +++ b/website/index.html @@ -17,6 +17,7 @@ <h3>Vorlesungnotizen</h3> <ul> <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/lecturenotes/20220321.md" target="_blank">Vorlesungsnotizen - 21.03.2022</a></li> + <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/lecturenotes/20220328.md" target="_blank">Vorlesungsnotizen - 28.03.2022</a></li> </ul> <h3>Projekt</h3> @@ -25,6 +26,7 @@ <li><a href="projektideen.html" target="_blank">Projektideen/ Vorschläge</a></li> <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/assignments/Projektbeschreibung.md" target="_blank">Projektbeschreibung</a> </li> <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/assignments/Anforderungsanalyse.md" target="_blank">Übung: Anforderungsanalyse</a> </li> + <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/assignments/Softwarearchitektur.md" target="_blank">Übung: Softwarearchitektur</a> </li> </ul> <h3>Organisatorisches</h3> diff --git a/website/lecturenotes/20220328.md b/website/lecturenotes/20220328.md new file mode 100644 index 0000000000000000000000000000000000000000..9a53a60bb8514d6b8b0bb984ca78013c5e3a6e49 --- /dev/null +++ b/website/lecturenotes/20220328.md @@ -0,0 +1 @@ +# Vorlesungsnotizen - 28.03.2022 \ No newline at end of file diff --git a/website/softwarearchitektur.html b/website/softwarearchitektur.html index 3bf2dca9419aa54d8713ed06603319c462f2d883..db321d5f437ccac1d0320ea6fe2d24674d6be772 100644 --- a/website/softwarearchitektur.html +++ b/website/softwarearchitektur.html @@ -1,8 +1,9 @@ <!DOCTYPE html> <html> <head> - <title>Title</title> + <title>Softwarearchitektur</title> <meta charset="utf-8"> + <link href="css/hdm.css" rel="stylesheet"></link> <style> @import url(https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz); @import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic); @@ -19,7 +20,7 @@ <body> <textarea id="source"> -class: center, middle +class: center, middle, first # Software-Entwicklung 3 @@ -30,8 +31,10 @@ class: center, middle # Agenda 1. Recap - -Was ist Softwarearchitektur?, Design Pattern Überblick, Systemarchitektur, Architekturmuster, Wie wird Code strukturiert?, Wie Code dokumentiert und warum ist das wichtig? UML-Klassendiagramme +2. Warum Softwarearchitektur? +3. Grundfertigkeiten Softwarearchitekt:innen +4. Basisprinzipien +5. Praktische Umsetzung im Demo-Projekt --- @@ -43,6 +46,8 @@ Was ist Softwarearchitektur?, Design Pattern Überblick, Systemarchitektur, Arch * Methoden zur Anforderungsanalyse * Projektarbeit +> Blick ins [Repository](https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022projekt) + --- # Recap: SE1 & SE2 @@ -55,9 +60,18 @@ Was ist Softwarearchitektur?, Design Pattern Überblick, Systemarchitektur, Arch --- +# Beispiel: Lego Saturn V + +<img src="img/softwarearchitektur/saturn_v_collage.jpg" width="80%"/> +--- + # Warum ist Softwarearchitektur notwendig? -(Bild einfügen: "Big ball of mud") + + + + +_(nach "Software-Architektur", O. Vogel, I. Arnold et al., Springer, 2009)_ --- @@ -68,7 +82,7 @@ Was ist Softwarearchitektur?, Design Pattern Überblick, Systemarchitektur, Arch * Aggregation * Generalisierung/Spezialisierung * Realisierung - +--- # Warum ist Softwarearchitektur notwendig? **Komplexität beherrschen** @@ -87,6 +101,8 @@ Was ist Softwarearchitektur?, Design Pattern Überblick, Systemarchitektur, Arch * Beziehung zwischen den Bestandteile * Gerüst auf dem Anforderungen umgesetzt werden +> Problem: Softwarearchitektur meistens nicht von "außen" ersichtlich. + --- # Grundfertigkeiten Softwarearchitekt:innen @@ -94,16 +110,11 @@ Was ist Softwarearchitektur?, Design Pattern Überblick, Systemarchitektur, Arch * Generalisierung: Abstraktionsvermögen * Zusammenhänge erkennen * Muster kennen und erkennen +* Entwicklungserfahrung * Spezialisierung: Zerlegung in Teilprobleme -* Zuhören * Erfahrungsschatz: Aus Erfolgen und Fehlern lernen -* Kommunikationsfähigkeit - ---- - -# Beispiel: Lego Saturn V - -(Bilder einfügen) +* Kommunikationsfähigkeit und zuhören können +* Implizites explizit machen --- @@ -111,9 +122,9 @@ Was ist Softwarearchitektur?, Design Pattern Überblick, Systemarchitektur, Arch ## Software Product Quality - +<img alt="Software Product Quality" src="img/softwarearchitektur/software_product_quality.png" width="110%"/> -_nach: ISO/IEC 25010, https://iso25000.com/index.php/en/iso-25000-standards/iso-25010_ +_nach: "Software Product Quality", ISO/IEC 25010, https://iso25000.com/index.php/en/iso-25000-standards/iso-25010_ --- @@ -125,7 +136,7 @@ _nach: ISO/IEC 25010, https://iso25000.com/index.php/en/iso-25000-standards/iso- * Herangehensweisen: * Top-Down ("Teile und Herrsche") * Bottom-up - * Design to test + * Design to test (TDD) --- @@ -133,7 +144,9 @@ _nach: ISO/IEC 25010, https://iso25000.com/index.php/en/iso-25000-standards/iso- * Wer kommuniziert mit wem? * Wie ist die Kommunikationsrichtung zwischen Modulen? +* Identifikation von "stabilen" Komponenten: Zählen von eingehenden Abhängigkeiten. * Wahrung von Austauschbarkeit +* **Bitte vermeiden**: Zirkuläre Abhängigkeiten --- @@ -175,7 +188,6 @@ MyInterface a = new MyImplementation(); ``` * Welche Variante ist besser? Warum? -* Wie heißt das Prinzip? --- @@ -209,18 +221,26 @@ public Person getPerson(int personId){ --- -# Basisprinzip: Loose Coupling and Strong Cohesion - +# Projekt: Praktische Umsetzung ---- +* Klassendiagramm als Ausgangslage +* Identifikation möglicher Komponenten +* Pattern: (Abstract) Factory -# Basisprinzip: Dependency Injection - -* Objekte erzeugen ihre Abhängigkeiten nicht selbst -* Dies wird von einem sog. `Injector` übernommen -* Ziel ist die Reduktion und Zentralisierung von Abhängigkeiten +> Blick ins [Repository](https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022projekt) +--- +# Notes +* Umsetzen der Anforderungen in Code +* Einteilen in Packages +* Ggf. Java Modules +* Richtiges Maven Projekt wählen +* In einzeln deploybare Artefakten denken +* Stabile Teile im Code: Zählen von Abhängigkeiten +* Nach außen mit Interfaces kommunizieren +* Abstract Factory +* Issues mit Code verlinken </textarea> <script src="https://remarkjs.com/downloads/remark-latest.min.js">