eXtreme Programming: Eigenschaften
• Keine explizite Dokumentation und Reviews
• Paar-Programmierung zur Qualitätssicherung
• Code wird permanent lauffähig gehalten
• „Test-First“-Ansatz
--> nur für kleinere Projekte geeignet
Verhaltensmsuter Observer
Entwurfsmuster Command
Enumeration im Klassendiagramm
Vorteile einer Software-Produktlinie
Sequenzdiagramm Darstellung Return und Delete
Definieren Sie die Design-Prinzipien „hohe Kohäsion“ und „lose Kopplung“ in eigenen Worten.
a. Hohe Kohäsion: Eine Einheit sollte möglichst einen in sich geschlossenen Aufgabenkomplex abdecken. Siehe Kapselung: Attribute und Methoden, die eng zusammengehören, sollten eine gemeinsame Klasse bilden.
b. Lose Kopplung: Gegenseitige Abhängigkeiten zwischen verschiedenen Einheiten sollten möglichst gering sein.
Muster: Koordinator
Muster: Adapter
Architekturmuster: Blackboard
Klasse: Aufbau im Klassendiagramm
Nennen Sie mindestens 3 Eigenschaften, mit denen Software Komponenten in der Vorlesung charakterisiert wurden.
Eine Komponente ist eine Einheit, die unabhängig auslieferbar und versioniert ist, explizite Schnittstellen hat, weitgehend von ihrer Umgebung unabhängig und mit anderen Komponenten kombinierbar ist. Sie ist mehrfach verwendbar und hat keinen nach Außen beobachtbaren Zustand.
Architektur- (und Entwurfs-)muster Proxy
Statechart: Aktion
Interface im Klassendiagramm (Erweiterung und Implementierung)
Kopplung
DEx Modellierungssprache
Beispiel Statechart (Anfangs und Endpunkt und hierachische Gliederung)
Komposition
Welche Aspekte/Eigenschaften eines Systems lassen sich durch UML Zustandsdia-gramme (Statecharts) und UML Sequenzdiagramme modellieren? Wo liegt der we-sentliche semantische Unterschied zwischen den beiden Diagrammtypen?
• UML Zustandsdiagramme
o Zustände, in denen sich das System befinden kann
o Zustandsübergange, deren Auslösebedingungen und durchzuführende Aktionen
• UML Sequenzdiagramme
o Nachrichten- und Ereignisfluss
o Darstellung eines möglichen Use Cases
• Semantischer Unterschied: Statechart: "vollständige" Verhaltensbeschreibung vs.
Sequenzdiagramm: beispielhafter, konkreter Ablauf
Muster: Wechselnde Rolle
Aktivitätsdiagramme
Architekturmuster "Schichten"
Muster: Abstrakte Oberklasse
Kohäsion
Trennung in Domänen und Applikation Engineering
Überdeckungsarten:
Entwurfsmuster: Factory Method
Sichtbarkeit in Klasen und Paketen (UML/Java/C++)
Klassifikation von Testverfahren
SCRUM: Eigenschaften
• Inkrementell und iterativ
• 3 Rollen: Product Owner, Entwicklungsteam, Scrum Master
Feature Diagramme
Steuerungsmuster
Testing: Äquivalenzklassen
Entwurfsmuster: Decorator
Charakterisieren sie guten Programmierstil durch zwei Beispielaspekte. Erläutern Sie außerdem, warum Coding-Guidelines/-Styles generell sinnvoll sind.
a. Guter Programmierstil:
i. Variablen klein und Klassennamen großschreiben
ii. Einheitliche Formatierung, z. B. einheitliche Einrückung von Codeblöcken (bspw. Schleifen) mit 2 Leerzeichen (keine Tabulatoren!)
iii. Kommentare verwenden
b. Coding-Guidlines sind generell sinnvoll, weil sie die Lesbarkeit des Codes erhöhen. Insbesondere wenn mehrere Personen an einem Projekt arbeiten, erleichter dies das Verständnis und die Wartung des Codes
Wann werden im Wasserfallmodell die Test-Eingabedaten ermittelt?
Test/Integration: Im Gegensatz zu agilen Methoden erfolgt die Ermittlung der Testdaten im Wasserfallmodell erst in der Testphase.
Zeichnen Sie das Wasserfallmodell.
Beipiel Objekinstanzierung im Objektdiagramm
Entwurfsmuster: Singleton
Was ist Prototyping in der Software-Entwicklung und welchen Zweck erfüllt es?
Prototyping ist die Erstellung eines ersten Exemplars eines Produkts, das noch nicht voll funktionsfähig ist, aber preisgünstig und mit kurzer Entwicklungszeit erstellt werden kann. Es dient der frühen Einbindung von Anwendern in die Entwicklung, um frühzeitig mögliche Risiken erkennen und die Realisierbarkeit abschätzen zu können
Use Case: Erweiterung
Entwurfsmusser Composite
Was ist eine Komponente in Software Engineering? Welchen Zweck erfüllen Komponen-ten?
Eine Komponente ist ein modularer Systembestandteil, der nach Außen nur durch seine Schnittstellen bekannt ist und die eigentliche Funktionsweise kapselt. Durch die definierte Schnittstelle ist die Komponente in ihrer Umgebung austauschbar und wiederverwendbar. Dies steigert die Produktivität, senkt die Kosten und vereinfacht die Wartung.
Parameter und Datentypen für Operationen (Standard und Java Style)
Entwurfsmuster: CommandProcessor
Warum ist eine starre Zuordnung im Wasserfallmodell problematisch?
Es lassen sich im Wasserfallmodell nicht alle Tätigkeiten eindeutig einer Phase zuordnen, da sich die Phasen überschneiden und Tätigkeiten sich wiederholen können.
Verteilungsmuster
Entwurfsmuster: Client-Dispatcher-Server
Was versteht man unter Glue Code?
Um die Komponenten miteinander zu verbinden und zu einem Gesamtsystem zu verknüpfen ist zusätzlich sogenannter „Glue Code“ erforderlich.
Architekturmuster: Model-View-Controller
Funktionale/nicht-funktionale Anforderungen
Funktionale Anforderung:
•Beschreibung dessen, was das System tun soll
•Bsp.: "Das System soll einen Mechanismus zur Identifizierung von Benutzern vorsehen."
Nicht-funktionale Anforderung:
•Einschränkende Bedingung, wie die funktionalen Anforderungen zu realisieren sind
•Bsp.: "Der Identifizierungsvorgang muss in höchstens 5 Sekunden abgeschlossen sein."
In welche beiden Arbeitsbereiche unterteilt sich die Entwicklung einer Software-Produktlinie und was wird in diesen beiden Arbeitsbereichen getan?
• Domänen Engineering: Das Domänen Engineering umfasst die Erfassung aller relevanter Konzepte in der entsprechenden Domäne unabhängig von einem konkreten Anwendungsfall. Ziel ist die Realisierung einer wiederverwendbaren Plattform, die dann für die konkrete Anwendungsentwicklung genutzt werden kann.
• Applikation Engineering: Das Applikation Engineering befasst sich mit der Ableitung konkreter Produkte aus der durch das Domänen Engineering erarbeiteten Plattform.
Beschreiben Sie textuell die Sichten, ihre Bestandteile und die Zielgruppen/Aufgaben des „4+1 Sichten“ - Modells von Philippe Kruchten.
a. Logische Sicht: Die logische Sicht beinhaltet das Klassenmodell und eine Verfeinerung des Analysemodells. Sie dient der vereinfachten Darstellung zur Kommunikation mit dem Endanwender.
b. Struktursicht: In der Struktursicht werden Subsysteme und deren Schnittstellen dargestellt. Sie kann dazu dienen, den Programmieraufwand aufzuteilen und die Wartung zu planen.
c. Ablaufsicht: Die Ablaufsicht beschreibt Prozesse und deren Koordination. Sie hilft Systemintegratoren.
d. Physikalische Sicht: Zur physikalischen Sicht gehören Komponenten, Hardware und Netze. Sie erklärt dem Nutzer den physikalischen Aufbau des Systems und hilft bei der Installation.
Use Case: Spezialisierung
Zeichnen Sie das V-Modell
Use Case: Einbindung
Muster: Rollen
Was ist der Zweck von Code-Generierung?
Der Zweck von Code-Generierung ist Qualität zu erhöhen und die Entwicklungszeit zu senken.
Statechart: Bedingung
Architekturmuster: Broker
Sinn von Paketen in Klassendiagrammen
Architekturmuster: Pipes and Filters
Use Case: Abstraktion
Muster: Komposition
Einfaches Sequenzdiagramm
Ordnen Sie die Tätigkeiten den fünf Grundaktivitäten des Wasserfallmodells zu.
Ordnen Sie die Tätigkeiten den fünf Grundaktivitäten des V-Modells zu.
Welche Aspekte/Eigenschaften eines Systems lassen sich durch UML Zustandsdiagramme (Statecharts) und UML Sequenzdiagramme modellieren? Wo liegt der wesentliche semantische Unterschied zwischen den beiden Diagrammtypen?
Zustandsdiagramme beschreiben das Verhalten von einzelnen Objekten durch endliche Zustandsübergangsdiagramme, die ähnlich wie endliche Automaten funktionieren. Der Fokus liegt hier auf möglichen Abläufen und der Verbindung dieser Abläufe zum aktuellen Zustand des Objekts (man kann bspw. Keine Tür schließen, die bereits geschlossen ist).
UML Sequenzdiagramme können die Interaktion zwischen Objekten sehr gut modellieren. Hierbei werden jedem Akteur verschiedene Aktivitäten zugeordnet, die eventuell voneinander abhängig sein können (zB Postbote kann Brief erst an Haushalt A verteilen, sobald er den Brief aus dem Verteilerzentrum erhalten hat), was durch diverse Pfeile gekennzeichnet wird. Der Fokus liegt auf dem Informationsfluss zwischen Objekten, die Zeit fließt nach unten.
Der wesentliche semantische Unterschied liegt in der Lese- und Schreibrichtung: UML Sequenzdiagramme werden von oben nach unten und von links nach rechts gelesen, UML Aktivitätsdiagramme und Aktivitätsdiagramme von links nach rechts. Jedes Diagramm hat leicht andere Symbole und beschreibt andere Teilaspekte eines Programms, der Fokus liegt auf anderen Aspekten
Lassen sich UML Aktivitätsdiagramme und Zustandsdiagramme zur Modellierung eines Softwaresystems kombinieren? Wenn ja, welche Modellierungselemente eines Zustandsdiagramms könnten durch Aktivitätsdiagramme detailliert werden
Gibt es eine Methode, deren Kontrollflussgraph nur Knoten enthält, die vom Startknoten aus erreichbar sind, obwohl es keine Menge von Eingaben gibt, sodass jede Anweisung der Methode mindestens bei einer Eingabe ausgeführt wird? Falls Sie diese Frage negativ beantworten, dann begründen Sie die Antwort. Falls Sie die Frage positiv beantworten, dann geben Sie eine Methode an (z.B. in Java), die obiges erfüllt.
Seien u und v zwei Knoten eines Kontrollflussgraphen G. Der Knoten u dominiert den Knoten v in G genau dann, wenn jeder Pfad in G, der im Startknoten von G beginnt und den Knoten v besucht auch den Knoten u besucht.
Beurteilen Sie für jede der folgenden Aussagen, ob sie wahr ist und begründen Sie die jeweiligen Antworten mit maximal drei Sätzen oder durch ein Gegenbeispiel.
1) Jeder Knoten eines Kontrollflussgraphen G dominiert sich selbst in G.
2) Wenn u und v zwei Knoten eines Kontrollflussgraphen G sind und der Knoten u den Knoten v in G dominiert, dann dominiert der Knoten v den Knoten u in G.
3) Wenn u, v und w drei Knoten eines Kontrollflussgraphen G sind, der Knoten u den Knoten v in G dominiert und der Knoten v den Knoten w in G dominiert, dann dominiert der Knoten u den Knoten w in G. Wozu und wie kann eine vollständig bekannte Dominanzrelation für einen Kontrollflussgraphen bei einer Anweisungsüberdeckungstesterstellung ausgenutzt werden?
Jedes Feature Diagramm ist eine Verfeinerung von sich selbst?
Capability Maturity Model
Software Process Improvement and Capability Determination
Vor- und Nachteile von Git und SVN
SVN-Befehle
Git-Sequenzdiagramm
Scrum
Git-Befehle
git --version: Zum Überprüfen, ob git installiert ist, kann man eine Konsole öffnen und folgenden Befehl eingeben
git clone # Hier der Link: Nun wollen wir das Projekt bei uns lokal auf dem Rechner haben. Hierfür müssen wir das Projekt klonen. Dafür auf den "Clone"-Button clickenHier kopieren wir uns den HTTPS-Link und geben in der Console den folgenden Befehl ein
git config --global user.email # Meine Email-Adresse: Weiter sollte man, wenn man Git zum ersten Mal installiert hat, in der Git Config zumindest seine Email-Adresse hinterlassen, damit der Commit jemandem zugeordnet werden kann. Hierfür reicht der folgende Befehl.
git add README.md: Dafür ist es zuerst wichtig, Git nur die Dateien hochladen zu lassen, welche wir auch hochladen wollen. Hier nutzen wir den git add Befehl, welcher in unserem Fall nur die Readme versionieren soll.
git commit -m # Unsere Nachricht: Dies bedeutet, dass wir sowohl den Änderungen eine Nachricht zuordnen, um im besten Fall präzise zu beschreiben, was wir da eigentlich gemacht haben, als auch die Dateien zu bestätigen (Näheres dazu in Remote). Dieses tun wir mit.
git fetch # Holt nur die neuen Änderungen
git pull # Versucht die neuen Änderungen bereits zu integrieren: Zu aller erst wollen wir sicher gehen, dass wir mit dem aktuellsten Stand des Repositories arbeiten. Neue Änderungen in dem Projekt in GitLab, welche sich noch nicht in unserem lokalen Repository befinden, können wir auf zwei Arten übertragen.
git checkout -b # Branchname: Um nun allerdings selbst mal mit Branches zu arbeiten, können wir uns erstmal einen neuen Branch erstellen. Wenn wir uns also in unserer CLI befinden, können wir einen neuen Branch mit dem folgenden Befehl erzeugen.
git push --set-upstream origin # Branchname: Weiter sehen wir auch den Zustand der Dateien. Sollten wir also beispielsweise auf dem zweiten Branch eine Änderung in der Readme vorgenommen haben, kann man folgendes sehen.
git rebase # Branchname: Nun wollen wir dafür sorgen, dass beide Branches in einen zusammengeführt werden und auf der anderen Seite auch erreichen, dass dabei die Änderungen aus den einzelnen Branches erhalten bleiben. Wir nutzen dafür den Rebase-Command.
mkdir # Ordnername
cd # Ordnername
git init --bare:Um nun zu verstehen, wie Git genau funktioniert, können wir uns einen eigenes Remote-Repository erstellen. Hierfür erstellen wir uns einen Ordner und initialisieren das Repository.
Zuletzt geändertvor 2 Jahren