summaryrefslogtreecommitdiffhomepage
path: root/colloq
diff options
context:
space:
mode:
Diffstat (limited to 'colloq')
-rw-r--r--colloq/.gitignore6
-rw-r--r--colloq/Makefile19
-rw-r--r--colloq/figures/mvc.svg174
-rw-r--r--colloq/figures/mvvm.pngbin0 -> 18486 bytes
-rw-r--r--colloq/figures/scrum.pngbin0 -> 175120 bytes
-rw-r--r--colloq/figures/threetier.pngbin0 -> 68286 bytes
-rw-r--r--colloq/main.pdfbin0 -> 307441 bytes
-rw-r--r--colloq/main.tex269
8 files changed, 468 insertions, 0 deletions
diff --git a/colloq/.gitignore b/colloq/.gitignore
new file mode 100644
index 0000000..298a7c9
--- /dev/null
+++ b/colloq/.gitignore
@@ -0,0 +1,6 @@
+build/
+svg-inkscape/
+
+*.bbl
+*.blg
+*.log
diff --git a/colloq/Makefile b/colloq/Makefile
new file mode 100644
index 0000000..ee5b649
--- /dev/null
+++ b/colloq/Makefile
@@ -0,0 +1,19 @@
+CC = xelatex
+BIB = biber
+VIEW = zathura
+
+all:
+ @mkdir -p build/
+ @$(CC) --output-directory=build/ --shell-escape main
+
+full: clean
+ @mkdir -p build/
+ @$(CC) --output-directory=build/ --shell-escape main
+ @$(BIB) --input-directory=build/ main
+ @$(CC) --output-directory=build/ --shell-escape main
+
+clean:
+ @$(RM) -rf build
+
+run: clean all
+ @$(VIEW) build/main.pdf
diff --git a/colloq/figures/mvc.svg b/colloq/figures/mvc.svg
new file mode 100644
index 0000000..11227dc
--- /dev/null
+++ b/colloq/figures/mvc.svg
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="312.95001"
+ height="142.96001"
+ id="svg7278"
+ inkscape:version="0.47pre4 r22446"
+ sodipodi:docname="mvc-diagram.pdf">
+ <metadata
+ id="metadata4929">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="946"
+ id="namedview4927"
+ showgrid="false"
+ inkscape:zoom="1.5629139"
+ inkscape:cx="77.599491"
+ inkscape:cy="67.03149"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg7278"
+ units="px" />
+ <defs
+ id="defs7280">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 75.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="321 : 75.5 : 1"
+ inkscape:persp3d-origin="160.5 : 50.333333 : 1"
+ id="perspective4931" />
+ <marker
+ refX="0"
+ refY="0"
+ orient="auto"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ id="path3744"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" />
+ </marker>
+ <marker
+ refX="0"
+ refY="0"
+ orient="auto"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ id="path3741"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" />
+ </marker>
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter6394">
+ <feGaussianBlur
+ id="feGaussianBlur6396"
+ stdDeviation="0.3875" />
+ </filter>
+ </defs>
+ <g
+ id="g4989"
+ transform="translate(2,-1.9999886)">
+ <path
+ d="m 70.801879,109.90091 171.244071,0"
+ id="path6681"
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6.00000001, 6.00000001;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart)" />
+ <path
+ d="m 238.33182,132.16175 -173.202371,0"
+ id="path7890"
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart)" />
+ <path
+ d="M 242.66344,102.02988 181.15937,41.669791"
+ id="path7898"
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart)" />
+ <path
+ d="M 66.376129,100.79393 125.17089,41.90232"
+ id="path7902"
+ style="fill:none;stroke:#000000;stroke-width:0.97686255;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart)" />
+ <rect
+ rx="10"
+ width="67.016769"
+ height="41.207058"
+ ry="10"
+ x="119.97427"
+ y="5.0007143"
+ id="rect7882"
+ style="opacity:0.98999999;fill:#ffd5f6;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <text
+ x="153.10767"
+ y="29.899166"
+ id="text7884"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ sodipodi:linespacing="125%"><tspan
+ x="153.10767"
+ y="29.899166"
+ id="tspan7886"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Arial;-inkscape-font-specification:Arial">Controller</tspan></text>
+ <rect
+ rx="10"
+ width="67.016769"
+ height="41.207058"
+ ry="10"
+ x="240.93643"
+ y="100.75294"
+ id="rect7882-9"
+ style="opacity:0.98999999;fill:#ffd5f6;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <text
+ x="274.42432"
+ y="125.58109"
+ id="text7884-5"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ sodipodi:linespacing="125%"><tspan
+ x="274.42432"
+ y="125.58109"
+ id="tspan5167">Model</tspan></text>
+ <rect
+ rx="10"
+ width="67.016769"
+ height="41.207058"
+ ry="10"
+ x="1"
+ y="100.75294"
+ id="rect7882-2"
+ style="opacity:0.98999999;fill:#ffd5f6;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <text
+ x="34.531822"
+ y="125.58109"
+ id="text7884-55"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ sodipodi:linespacing="125%"><tspan
+ x="34.531822"
+ y="125.58109"
+ id="tspan5165">View</tspan></text>
+ <path
+ d="M 26.830429,100.24208 C 26.235629,8.8294009 19.718209,25.048961 119.60586,23.552621"
+ id="path5255"
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 6;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow1Lend)" />
+ </g>
+</svg>
diff --git a/colloq/figures/mvvm.png b/colloq/figures/mvvm.png
new file mode 100644
index 0000000..87e4ab8
--- /dev/null
+++ b/colloq/figures/mvvm.png
Binary files differ
diff --git a/colloq/figures/scrum.png b/colloq/figures/scrum.png
new file mode 100644
index 0000000..fc7b517
--- /dev/null
+++ b/colloq/figures/scrum.png
Binary files differ
diff --git a/colloq/figures/threetier.png b/colloq/figures/threetier.png
new file mode 100644
index 0000000..749db4c
--- /dev/null
+++ b/colloq/figures/threetier.png
Binary files differ
diff --git a/colloq/main.pdf b/colloq/main.pdf
new file mode 100644
index 0000000..1603642
--- /dev/null
+++ b/colloq/main.pdf
Binary files differ
diff --git a/colloq/main.tex b/colloq/main.tex
new file mode 100644
index 0000000..212973a
--- /dev/null
+++ b/colloq/main.tex
@@ -0,0 +1,269 @@
+\documentclass[a4paper, 11pt]{article}
+
+% Packages
+\usepackage[a4paper, inner=2.5cm, outer=2.5cm, top=2.5cm, bottom=2.5cm, bindingoffset=0cm]{geometry}
+\usepackage{amsmath,amsthm,amssymb,amsfonts}
+\usepackage{graphicx}
+\usepackage[colorlinks=true, allcolors=blue]{hyperref}
+\usepackage{fontspec,xunicode,xltxtra}
+\usepackage{biblatex}
+\usepackage{csquotes}
+\usepackage{svg}
+
+% GERMAN
+\usepackage[ngerman=ngerman-x-latest]{hyphsubst}
+\usepackage[ngerman]{babel}
+
+% ENGLISH
+%\usepackage[USenglish]{babel}
+%\usepackage{hyphsubst}
+
+% Figures
+\graphicspath{{figures/}}
+
+% Citations
+\addbibresource{bib/main.bib}
+
+\begin{document}
+
+\title{\vspace{-2.0cm}CT Präsentationsprüfung\\Zusammenfassung}
+\author{Marvin Borner}
+\date{\today}
+
+\maketitle
+
+%\tableofcontents
+
+\section{Präsentation}
+\subsection{Grober Aufbau}
+
+\begin{enumerate}
+ \item Deckblatt
+ \item Inhalt (Gliederung - Beschreiben)
+ \item Problemstellung
+ \item Grundlagen
+ \item Hauptteil
+ \item Schluss/Fazit
+ \item IDE/Demonstration
+\end{enumerate}
+
+\subsection{Hinweise}
+\begin{itemize}
+ \item Keine dunkle IDE nutzen (sieht man nicht gut auf dem Beamer - 2NP Abzug!)
+ \item Nicht monoton reden (=> Motiviert sein!)
+ \item max. 12min Vortrag; 8min Kolloquium/Fragen
+\end{itemize}
+
+\section{Kolloquium Themen}
+
+\subsection{Patterns (Entwurfsmuster)}
+Muster für wiederkehrende Entwurfsprobleme in der Softwarearchitektur und -entwicklung => Vorlagen zur Problemlösung.
+
+Relevante Muster:
+\begin{itemize}
+ \item \textbf{Drei-Schichten-Architektur}
+ \begin{itemize}
+ \item Überbegriff für viele verschiedene Architekturen
+ \item Reduktion von Komplexität (=> bessere Wartung)
+ \item Teilweise langsamer, da Daten häufig zwischen Schichten transportiert werden müssen
+ \item Typischerweise Präsentationsschicht (GUI; Presentation), Logikschicht (Steuerung; Logic) und Datenhaltungsschicht (Daten; Data)
+ \end{itemize}
+ \includegraphics[width=10cm]{threetier}
+ \item \textbf{MVC}
+ \begin{itemize}
+ \item Steht für \textit{Model-View-Controller}
+ \item Ziel: Flexibler Programmentwurf; offen für spätere Erweiterungen und Änderungen; Wiederverwendbarkeit einzelner Komponenten
+ \item Besitzt viele Abwandlungen
+ \item Aufbau
+ \begin{itemize}
+ \item Model: enthält Daten, die von der View dargestellt werden; benachrichtigt die View über Änderungen; unabhängig von View und Controller
+ \item View: Darstellung aller GUI-Elemente; unabhängig von Controller; Bekanntgabe an Controller mittels Listener; aktualisiert UI mittels Listener zu Controller
+ \item Controller: Verwaltet View und Model; bekommt UI-Interaktionen von View über Listener; \enquote{schickt} UI-Änderungen an Listener der View; \enquote{schickt} Änderungen von Daten an Listener des Models
+ \end{itemize}
+ \includesvg{mvc}
+ \end{itemize}
+ \item \textbf{MVVM}
+ \begin{itemize}
+ \item Steht für \textit{Model-View-ViewModel}
+ \item Variante des MVC; nutzt Datenbindungsmechanismen
+ \item Beispiel: C\# mit WPF (Window Presentation Framework) - \textit{Databindings und Interfaces S.83}
+ \item Trennt Darstellung und Logik
+ \item Im Gegensatz zu MVC muss man nicht für alles Controller implementieren => geringerer Implementierungsaufwand => bessere Testbarkeit
+ \item Durch drei einzelne Instanzen besser testbar (keine extra UI-Tests nötig)
+ \item Rollentrennung von UI-Designern und Entwicklern möglich (z.B. in Firmen)
+ \item Aufbau
+ \begin{itemize}
+ \item Model: \textit{Datenzugriffsschicht}; benachricht über Datenänderungen; führt Validierungen von Benutzereingaben durch; enthält gesamte \enquote{Geschäftslogik}; ist als einzelnes Element mit Unit-Tests testbar
+ \item View: Darstellung aller GUI-Elemente; Bindung zu Viewmodel; einfach austauschbar/modifizierbar/erweiterbar ohne alles andere zu zerstören
+ \item ViewModel: UI-Logik (Model der View); verbindet View und Model; tauscht Informationen mit Model aus; stellt der View Eigenschaften und Befehle zur Verfügung welche von der View and Elemente gebunden werden; hat keine Ahnung von Elementen der View
+ \end{itemize}
+ \includegraphics[width=15cm]{mvvm}
+ \end{itemize}
+\end{itemize}
+
+\subsection{Projektmanagement}
+\begin{itemize}
+ \item \textbf{Scrum}
+ \begin{itemize}
+ \item Strikte Rollen: Product Owner (priorisiert Anforderungen), Entwicklungsteam (verantwortlich für die Erreichung der Ziele), Scrum Master (kontrolliert Scrum-Ablauf und Kooperation)
+ \item User Stories: Anforderungen an das Produkt
+ \item Entwicklungsprozess ist in Iterationen (=> \textit{Sprints}) organisiert (brauchen max. 4 Wochen)
+ \begin{enumerate}
+ \item \textbf{Product Backlog}: Team bekommt priorisierte Liste von Anforderungen
+ \item \textbf{Sprint Planning}: Team wählt Teil der Anforderungen als Ziel für diesen Sprint aus (=> nutzbare Zwischen-Version nach Sprint: \textit{Inkrement}); Planung der Zeit, die der Sprint benötigen soll; Organisation: Wer macht was?
+ \item \textbf{Sprint Backlog}: Erstellung des für alle sichtbaren Scrum-Boards (To-Do, In-Progress, Done); Aufteilung der Anforderungen in kleinere Aufgaben (inklusive Tests, Dokumentationen, etc)
+ \item \textbf{Sprint}: Entwickler des Teams arbeiten an ihren jeweiligen Aufgaben
+ \item \textbf{Daily Scrum Meeting}: Max. 15min; täglicher Abgleich des Fortschrittes; Kontrolle und Hilfestellungen einzelner Entwickler; wird wiederholt, bis Sprint zuende ist
+ \item \textbf{Sprint Review}: Am Ende des Sprints; Überprüfung des Inkrements; ggf. Anpassung des Product Backlogs; zurück zum Produkt Backlog wenn alle Anforderungen erfüllt sind
+ \item \textbf{Sprint Retrospektive}: Am Ende des Sprints; Evaluation von Kritik/Verbesserungsvorschlägen am Ablauf
+ \item Zurück zum Sprint Planning für den nächsten Sprint - Sprints werden so lange wiederholt, bis alle Anforderungen erfüllt sind
+ \end{enumerate}
+ \includegraphics[width=15cm]{scrum}
+ \end{itemize}
+ \item \textbf{Wasserfall}
+ \begin{itemize}
+ \item Lineares Modell (im Gegensatz zum iterativen Scrum)
+ \item Sequenziell: Jede Phase muss beendet sein, bevor die nächste anfängt
+ \item Vorteile
+ \begin{itemize}
+ \item Einfach und verständlich
+ \item Klare Abgrenzung der Phasen
+ \item Einfache Möglichkeiten der Planung und Kontrolle
+ \item Bei stabilen Anforderungen: Klare Abschätzung von Kosten und Aufwand
+ \end{itemize}
+ \item Nachteile
+ \begin{itemize}
+ \item Klar abgegrenzte Phasen in der Praxis unrealistisch - häufig fließender Übergang
+ \item In der Praxis sind Rückschritte oft unvermeidlich - in Wasserfall nicht erlaubt
+ \item Unflexibel gegenüber Änderungen
+ \item Frühes Festschreiben der Anforderungen kann problematisch sein, wenn es Änderungen gibt (alles muss erneut durchgeführt werden)
+ \item Kein durchgehendes Testen (wie bei Scrum nach jedem Sprint), sondern erst wenn alles fertig ist (=> potentielle Katastrophe bei finaler Implementation)
+ \end{itemize}
+ \item Typische Phasen
+ \begin{enumerate}
+ \item Anforderungsanalyse (=> Lastenheft)
+ \item Systemdesign (=> Softwarearchitektur)
+ \item Programmierung/Unit-Tests (=> Software)
+ \item Integrations-/Systemtests
+ \item Auslieferung, Einsatz und Wartung
+ \end{enumerate}
+ \end{itemize}
+ \item \textbf{Test-Driven-Development} (TDD)
+ \begin{itemize}
+ \item Phasen bei Implementation neuer Features
+ \begin{enumerate}
+ \item Test schreiben, welcher die Spezifikation des Features voll erfüllt
+ \item Alle Tests durchlaufen lassen: Neuer Test muss fehlschlagen (Prävention eines fehlerhaften Tests, welcher immer besteht)
+ \item Einfachste Implementation, die den Test bestehen lässt (muss nicht schön sein, soll einzig und allein den Test bestehen lassen)
+ \item Alle Tests durchlaufen lassen: Alle Tests müssen jetzt bestanden sein
+ \item Refactor: Die neue Implementation lesbarer und wartbarer überarbeiten mit durchgehender Test-Kontrolle
+ \item Für jedes neue Feature wiederholen
+ \end{enumerate}
+ \item Vorteile
+ \begin{itemize}
+ \item Spezifikationen werden schon im Vorraus beachtet (=> weniger Fehleranfällig)
+ \item Implementations-Code wird automatisch möglichst klein, da dieser nur geschrieben wird, um die Tests zu bestehen
+ \item Weniger debugging, da mithilfe der Tests und guten VCS genau verfolgt werden kann, was schiefläuft
+ \item Besser wartbar, weil modularisiert und flexibel
+ \end{itemize}
+ \item Nachteile
+ \begin{itemize}
+ \item Vollständige Tests können vernachlässigt werden, weil Unit-Tests ein falsches Gefühl der Sicherheit verursachen können
+ \item Schlecht geschriebene Tests führen zu schwieriger Wartbarkeit und Implementation neuer Features
+ \item Zeitaufwändig da sehr viele Tests geschrieben werden
+ \item Großer Code-Overhead
+ \end{itemize}
+ \item Beispiele
+ \begin{itemize}
+ \item Tic-Tac-Toe: Test zu Korrektheits-Algorithmen (Diagonal, Horizontal, ...)
+ \item Taschenrechner: Tests für einzelne Funktionalitäten (z.B. Addieren, auch Dinge wie Overflows, etc)
+ \end{itemize}
+ \end{itemize}
+\end{itemize}
+
+\subsection{Objektorientierte Programmierung}
+\begin{itemize}
+ \item Klassen sind \textit{Baupläne} (vgl. Haus-Bauplan)
+ \item Objekte sind \textit{Instanzen} der Klassen (vgl. fertiges Haus)
+ \item \textbf{Sichtbarkeiten}
+ \begin{itemize}
+ \item \textbf{Public (+)}: Jede Klasse/Methode/... kann darauf zugreifen
+ \item \textbf{Private (-)}: Nur dieselbe Klasse hat Zugriff
+ \item \textbf{Protected (\#)}: Dieselbe Klasse und abgeleitete Klassen (mittels Vererbung) haben Zugriff
+ \end{itemize}
+ \item \textbf{Erzeugung}
+ \begin{itemize}
+ \item \textbf{Deklaration}: Primitiv \texttt{int a;} - Komplex \texttt{TolleKlasse b;}
+ \item \textbf{Initialisierung}: Primitiv \texttt{a = 42;} - Komplex \texttt{b = new TolleKlasse();}
+ \end{itemize}
+ \item \textbf{Generalisierung}: Enthält die Attribute, die alle Entitäten gemeinsam haben (z.B. abstrakte Klasse \texttt{Tier})
+ \item \textbf{Spezialisierung}: Enthält nur die speziell zutreffenden Attribute und erbt von generalisierter Klasse (z.B. \texttt{Nashorn : Tier})
+ \item \textbf{Konstruktor}: Wird bei Initialisierung der Klasse aufgerufen. Mit \texttt{: base(...)} kann der Konstruktor der Basisklasse (von der geerbt wird) aufgerufen werden
+ \item \textbf{Kapselung}: Nutzung der Sichtbarkeiten, um nur bestimmte Daten zugänglich zu machen. Häufig: Alle Attribute private, Zugriff über public getter/setter Methoden
+ \item \textbf{Static}
+ \begin{itemize}
+ \item Member: Statische Member (Attribute, Methoden) bleiben in jeder Instanz gleich
+ \item Klasse: Statische Klassen können nicht instanziiert werden (z.B. Console, Math). Alle Member sind ebenfalls static
+ \end{itemize}
+ \item \textbf{Virtual}: Virtuelle Methoden haben eine Implementation, welche von abgeleiteten Klassen (Vererbung) mit \texttt{override} überschrieben werden können
+ \item \textbf{Abstract}
+ \begin{itemize}
+ \item Klassen: Können nicht instanziiert werden, nur zum Vererben und für Polymorphie (z.B. \texttt{new List<Tier>();} mit \texttt{Tier} als abstrakte Klasse); kann (muss nicht) abstrakte Methoden enthalten
+ \item Methoden: Müssen in einer abstrakten Klasse deklariert sein und haben keine Implementation; muss von abgeleiteten Klassen (Vererbung) mit \texttt{override} implementiert werden.
+ \end{itemize}
+ \item \textbf{Interface}
+ \begin{itemize}
+ \item Enthält nur Signaturen, keine Implementationen
+ \item Anwendung häufig ähnlich wie abstrakte Klassen
+ \item Abgeleitete Klassen müssen \textbf{alle} Methoden implementieren (ohne \texttt{override}), die im Interface deklariert sind
+ \item Unterschied zu abstrakten Klassen: Abgeleitete Klassen von abstrakten Klassen müssen nur diejenigen Methoden implementieren (mit \texttt{override}), die in der Basisklasse abstract sind
+ \end{itemize}
+ \item \textbf{Polymorphie} (= \enquote{Mehrere Varianten einer Methode})
+ \begin{itemize}
+ \item Overloading: Methoden können überladen werden, indem eine Methode mit gleichem Namen aber unterschiedlicher Signatur geschrieben wird. Beim Aufruf wird dann automatisch diejenige Implementation gewählt, dessen Signatur mit dem Aufruf übereinstimmt
+ \item Overriding: Geschieht z.B. bei abgeleiteten \texttt{abstract} Klassen oder überschriebenen \texttt{virtual} Methoden
+ \item Statisch: Es steht schon bei Compile-Time fest, welche Operation verwendet werden soll (\textbf{Early Binding}) - beispielsweise mit Overloading
+ \item Dynamisch: Es steht erst bei Run-Time fest, welche Operation verwendet werden soll (\textbf{Late Binding}) - beispielsweise mit Overriding
+ \end{itemize}
+ \item \textbf{Properties}
+ \begin{itemize}
+ \item \texttt{public Typ TolleProperty \{ get; set; \}}
+ \item \texttt{public Typ TolleProperty \{ get \{ <getter code> \} set \{ <setter code> \}\}}
+ \item <getter code> bzw. <setter code> könnte bspw. auf private Attribute zugreifen
+ \item get/set optional => Zugriff beschränkbar
+ \item Vorteil zu standard getter/setter: Weniger Code, übersichtlicher, einheitlich
+ \end{itemize}
+ \item \textbf{Variablen-Swap}
+ \begin{verbatim}
+ int a = 42, b = 69;
+
+ // Langweilig (Dreieckstausch)
+ int temp = a;
+ a = b;
+ b = temp;
+
+ // Besser
+ (a, b) = (b, a);
+
+ // 10head
+ a ^= b ^= a ^= b;
+
+ \end{verbatim}
+\end{itemize}
+
+\subsection{Datenbanken}
+\begin{itemize}
+ \item \textbf{Primärschlüssel} (PS): Eindeutige Identifizierung (z.B. id)
+ \item \textbf{Fremdschlüssel} (FS): Zeigt auf einen PS einer anderen Tabelle; verbindet Tabellen
+ \item 1. Normalform: Jedes Attribut ist atomar (unteilbar)
+ \item 2. Normalform: 1. NF \&\& jedes Attribut muss vom ganzen PS abhängig sein
+ \item 3. Normalform: 2. NF \&\& kein Attribut vom Primärschlüssel transitiv abhängig
+ \item \textbf{SQL} (Structured Query Language)
+ \begin{itemize}
+ \item Mögliche Abfrage: \texttt{SELECT DISTINCT \{<spalten> (AS) <name>\} FROM <tabelle1> INNER JOIN <tabelle2> ON <tabelle1.PS> = <tabelle2.FS> WHERE <bedingung> AND/OR/NOT <bedingung> LIKE '\%teil\%' GORUP BY <spalte> HAVING <bedingung> ORDER BY <spalte> ASC/DESC}
+ \item \texttt{Funktionen: AVG(), COUNT(), SUM(), MAX(), MIN()}
+ \end{itemize}
+ \item Indizierung von Spalten kann Performance-Probleme bei großen Joins beheben
+\end{itemize}
+
+\end{document}