Strukturované programování

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Strukturované programování (též strukturovaný programovací jazyk) označuje v informatice programovací techniku, kdy se implementovaný algoritmus rozděluje na dílčí úlohy (t.j. procedury či funkce), které se spojují v jeden celek. Na strukturované programování lze nahlížet jako na podmnožinu imperativního programování, avšak s jistými omezeními – k implementaci v počítačovém programu se používá vybraných řídicích struktur, ostatní struktury nejsou povoleny a u strukturovaného programování se např. nepoužívá řídicí příkaz skoku.

Historie[editovat | editovat zdroj]

Obvykle se za počátek strukturovaného programování považuje článek Edsgera W. Dijkstry z roku 1967 nazvaný „Goto statement considered harmful“ (příkaz Goto považován za škodlivý), který se objevil v měsíčníku Communications of the ACM vydávaného sdružením počítačových odborníků ACM, ve kterém Dijkstra volá po odstranění příkazu skoku z vyšších programovacích jazyků za účelem zkvalitnění kódu a několikrát popisuje nepřímou úměrnost mezi programátorovými dovednostmi a hustotou příkazů skoku v jeho programu. Vedle Dijkstry však nesmíme zapomenout ani na Nicklause Wirtha, jehož práce pro Algol W byla Dijkstrovi inspirací, stejně tak jako články z roku 1966 od pánů Böhma a Jacopiniho.

Metoda strukturovaného programování byla obecně přijata velmi pozitivně a většina počítačových odborníků byla přesvědčena o jeho výhodách. Nicméně například přední uznávaný informatik a profesor Donald Knuth, ačkoli v zásadě souhlasí se základními koncepty strukturovaného programování, vždy odmítal a dosud stále odmítá snahu o naprosté vymýcení příkazu skoku z programu. Ve své práci z roku 1974 nazvané „Structured Programming with Goto Statements“ (strukturované programování s příkazem Goto) uvádí několik příkladů, u nichž tvrdí, že použití příkazů skoku vede k efektivnějšímu kódu, a to bez újmy na jeho čitelnosti.

Používané řídicí struktury[editovat | editovat zdroj]

Strukturované programování definuje, že na nejnižší úrovni se program může skládat pouze z následujících tří struktur:

  • sekvence: provádí posloupnost příkazů jeden po druhém)
  • výběr: jeden nebo více příkazů je vykonán v závislosti na stavu programu (obvykle vyjadřováno klíčovými slovy if…then…else…endif, switch nebo case)
  • opakování: příkazy jsou prováděny do té doby, dokud program nedosáhne nějakého stavu (obvykle vyjadřováno klíčovými slovy while, repeat, for nebo do…until)

Nejznámějším důsledkem těchto zásad je snaha zabránit nebo v závislosti na programovacím jazyce alespoň omezit používání příkazu skoku. Programový kód nerespektující výše uvedené zásady se často hanlivě označuje jako „špagetový kód“.

Programovací jazyky[editovat | editovat zdroj]

Principy strukturovaného programování je možné aplikovat ve všech programovacích jazycích (dokonce i v jazyce symbolických adres), avšak je určitě výhodné použít některý z procedurálních jazyků. V sedmdesátých letech, kdy strukturované programování začalo získávat svoji popularitu, se rovněž v nově vzniknuvších procedurálních jazycích objevily prvky a konstrukty, které nutily programátory psát kód strukturovaně. Mezi tyto jazyky bychom mohli zařadit ALGOL, Pascal, PL/1 nebo jazyk Ada.

Běžné odchylky[editovat | editovat zdroj]

Obsluha výjimek[editovat | editovat zdroj]

Téměř nikdy není důvod k tomu, aby měl podprogram více vstupních bodů. A mnoho teoretiků, Dijkstru nevyjímaje, v minulosti volalo také po tom, že podprogram by měl také pouze jeden výstupní bod, nicméně praxe ukázala stinnou stránku tohoto přístupu.

Typickým příkladem výše uvedené situace by byla jednoduchá procedura pro čtení dat ze souboru a jejich zpracování:

otevřít soubor;
while (existují data k přečtení) {
  načíst data;
  if (chyba) {
    ukončit podprogram a informovat zbytek programu o chybě;
  }
}
zpracovat načtená data;
konec podprogramu;

Výše je uvedena poměrně běžná situace, se kterou se můžeme vypořádat několika způsoby: vyhozením výjimky, předčasným (druhým) návratem z procedury a nebo třeba i příkazem skoku. Ve všech těchto případech má procedura dva výstupní body a porušuje tak principy „striktního“ strukturovaného programování. Na obhajobu tohoto přístupu však musíme říci, že přepsání této procedury v souladu s pravidlem jednoho výstupního bodu by bylo poměrně těžkopádné, nemluvě o tom, jaký chaos by v kódu vznikl, pokud by do hry vstoupilo více chybových stavů a každý se navíc musel ošetřit jiným způsobem.

Většina programovacích jazyků přejala tyto principy. Za všechny jmenujme jazyk C a jeho klíčová slova continue, break a return.

Stavový automat[editovat | editovat zdroj]

Některé programy, jako například parser, mohou mít velké množství stavů a jejich rozložení do základních struktur nemusí být vůbec jednoduché. Bylo by možné napsat každou změnu stavu jako jeden podprogram a pomocí proměnné udržovat aktuální stav programu, nicméně někteří programátoři (například Donald Knuth) preferují implementovat změnu stavu pomocí skoku.

Literatura[editovat | editovat zdroj]