\section{Popis implementačních nástrojů}\label{sec:Nastoje}
V této kapitole jsou popsány softwarové nástroje použité pro vývoj aplikace. Jedná se o přehled informací o programovacím jazyku C\#, dále popis grafického subsystému WPF a~také analýza návrhového vzoru MVVM, dle kterého je aplikace implementována.
\subsection{Vývojová platforma .NET Framework a programovací jazyk C\#}\label{sec:Platforma}

Vývojová platforma .NET Framework, vyvinutá firmou Microsoft koncem 90. let, je kolekcí nástrojů, technologií a taktéž sadou programovacích nástrojů pro implementaci aplikací. Klíčovou komponentou .NET Frameworku je "Common Language Runtime" (CLR), což je prostředí starající se hlavně o běh programu a jeho kompilaci. Proces kompilace probíhá ve dvou fázích, nejprve je program přeložen do tzv. "Common Intermediate Language", jehož výstupem je kód společný pro všechny programovací jazyky v sadě .NET Frameworku, avšak není spustitelný. O překlad aplikace do spustitelného souboru se stará takzvaný just-in-time kompilátor, který kód převede na sadu příkazů podléhající operačnímu systému a architektuře počítače. CLR neplní jenom funkci kompilace, zároveň také obsluhuje za běhu aplikace její správu paměti, obsluhu výjimek nebo například správu vláken. Dalším nástrojem je "Common Type System" CTS. Ten obsahuje informace o datových typech jednotlivých jazyků ze sady a stará se o jejich vzájemnou kompatibilitu a přenositelnost informace.

Jak již bylo zmíněno, platforma .NET Framework obsahuje sadu programovacích jazyků, mezi něž patří například VisualBasic, C++, F\#, JScript, J\#, C\# a další. Tím nejpokročilejším a nejrozsáhlejším z této sady je právě C\#. Představen byl v roce 2000 a od jeho představení vzrůstala jeho popularita a momentálně je mezi jedním z 10 světových nejpoužívanějších programovacích jazyků. Jazyk C\# je objektově orientovaný s přísnou kontrolou datových typů a nabízí jeho uživatelům běžné nástroje objektového programování, jako jsou dědičnost, zapouzdření, polymorfismus, překrývání metod a další \cite{overview,overview2}. 

\subsection{Popis Windows Presentation Foundation (WPF)}\label{sec:WPF}
Windows Presentation Foundation neboli WPF je grafický subsystém sloužící pro vykreslování grafického rozhraní aplikací implementovaných pomocí jazyka C\#. První verzí tohoto systému, která měla nahradit předchozí Windows Forms, byla uvedena v rámci .NET Frameworku 3.0 v roce 2006. K úplnému nahrazení nedošlo a předchozí Windows Forms je stále v některých oblastech využíván. Podsystém WPF lze rozdělit do 3 hlavních částí, a to na Presentation Framework, Presentation Core a MIL Core.

Presentation Framework obsahuje sadu definovaných komponentů pro vytváření GUI, jako například tlačítka, textová pole, zaškrtávací pole a podobně. Druhá část, tedy Presentation Core, obsahuje třídy a rozhraní klíčové pro jednotlivé grafické prvky. Poslední MIL Core (Media Integration Layer Core) zaobaluje DirectX pomocí obslužných tříd a umožňuje tak propojení CLR a DirectX.

Výhodou implementace grafického rozhraní za pomocí WPF je jednoznačné oddělení grafické a funkční části. Grafická část je implementována za pomocí jazyka XAML (Extensible Application Markup Language), přičemž součástí je i obslužná třída obecně nazvaná "Code behind". V této třídě lze specifikovat, či rozšířit, funkcionalitu grafických prvků, případně spravovat události vyvolané grafickými prvky. Použitím této třídy ve smyslu přístupu k datům však narušuje princip oddělení grafické a programové části. Standardně se třída code behind používá příkladně pro obsluhu událostí, při kterých není třeba kontakt s daty aplikace, čímž může být přiblížení obrázku \cite{wpf,wpf2}.

\subsection{Návrhový vzor MVVM}\label{sec:Mvvm}
Pro návrh aplikací existuje několik návrhových vzorů, z nichž každý má své výhody a~nevýhody. Těmito vzory jsou Model-View-Controler (MVC), Model-View-Presenter (MVP) nebo Model-View-ViewModel (MVVM). Tato kapitola je věnována popisu vzoru MVVM, jelikož je součástí této práce, a byl využit při návrhu a implementaci požadované aplikace.

\begin{figure} [h]
	\centering
	\includegraphics[width=0.8\linewidth]{fig/mvvm.png}
	\caption{Schéma principu návrhového vzoru MVVM \cite{mvvm}}
	\label{fig:mvvm}
\end{figure}

Strukturu MVVM (viz obrázek č. \ref{fig:mvvm}) můžeme, jak již název napovídá, rozdělit na 3 prvky a těmi jsou Model, View a ViewModel. Modelem je objekt představující danou logickou část aplikace a modeluje její vybrané aspekty. Jsou zde tedy uvedena jak požadovaná data, tak obslužné a výpočetní funkce, které modelují chování. Část View je zodpovědná za grafickou podobu aplikace. V našem případě je pro tento případ využito tříd generovaných za pomocí WPF. Zde je pracováno s daty, která jsou zobrazena v grafice aplikace, jakožto jsou zde vytvořeny ovládací prvky samotné aplikace. V případě WPF je cíleno na separaci zobrazení od vlastních dat, tedy je zde snaha o nepoužití code behind třídy v co největším rozsahu. Poslední částí je takzvaný ViewModel, ten slouží k propojení již výše zmíněných částí. Pomocí něj jsou vyměňována data s Modelem a volány jeho obslužné funkce a je z něj obsluhována grafická část, případně grafické prvky volají funkce a předávají data do příslušného ViewModelu.

Pro propojení View s ViewModelem je využito principu datového bindingu. Obecně datový binding slouží k provázání dat a zobrazení bez přímého přístupu k daným datům z~code behind. Z toho důvodu byly do základního objektu třídy System.Object přidány "DependencyObject" a "DependencyProperty". Principem poté je, že každý ovládací prvek GUI je potomkem třídy DependencyObject může registrovat jednotlivé DependencyPropetry. Ty jsou typem proměnné, jejichž hodnota je zapsána ve speciálním slovníku, který obsahuje jednotlivé DepencyPropery a jejich klíče a hodnoty. Klíčem těchto proměnných je jejich název a~jejich hodnota je dynamicky vyčtena pomocí funkce "GetValue". Výsledkem toho provázání je nižší paměťová náročnost, a také možnost dědění. Obnova hodnot v grafickém rozhraní probíhá automaticky dle potřeby, nebo je možné využít volání specifické události RaiseProperty, která vynutí okamžitou aktualizaci hodnoty v přiřazených prvcích GUI. Provázání lze také dále ovlivnit specifikací typu, které jsou uvedeny v tabulce č. \ref{tab:binding}

\begin{table}[h]
	\centering
	\begin{tabular}{  l   r }
		\hline 
		Název & Popis  \\ \hline 
		
		Two way & Načítaní i zápis do zdroje.\\
		One way & Pouze načítání ze zdroje.\\
		One time & Načtení ze zdroje pouze jednou při inicializaci.\\
		One way to source & Pouze zápis do zdroje.\\

		\hline
	\end{tabular}
	\caption{Přehled možností provázání datového propojení}
	\label{tab:binding}
\end{table}

Pokud tedy shrneme výhody použití návrhového vzoru MVVM můžeme konkrétně hovořit o těchto:

\begin{itemize}
	\item Separace grafické a funkční části, což vede k modulárnosti aplikace a možnosti spolupráce více programátorů na různých úsecích.
	\item Díky separaci a vlastnostem tohoto návrhového vzoru aplikace obsahuje kratší úseky kódu. Tedy je přehlednější a méně náchylná na chybu. Zároveň je poté jednodušší chyby odhalit
	\item Na základě stanovených principů a organizaci je výsledný kód přehlednější a lze se v~něm lépe orientovat.
\end{itemize}

Za nevýhody můžeme považovat složitější syntaxi jazyka XAML, případně náročnější princip funkce datového bindingu \cite{mvvm,mvvm2}.

