Konstrukce je fáze, kde se abstraktní návrh setkává s konkrétní implementací.
Následuje po analýze požadavků a návrhu
Proces kódování, ladění a testování
Transformace SW návrhu na spustitelný kód a integraci komponent do funkčního celku
Zahrnuje návrh v malém - detailní rozhodnutí která nebyla specifikována v předchozích fázích. Tato rozhodnutí musí být v souladu s celkovou architekturou a koncepcí systému.
Rozhodnutí během konstrukce:
Představuje šablonu/blueprint podle které se vytvářejí objekty.
Definuje
Pro vizualizaci se často využívají UML diagramy tříd
Konkrétní instance třídy
Hodnoty atributů objektu patří tomuto objektu (nejsou sdílené)
Metody objektu jsou společné pro všechny objekty dané třídy
Pro vizualizaci konkrétních instancí a jejich vztahů v daném okamžiku slouží UML objektové diagramy, kde jsou klíčové modifikátory přístupu pro znázornění zapouzdření.
Tyto dvě pravidla jsou součástí principu SOLID:
Další pravidla:
Každá třída by měla mít pouze jednu odpovědnost a tedy pouze jeden důvod ke změně.
Každá metoda by měla mít právě jednu přesně definovanou zodpovědnost.
Zvyšuje soudržnost tříd (cohesion = míra, do jaké spolu zodpovědnosti jedné třídy souvisejí),
Snižuje provázanosti (coupling = měřítko toho, jak moc je jedna třída závislá na jiné) s ostatními částmi systému
Zlepšení čitelnosti, testovatelnosti a udržitelnosti kódu.
Změny týkající se jedné odpovědnosti by neměly ovlivnit jiné, nesouvisející odpovědnosti.
Příklad:
UserSettings, která původně spravovala jak aktualizaci uživatelských nastavení, tak ověřování uživatele pomocí SMS, porušovala SRP.UserSettings (pro správu nastavení) a UserAuth (pro SMS potvrzení), kde každá třída má nyní právě jednu odpovědnost.Velký počet veřejných metod ve třídě může signalizovat, že třída má příliš mnoho odpovědností.
Objekty podtřídy musí být zaměnitelné za objekty nadtřídy, aniž by to porušilo správnost nebo očekávané chování programu.
Rozhodně bychom neměli používat dědičnost jenom proto, že obě třídy mají určitou množinu společných atributů
Zjednodušeně řečeno: "Co funguje pro předka, musí zaručeně a bez překvapení fungovat i pro jeho potomka."
Zajišťuje, že dědičnost je využívána korektně z hlediska chování.
Podtřídy by měly pouze rozšiřovat funkcionalitu nadtřídy, nikoli měnit invarianty kontraktu.
Příklad:
Ctverec dědit od třídy Obdelnik?Obdelnik má metody setSirka(int s) a setVyska(int v)Ctverec, musíme tyto metody přepsat tak, aby vždy nastavovaly obě strany na stejnou hodnotu (aby to zůstal čtverec).Obdelnik, nastaví mu šířku na 5 a výšku na 10 a očekává, že obsah bude 50.Ctverec, ta si po zavolání setVyska(10) změní i šířku na 10. Obsah vyjde 100. Program se zachová nečekaně.Zatímco SRP a LSP jsou objektové principy, DRY je obecná programátorská zásada
Každá část znalosti (kódová logika, data, konfigurace) by měla mít v systému jedinou, jednoznačnou a autoritativní reprezentaci
Cílem je minimalizovat duplicitu informací nebo logiky.
Snížení duplicity snižuje riziko nekonzistencí při provádění změn. Změna se provede na jednom místě a propíše se do všech míst.
Příklad:
PasswordValidator.isValid(String password). Zbytek aplikace volá pouze tuto metodu.Tento princip říká, že když spolu dva objekty komunikují, neměly by se spoléhat na konkrétní třídu toho druhého, ale na obecný kontrakt (rozhraní / interface), který daný objekt splňuje.
Zvyšuje flexibilitu, protože umožňuje snadnou výměnu konkrétních implementací bez nutnosti významných změn.
Špatně (Proti implementaci): Všude v kódu e-shopu máš natvrdo vytvořenou třídu TwilioSmsService SMS = new TwilioSmsService();. Za rok se vedení rozhodne, že Twilio je moc drahé a přecházíte na InfoBip. Musíš projít celý e-shop a přepsat TwilioSmsService na InfoBipSmsService.
Dobře (Proti rozhraní): Vytvoříš rozhraní SmsService s metodou posliSMS(). Třídy TwilioSmsService a InfoBipSmsService toto rozhraní implementují. V kódu e-shopu pak voláš pouze obecnou SmsService. Výměna poskytovatele znamená změnu na jediném místě (v nastavení aplikace), zbytek kódu zůstává netknutý.
Metoda objektu by měla volat pouze metody vlastní, svých atributů, objektů vytvořených v rámci dané metody, nebo objektů předaných jako parametry.
Cílem je omezení řetězení volání metod přes několik objektů. object.getA().getB().doSomething()
Špatně (Porušení zákona Demeter): zakaznik.getPenezenka().getKreditniKarta().strhniPenize(castka); Tímto kódem jsi doslova vlezl zákazníkovi do kapsy, vytáhl peněženku, z ní kartu a provedl platbu. Tvůj kód teď musí vědět, že zákazník má peněženku a že peněženka obsahuje kartu. Pokud zákazník přejde na Apple Pay (nebude mít peněženku), tvůj kód selže.
Dobře (Dodržení zákona Demeter): zakaznik.zaplat(castka); Zavoláš metodu na svém přímém sousedovi (zakaznik). Jak to zákazník udělá (jestli vytáhne hotovost, kartu, nebo zaplatí telefonem), je čistě jeho interní věc. Tvůj kód je elegantní a chráněný před změnami uvnitř třídy Zákazník.
Duplicity
Dlouhé metody
Velké třídy - nízká soudržnost
Příliš mnoho parametrů
Komentáře
Složité struktury podmínek
Nedodržené jmenné konvence
Feature envy - metoda více využívá data jiné třídy, než své vlastní
Switch statements - často lze nahradit polymorfismem
Message chains - dlouhé řetězení volání metod
Vytvořeno: 18. 6. 2026, 16:21
Poslední aktualizace: 20. 6. 2026, 14:45