Prog2 Theorie Flashcards
Welche Vorteile bietet ein System zur Versionverwaltung?
Versionverwaltungen sind dafür da um koordinierte Zusammenarbeit in Projekten zu vereinfachen. Sie ermöglichen es Änderungen im Code nachzuverfolgen, jederzeit auf ältere Codeversionen zurückgreifen zu können und das teilen von Dateien mit anderen Entwicklern.
Was ist ein Git Repository?
Ein Git Repo speichert alle Dateien und Verzeichnisse eines Projektess sowie deren Historie. Es gibt ein lokales und ein remote (auf dem Server z.B. GitHub, GitLab etc.)
Welche Komponenten sind an einem Git Repository beteiligt?
- Working Copy (Arbeitsverzeichnis) Ist der aktuelle Zustand des Projektes den man sieht und bearbeitet
- Staging Area zwischengehaltener Bereich wo Änderungen gesammelt werden bevor man sie comittet
- Repository entählt alle Metadaten und die gesamte Historie
- Remote Repo Eine Kopie des Projekts die auf einem Server (GitHub, GitLab etc.) gespeichert ist und auf die andere zugreifen können
Wie interagieren die Komponenten in einem Git Repository untereinander?
Über Commands in der Console oder das GUI ?
Beschreiben Sie wichtige Git Kommandos und deren Auswirkung
git add - Verschiebt Änderungen in die Staging Area
git commit - verschiebt Datei in das lokale Repo
git log - zeigt die Historie an
git clone - erstellt eine kopie des repos
git push - pusht Dateien auf das remote Repo
git pull - pullt eine Kopie des remote repos auf das lokale (merge)
Was ist der Unterschied zwischen Git und GitLab?
Git ist ein verteiltes Versionskontrollsystem das lokal auf dem Computer läuft und Änderungen an Dateien verfolgt.
GitLab ist eine webbasierte Plattform die git Repository-Hosting und viele zusätzliche Funktionen zur Teamzusammenarbeit und Automatisierung bietet.
Was versteht man unter einem Merge und wann wird eine Merge benötigt?
Bei einem Merge werden Änderungen von einem Repo in das andere Repo integriert, womit das eine repo den Stand bekommt vom anderen repo.
Es ist üblich bevor man mit seiner täglichen Arbeit anfängt, zu fetchen und einen merge vom überliegenden branch durchzuführen, damit das eigene repo auf dem aktuellsten stand ist (änderungen vom team die in der zwischenzeit gepusht worden)
Was ist eine Exception?
Eine Ausnahme (Ereignis), die während der Ausführung des Programms auftritt und den normalen Programmablauf unterbricht
Wozu verwendet man Try/Catch Blöcke?
Zum reagieren auf Ausnahmesituationen. Sollte im überwachten Code (try) ein Fehler auftreten, fängt der catch Block den Fehler ab und gibt informationen darüber
Was ist der Unterschied zwischen geprüften und ungeprüften Ausnahmen (Checked vs Unchecked Exceptions)
Checked Exceptions werden vom Compiler noch vor kompilieren des Programms gemeldet und als fehler markiet das diese behandelt werden müssen
Unchecked Exception verhindern nicht das das programm kompiliert
!!!WICHTIG!!!
In beiden Fällen stürtzt das Programm ab wenn eine Exception nicht behandelt wird! Egal ob Checked oder Unchecked!
Checked Exceptions sollten verwendet werden, wenn der Aufrufer der Methode wahrscheinlich in der Lage ist, sich von der Ausnahme zu erholen oder sie sinnvoll zu behandeln.
Unchecked Exceptions sollten verwendet werden, wenn die Ausnahme auf einen Programmierfehler hinweist oder wenn es unwahrscheinlich ist, dass der Aufrufer sie sinnvoll behandeln kann.
Was ist ein Finally Block und wozu wird er typischerweise verwendet?
Ein Finally Block kann optional hinter catch block folgen und wird nach den catch blöcken IMMER ausgeführt. Er wird typischerweise für die freigabe von Ressourcen verwendet
Was sind die Vor- und Nachteile von zentralisiertem und lokalisiertem Exception Handling?
Zentralisiert: Exception Handling weit “oben” in der Anwendungslogik mit einer Reihe von catch Blöcken die alle möglichen Fehlerzustände abfangen
Vorteil: Exception Handling übersichtlich an einer Stelle zusammengefasst
Nachteil: Recovery erschwert wenn die Exception weit vertieft in einem Unterzweig ist
Lokalisiertes Eception Handling nahe an der Stelle in der Anwendungslogik, an der der Fehelr auftritt.
Vorteil: Erleichter das Recovery direkt in der Verarbeitungslogik
Nachteil: Kann Fehlerbehandlund umständlicher machen, da Error Handling über den Code verteilt ist
Was versteht man unter defensiver Programmierung?
Defensive Progammierung ist ein Ansatz um Programme möglichst robust und zuverlässig zu machen. Dabei wird versucht auf unerwartete und unglütige Eingaben oder Zustände in vorhinein passend zu reagieren um Robusheit zu gewährleisten
Was ist ein Breakpoint?
Ein Breakpoint ist ein Punkt den man im Programm an eine gewisse Stellt setzt an der man die Ausführung des Programms anhalten möchte um es Schritt für Schritt von diesem Punkt aus weiter auszuführen (Debugging)
Erläutern Sie die Softwareteststufen “Komponententest”, “Integrationstest” und “Systemtest” und Grenzen die Begriffe gegeneinander ab.
Komponententest - Definition:
Der Komponententest, auch als Unit Test bekannt, ist die niedrigste Teststufe und konzentriert sich auf das Testen einzelner Softwarekomponenten oder Module. Eine Komponente ist die kleinste testbare Einheit in der Software, z. B. eine einzelne Funktion oder Methode.
Integrationstest - Definition:
Der Integrationstest folgt auf den Komponententest und befasst sich mit dem Zusammenspiel mehrerer Komponenten. Hierbei wird überprüft, ob die Module korrekt zusammenarbeiten, insbesondere an den Schnittstellen zwischen den Modulen.
Systemtest - Definition:
Der Systemtest ist die umfassendste Teststufe und prüft das gesamte integrierte System als Ganzes. Er wird durchgeführt, nachdem alle Module integriert und die Integrationstests abgeschlossen sind.
Abgrenzung:
Komponententest vs. Integrationstest:
Komponententest: Testet einzelne Module isoliert.
Integrationstest: Testet das Zusammenspiel mehrerer Module.
Integrationstest vs. Systemtest:
Integrationstest: Fokussiert auf die Interaktion und Schnittstellen zwischen Modulen.
Systemtest: Fokussiert auf das gesamte integrierte System und prüft die Erfüllung der gesamten Systemanforderungen.
Komponententest vs. Systemtest:
Komponententest: Kleinste Testeinheit, überprüft einzelne Module auf ihre korrekte Funktion.
Systemtest: Umfassendste Teststufe, überprüft das gesamte System auf Erfüllung aller Anforderungen.
Was versteht man unter Regressionstests?
Die Test die man durchführt, nachdem man an einer Stelle des Programms eine Änderung gemacht hat, nennt man Regressionstests. Sie dienen dazu Fehler durch die Änderung an unvorhergesehenen Stellen zu entdecken.
Erläutern Sie das Grundprinzip von Unit Testing.
Das Grundprinzip von Unit Testing (Komponententest) besteht darin, die kleinsten testbaren Einheiten einer Software, die sogenannten “Units” oder “Komponenten”, isoliert zu testen, um sicherzustellen, dass sie korrekt funktionieren. Diese Einheiten sind typischerweise einzelne Funktionen, Methoden oder Klassen.
Erläutern Sie den Unterschied und die Verwendungsweise der Annotationen @BeforeEach und @BeforeAll.
BeforeEach:
Wird vor jedem Test ausgeführt, verwendet zur Vorbereitung des Ausgangszustands (z. B. Instanzen erstellen, Felder initialisieren)
BeforeAll:
Wird einmalig vor allen Tests durchgeführt, verwendet für aufwändige Initialisierungen (z. B. Herstellen von Datenbankverbindungen)
Was versteht man unter testgetriebener Entwicklung (TDD)?
TDD ist eine Methode der agilen Softwareentwicklung. Hierbei werden Tests konsequent VOR der zu testenden Komponente geschrieben
Welches Interface beschreibt eine Collection, die keine Duplikat erlaubt?
Set
Welches Interface beschreibt eine geordnete Collection, die Duplikate enthalten kann?
List
Welches Interface beschreibt eine Zuordnung von Schlüsselwörtern (Key) zu Werten (Value)?
Map
Beschreiben Sie drei verschiedene Wege, um über die Elemente einer List zu iterieren.
for-schleife
for-each-schleife
iterator
Beschreiben Sie wichtige Methoden aus dem Interface Queue und erläutern Sie das FIFO-Prinzip.
add: fügt element am ende der schlange hinzu
offer: fügt element am ende der schlang hinzu, gib jedoch false zurück wenn es wegen Kapazitätsbeschränkung nicht hinzugefügt werden kann
remove: entfernt das element am kopf der schlange
element: ruft das element am kopf der schlange auf
FIFO-First In First Out
Das zuerst eingefügte Element ist auch das zuerst entfernte Element.
Nenne jeweils alle Collections der Interface: Set, List und Map
Set:
HashSet
LinkedHashSet
TreeSet
List:
ArrayList
LinkedList
Map:
HashMap
LinkedHashMap
TreeMap
Erläutern Sie Vorteile durch die Verwendung von Generics.
Typensicherheit: Verhindert ClassCastException zur Laufzeit durch Typüberprüfung zur Kompilierzeit.
Erhöhung der Code-Wiederverwendbarkeit: Ermöglicht die Erstellung allgemeiner Klassen und Methoden für verschiedene Datentypen.
Konsistenz und Lesbarkeit: Klare Typangaben erleichtern das Verständnis und die Wartung des Codes.
Vermeidung von Duplikation: Reduziert Code-Duplikation durch generische Implementierungen.
Kompilierzeitüberprüfungen: Fehler werden frühzeitig beim Kompilieren erkannt, nicht erst zur Laufzeit.
Kompatibilität mit älterem Code: Abwärtskompatibilität mit nicht-generischen APIs durch Type-Erasure.
Was versteht man unter “Bounded Type Parameters”?
“Bounded Type Parameters” sind eine Erweiterung des Generics-Konzepts in Java, die es ermöglichen, die Typen, die als Parameter verwendet werden können, einzuschränken.
Warum existieren “Raw Types” und warum sollte man sie in neuem Code nicht verwenden?
Um sicherzustellen, dass älterer Code, der vor Generics geschrieben wurde, weiterhin funktioniert, wurden “Raw Types” beibehalten.
Typunsicherheit: “Raw Types” umgehen die Typüberprüfung zur Kompilierzeit, was das Risiko von ClassCastException zur Laufzeit erhöht.
Fehlende Dokumentation und Klarheit: Wenn der Typ nicht angegeben ist, ist es für andere Entwickler (oder für zukünftiges Selbst) schwerer zu verstehen, welche Art von Objekten in einer Collection gespeichert werden sollen oder welche Typen von Methoden akzeptiert werden.
Verlust der Vorteile von Generics: Generics bieten zahlreiche Vorteile wie Typensicherheit, Wiederverwendbarkeit und Flexibilität. Die Verwendung von “Raw Types” bedeutet, dass diese Vorteile nicht genutzt werden.
Was versteht man unter “Type Erasure”?
Der Vorgang bei dem der Compiler sämtliche Typparameter durch die konkreten Datentypen oder Typschranken ersetzt (Type Erasure)
Erläutern Sie das Grundprinzip der Ein- und Ausgabe von Daten in Java.
Öffnen und Schließen von Streams: Streams sollten ordnungsgemäß geöffnet (open) und nach Gebrauch geschlossen (close) werden, vorzugsweise mit der try-with-resources-Anweisung, um sicherzustellen, dass Ressourcen ordnungsgemäß freigegeben werden.
Lesen und Schreiben von Daten: Daten werden entweder als Bytes oder Zeichen gelesen und geschrieben, abhängig von der Art des Streams und der Art der zu verarbeitenden Daten.
Behandlung von Ausnahmen: Das Java-Standardmuster zur Behandlung von E/A besteht darin, IOExceptions zu behandeln, die auftreten können, wenn Probleme beim Lesen oder Schreiben von Daten auftreten.
Was versteht man unter Character Encoding?
Über Character Encoding wird jedem Zeichen ein Zahlenwert zugeordnet und dieser gespeichert. Da Computer nur mit binären Daten (0s und 1s) arbeiten können, müssen Zeichen durch Zahlenwerte repräsentiert werden, die dann in Binärform gespeichert werden können.
Wofür steht U+1F602? Was hat es damit auf sich?
U+1F602 repräsentiert ein Emoji, das durch den Unicode-Standard standardisiert wurde und in vielen digitalen Umgebungen verwendet wird. Es ist das “Lachende Gesicht mit Tränen der Freude”
Was ist der wesentliche Unterschied zwischen den Klassen FileInputStream und FileReader? In welchem Fall verwenden Sie welche Klasse?
FileInputStream:
FileInputStream ist eine Klasse in Java, die dazu dient, binäre Daten (Bytes) aus einer Datei zu lesen.
Verwendung:
Verwendet, wenn man binäre Daten wie Bilder, Audiodateien, Videodateien oder andere Dateien liest, die nicht reinen Text darstellen.
FileReader:
FileReader ist eine Klasse in Java, die dazu dient, Zeichendaten (Characters) aus einer Datei zu lesen.
Verwendung:
Verwendet, wenn man Textdaten aus einer Datei lesen möchte, z.B. für Textdateien oder Dateien, die Zeichen-basierte Informationen enthalten.
Was ist der Vorteil von Buffered Streams?
“Ungepuffert”
Jede Lese- und Schreiboperation führt zu einem (teuren) Zugriff (bspw. auf den Datenträger, das Netzwerk, etc.) Dadurch wird der Zugriff auf Streams ineffizient
Mit Buffered Streams:
Daten werden in einem (schnellen) Pufferspeicher innerhalb der JVM zwischengespeichert
(Teure) Lese- und Schreiboperationen durch das Betriebssystem erfolgen nur dann, wenn der Puffer gefüllt oder geleert (Flush) werden muss
Was versteht man unter einem try-with-resources Statement und welche Vorteile bietet es?
Ein try-with-resources Statement ist eine Java-Sprachkonstruktion, die eingeführt wurde, um sicherzustellen, dass Ressourcen wie Dateien, Datenbankverbindungen oder Netzwerkverbindungen ordnungsgemäß geschlossen werden, nachdem sie nicht mehr benötigt werden.
Vorteile:
Automatisches Schließen von Ressourcen
Vermeidung von Ressourcenlecks
Verbesserte Lesbarkeit und Klarheit des Codes
Was versteht man unter einer MVC-Architektur?
Die MVC-Architektur (Model-View-Controller) ist ein Designmuster, das zur Strukturierung von Softwareanwendungen verwendet wird, insbesondere in der Entwicklung von webbasierten Anwendungen, Desktopanwendungen und anderen Softwaresystemen.
Wofür ist die Klasse JFrame verantwortlich?
JFrame dient dazu, ein Fenster auf dem Bildschirm zu erstellen und zu verwalten, das als Container für andere GUI-Komponenten wie Buttons, Labels, Textfelder usw. dienen kann.
Es stellt das Hauptfenster einer Anwendung dar, in dem die Benutzeroberfläche angezeigt wird.
Was ist der Unterschied zwischen einem JFrame und einem JPanel?
JFrame repräsentiert das Hauptfenster einer Swing-Anwendung.
JPanel ist eine leichtgewichtige Containerkomponente, die dazu dient, andere Swing-Komponenten zu gruppieren und anzuordnen.
Es kann als Container für andere Komponenten wie Buttons, Textfelder, Labels usw. dienen.