diff options
Diffstat (limited to 'colloq')
-rw-r--r-- | colloq/.gitignore | 6 | ||||
-rw-r--r-- | colloq/Makefile | 19 | ||||
-rw-r--r-- | colloq/figures/mvc.svg | 174 | ||||
-rw-r--r-- | colloq/figures/mvvm.png | bin | 0 -> 18486 bytes | |||
-rw-r--r-- | colloq/figures/scrum.png | bin | 0 -> 175120 bytes | |||
-rw-r--r-- | colloq/figures/threetier.png | bin | 0 -> 68286 bytes | |||
-rw-r--r-- | colloq/main.pdf | bin | 0 -> 307441 bytes | |||
-rw-r--r-- | colloq/main.tex | 269 |
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 Binary files differnew file mode 100644 index 0000000..87e4ab8 --- /dev/null +++ b/colloq/figures/mvvm.png diff --git a/colloq/figures/scrum.png b/colloq/figures/scrum.png Binary files differnew file mode 100644 index 0000000..fc7b517 --- /dev/null +++ b/colloq/figures/scrum.png diff --git a/colloq/figures/threetier.png b/colloq/figures/threetier.png Binary files differnew file mode 100644 index 0000000..749db4c --- /dev/null +++ b/colloq/figures/threetier.png diff --git a/colloq/main.pdf b/colloq/main.pdf Binary files differnew file mode 100644 index 0000000..1603642 --- /dev/null +++ b/colloq/main.pdf 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} |