# 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