# Postup při návrhu algoritmu (od problému k programu)

- Pokud máme problém, který chceme vyřešit pomocí počítačového programu, je potřeba nejprve promyslet různé aspekty vytvářeného programu
	- Jaký je algoritmus či algoritmy programu
	- Jakým způsobem lze algoritmus realizovat a dekomponovat na menší části
	- Jaké jsou potřebné datové struktury
	- Jaký bude vstup a výstup programu (co má program načítat a co vypisovat)
	- Jak bude program komunikovat s uživatelem (typ uživatelského rozhraní)

### Obecný postup

- Zde je popsáno několik obecných rad, jak při vytváření (rozsáhlejšího) programu postupovat
	- Nejedná se o žádnou konkrétní metodiku
	- Nejedná se o dogma, které by muselo být dodržováno striktně 

#### Promyšlení jednotlivých aspektů

- Je potřeba rozmyslet všechny zmíněné aspekty o Většina z nich spolu úzce souvisí => změna rozhodnutí v jedné oblasti pravděpodobně ovlivní další oblasti
	- Dělat si poznámky, schémata
		- Zvláště u složitějších problémů se snadno zapomíná na již vymyšlené věci, proto je potřeba si myšlenky zaznamenávat

#### Postup programování

- S programováním by se mělo začít, až když je rozmyšlená a navržená struktura aplikace 
	- Tj. na jaké třídy bude aplikace členěna a do jakých balíku budou tyto třídy umístěny
- Co naprogramovat nejdříve
	- Je možno více postupů
	- Častý je postup shora dolů 
		- Vytvoří se kostry jednotlivých (téměř všech) tříd i s hlavičkami metod
		- Do těchto koster se následně postupně doplní funkcionalita (těla metod)
		- Pokud budeme mít nejprve hotovou kostru většiny tříd metod (s prázdnými těly), hodí se to při následném psaní těl metod
			- Těla metod mimo jiné obsahují volání jiných metod naší aplikace => pokud tyto metody existují (byť s prázdnými těly), IDE nástroj může při psaní pomoci s doplňováním jejich volání
- Průběžná kontrola funkcionality
	- IDE nástroj nás upozorní na překlepy a jiné syntaktické chyby  je možné vytvořit program, který půjde hned napoprvé přeložit (tj. bez chyb při překladu)
	- Program však s vysokou pravděpodobností obsahuje chyby v chování programu, na které nás IDE nástroj neupozorní  je potřeba ladění
	- Řádné ladění je možné až po dokončení aplikace
	- Ladění částí kódu (např. jednotlivých výpočtů) je však možné už v průběhu může to usnadnit ladění v závěrečné fázi, protože části kódu byly už alespoň částečně prověřeny

#### Úpravy algoritmů a refaktoring

- Pro začátečníky ale i pro zkušené programátory není snadné zohlednit při návrhu programu všechny aspekty
- Často se na něco zapomene
- Náprava opomenutí může být drobná, ale také rozsáhlá
- Je poměrně běžné, že se v již hotovém kódu dělají úpravy
	- Za účelem doplnění či změny funkcionality
		- Typicky proto, že se na něco zapomnělo, nebo se objevil nový požadavek
		- Např. změna algoritmů, změna formátu vstupů a výstupů
	- Za účelem vylepšení zdrojového kódu (bez změny funkcionality)
		- Tzv. refaktoring
		- Např. změna struktury aplikace (rozdělení funkcionality do více tříd ametod), přejmenování a přesunutí tříd, rozdělení aplikace do více balíků apod.
		- IDE nástroje často poskytují nástroje pro jeho usnadnění
			- Např. přejmenování a přesunutí třídy
- Ve skutečnosti se málokdy stane, že původní návrh, jak by měl program vypadat, se naprogramuje 1:1 a nedojde k žádným změnám

#### Ladění a testování

- Po dokončení programu je potřeba provést jeho ladění
	- Program obsahuje chyby za běhu programu, které je potřeba odstranit
	- Důležité je zkoušet program spouštět s různými typy vstupů (včetně neplatných vstupů) a ověřovat, zda dává správné výstupy
	- V případě nalezení problému (program padá a/nebo dává nesprávné výsledky), je vhodné použít debugger (případně kontrolní výpisy) pro zjištění, co se v programu děje a pro nalezení a odstranění chyb

#### Odevzdání programu

- Po dokončení testování je třeba vytvořit formu programu, která je vhodná pro odevzdání či distribuci
	- Typicky spustitelný soubor JAR
	- Tato forma by rovněž měla být řádně otestována

