Nutnost použití vzoru OBSERVER pro zamezení nepříjemných efektů zpětných funkcionálních vazeb mezi objekty
|
|
- Zdeňka Beranová
- před 8 lety
- Počet zobrazení:
Transkript
1 Nutnost použití vzoru OBSERVER pro zamezení nepříjemných efektů zpětných funkcionálních vazeb mezi objekty autor RNDr. Ilja Kraval, únor 2007 firma Object Consulting s.r.o.
2 Úvod V předešlému článku s názvem Jedna z velmi častých a závažných chyb při návrhu IS aneb jak vznikají tzv. "molochální systémy", (článek je volně ke stažení na serveru v sekci Odborné články zdarma) se vřele nedoporučuje vytvářet tzv. molochální systémy, které svou povahou jdou přesně proti principům komponentní technologie: Na rozdíl od systému, který je logicky navržen po vrstvách a který je následně je rozčleněn do odpovídajících fyzických komponent, tak molochální systém není fyzicky rozčleněný systém. Obsahuje fyzicky velká kusiska zdrojového kódu ke kompilaci, nad kterými pracuje několik, někdy i několik desítek vývojářů. Systém moloch není rozdělen fyzicky na menší části, které by se vzájemně linkovaly (uses, include, import apod.). Protože vše souvisí se vším, tak systém apriori nejde fyzicky rozdělit. Práce s takovým systémem je velmi nepříjemná. Kompilace je nejenom technicky, ale hlavně organizačně náročná. Vývojáři se nad kódem doslova bijí a dohody, které musí při zásahu do kódu neustále činit, silně stěžují práci. Kód je sám o sobě netransparentní, nečitelný, se spoustou neobvyklých a nečekaných vazeb. Každá i sebemenší změna nutně vede k zásahu do již hotového celého kódu jako obrovského celku, což přináší další problémy. Systém navržený jako moloch jde evidentně svou povahou přesně proti způsobu tvorby IS pomocí moderních komponentních technologií (Java, DOT NET) Musím poznamenat, že tato situace je nepříjemná nejenom pro vývojáře, ale i pro vedoucího pracovníka. Efektivní řízení vývojových prací nad molochem je v podstatě nemožné anebo opravdu velmi obtížné s náběhem na žaludeční vředy. Jedno z doporučení, jak se vyhnout návrhu systému s takovými vlastnostmi, spočívá v tvorbě velmi dobrého a kvalitního analytického neboli konceptuálního modelu s přísnou kontrolou čistoty pojmů. O tom detailněji pojednává zmíněný minulý článek. Ukazuje se však, že toto pravidlo je sice nutné, avšak není dostačující. Můžeme vytvořit z hlediska čistoty pojmů opravdu dokonalý konceptuální model, můžeme tento konceptuální logický model dobře rozvrstvit a následně se jej pokusit fyzicky rozčlenit do relativně nepříliš velkých komponent v dané technologii a přesto zjistíme, že nastanou efekty příznačné pro kódovaného molocha! V čem je tedy problém? strana 2
3 Zpětné funkcionální vazby mezi objekty Odpověď spočívá v efektu chybně vyřešených zpětných funkcionálních vazeb. Vysvětlíme si tento jev na jednoduché situaci: Zpětná funkcionální vazba pro auta a barvy Představme si, že některý objekt používá nějaký jiný objekt, má k němu přístup a přitom tento druhý objekt první objekt nepoužívá, tj. vazba je evidentně jedním směrem. Například se jedná o následující situaci v logickém modelu: Každé evidované auto má barvu z číselníku barev, což zapíšeme pomocí jazyka UML v modelu tříd takto: Auto +moje barva 1 Barva obrázek 1 Zápis části logického modelu "auto má barvu z číselníku barev" Směrovost vazby se samozřejmě promítne až do kódu a to v libovolném prostředí jako jsou unity v Pascalu, knihovny v C++, assembly v C# atd. Evidentně všechna část kódu, která spravuje pravou část, tedy kód, který spravuje číselník barev, může stát samostatně (například v jedné nebo několika komponentách), levá část kódu (vše, co souvisí s auty), si bude linkovat tuto pravou část. Můžeme si pomyslně představit střih systému, který rozdělí systém logicky a následně i fyzicky na dvě části takto: strana 3
4 Auto +moje barva 1 Barva obrázek 2 Představa o střihu systému v logice Přitom je zřejmé, že levá část používá pravou část. Všimněme si důležité věci: Pravá část kódu (číselník barev) může stát samostatně, nabízí své použití, tj. můžeme ji vyvinout jako první se vším všudy, tj. bez levé části (aut), kterou vyvineme až následně. Vidíme evidentně vrstvy kódu jako vrstva vnitřní a vrstva vnější (barvy a auta), to nám může pomoci vyhnout se molochálnímu přístupu Připomeňme jenom závěr z předešlého článku, a totiž ten, že musíme dodržet čistotu pojmů a do části kódu spravující barvy (vpravo od střihu) nesmíme zaplantat nic z aut, tedy jinak řečeno barvy musí zůstat barvami čistými, což má svou jasnou logiku. Vše se tedy zdá být jasné a logické, ale při pokusu o střih nás čeká jedno nemilé překvapení: Co se stane, když se něco změní v evidenci barev a přitom ta evidovaná auta, kterých se tato změna týká, na tuto změnu musí zareagovat? Jednoduchý příklad: Potřebujeme vymazat z evidence nějakou barvu a všechna auta, která si na ni ukazují, si mají ukazovat od té chvíle na nic. Je třeba podotknout, že daná situace se nemusí vyskytnout pouze u tak jednoduchého případu, jako je reakce nějakého prvku na vymazání. Úplně stejná situace nastává například při použití asociační třídy, kdy prvek z asociační třídy musí zareagovat na změnu u prvku, jehož instanci používá (tj. na kterou si ukazuje), anebo se může jednat o logický problém v business logice, kdy někdo potřebuje zareagovat na nějakou změnu u toho, koho vidí (například reakce na změnu stavu v účtu, nebo reakce na novou historii u prvku, apod.). Při řešení těchto problémů se můžeme dopustit vážné chyby: Při běhu nějaké funkcionality v barvách (ať už v kódu střední vrstvy anebo v databázi), kdy dojde ke změně stavu v barvách a auta na tuto změnu stavu mají zareagovat, tak povinně nesmí funkcionalita barev přímo zavolat funkcionalitu aut. To je totiž chybný postup narušující předešlou logiku střihu a vnitřních a vnějších vrstev! Tímto postupem, kdy voláme funkcionálně zpět, dojde ke zpětné funkcionální vazbě proti směrovosti použití a vazba mezi auty a barvami se tak stane cirkulární. Velmi nemilou záludností na této situaci je to, že v modelu tříd (který je statický), není tato skutečnost zpětné funkcionální vazby na první pohled vůbec vidět strana 4
5 Závěr je jasný: Pokud funkcionalita barev zavolá funkcionalitu aut, potom se nám již nepodaří oddělit tyto dvě vrstvy od sebe, protože jsou oboustranně cirkulárně provázány (barvy volají a tedy potřebují auta) a pokud tento postup zpětné funkcionální vazby provedeme pokaždé a všude, kde potřebujeme vyřešit podobný problém, máme zaděláno na molochální systém se všemi důsledky. Otázkou tedy je, jak tuto situaci vyřešit správně. Ale než přistoupíme k odpovědi, zmíníme se ještě o jednom velmi důležitém důsledku tohoto chybného postupu, který souvisí s metodickými postupy ve vývoji. Změna starého kódu při přidání nového kódu? Jedna z doporučovaných metodik vývoje středních, velkých případně rozsáhlých informačních systémů se nazývá iterativní a inkrementální metoda. Velmi stručně řečeno, tato metodika doporučuje u jen trochu větších systémů rozdělit systém na menší části, vyřešit v jedné iteraci vývoje vždy jednu část a k ní poté přidat další části řešení (inkrementace) a opět vyvinout tuto část v další iteraci, přidat další část řešení atd. Asi nemusíme zdůrazňovat, že pokud dbáme na vrstvy systému, je tato metodika mnohem schůdnější. Dovedeme si představit, že v předešlém příkladu bychom nejprve v první iteraci vyvinuli vše, co se týká barev a poté vše, co se týká aut. Vrstvy nám svou povahou nabízejí návod, odkud postupovat, kde začít, co na co navazuje. Na druhou stranu, pokud nedbáme na vrstvy v systému (pochopitelně s důsledkem tvorby molocha), iterativní a inkrementální metoda nebude fungovat dobře anebo dokonce nebude fungovat vůbec. Pro nás je nyní zajímavá tato situace: Představme si, že k již hotovému kódu potřebujeme přidat nový kód. Může se jednat o jednu z těchto tří situací: změnové řízení dané verze systému ( na něco se pozapomnělo ), vývoj nové verze ( nová verze umí ještě něco navíc ) nebo se jedná o novou iteraci v iterativní a inkrementální metodě vývoje ( je třeba přidat a řešit další část systému v další iteraci ) Ať už se jedná libovolnou z těchto tří situací, tak důležité je zde slůvko přidat kód, tj. máme na mysli situaci, kdy se nám logicky jeví, že se jedná o přidání nové funkcionality beze změny původního již naprogramovaného kódu. Logicky by se nám strana 5
6 mohlo zdát, že pokud přidáme nový kód s novou funkcionalitou, tak bychom se nemuseli hrabat ve starém kódu. Ano, pokud Tato logika bezesporu platí, avšak pouze v případě, že jsme dobře vyřešili problém vrstev a také problém zpětné funkcionální vazby. Vraťme se k názornému a jednoduchému příkladu s barvami a auty (viz obrázek 1). Nechť nějaká reakce na změnu v evidenci barev se vyřešila chybně zpětným voláním funkcionality aut. Symbolicky zapíšeme tuto situaci v pseudokódu takto: Nějaká funkcionalita barev FB1; { //...něco zde běží a nastala změna stavu v barvách // je třeba zavolat něco z aut: zavolám nějakou funkcionalitu aut FA1; // pokračuji dále v běhu... } Je zřejmé, že tato konstrukce bude fungovat a dokonce bude fungovat bezchybně, ale bohužel konstrukce je špatná, protože část kódu barev volá něco z aut ( plantáme auta do barev!). Tato čistě teoretická úvaha má dva praktické a velmi nepříznivé důsledky. O prvém z nich už víme: Nelze od sebe striktně oddělit obě dvě vrstvy, auta a barvy, přičemž častým používáním tohoto špatného řešení nám hrozí tvorba molocha. Druhý nepříznivý důsledek si uvědomíme, když přidáme novou entitu (doposud jsme ji neřešili), označme ji jako X, která si také bude podobně jako auta ukazovat do barev: strana 6
7 Auto +moje barva 1 Barva 1 +moje barva X obrázek 3 Přibyla další entita X, její prvky používají také barvy Pro náš příklad je důležité, že způsob, jakým entita X přibyla do řešení, je jedna ze tří zmíněných situací: buď se jedná o změnové řízení, nebo o novou verzi anebo o novou iteraci. Jinak řečeno, důležitá je ta skutečnost, že starý kód je již hotov a zkompilován, a my chceme přidat nový kód. A máme zajímavý logický problém! Zdálo by se, že pouze přidáváme novou entitu a proto se nemusíme hrabat ve starém kódu. Avšak pokud se podíváme na konstrukci volání funkcionalit v našem pseudokódu, tak pokud také prvky z X mají zareagovat na tutéž změnu stavu jako auta (což bude velmi pravděpodobné), tak musíme otevřít starý kód barev a přidat jeden řádek s voláním funkcionality X, která (podobně jako u aut) ošetří reakci prvků X: Nějaká funkcionalita barev FB1; { } //...něco zde běží a nastala změna stavu v barvách // je třeba zavolat něco z aut a něco z X: zavolám nějakou funkcionalitu aut FA1; zavolám nějakou funkcionalitu X FX1; // pokračuji dále v běhu... A co když někdo přijde s další entitou Y a další a další entitou? Vidíme evidentní nepříznivý důsledek číslo 2: Při tomto chybném řešení nastává efekt, že přidání kódu znamená vždy otevření starého kódu a jeho změny strana 7
8 Řešení zpětné funkcionální vazby mezi objekty Existuje několik způsobů, jak vyřešit problém zpětné funkcionální vazby mezi objekty. Všechny jsou postaveny na stejné myšlence, kterou si nyní vysvětlíme. Podívejme se na předešlý kód se dvěma řádky volání funkcionalit a představme si, že by se nám podařilo nějakou fintou zavolat nikoliv jako dva řádky, ale cyklem podle schématu: Cyklus čítač i od 1 do N { } F[i] //zavolání i-té funkcionality (v našem případě F[1]reprezentuje funkcionalitu aut FA1 a F[2]reprezentuje funkcionalitu FX1 a pochopitelně N = 2) V tom případě je problém evidentně vyřešen. Do seznamu funkcionalit můžeme přidat klidně další a další funkcionality a původní kód cyklu se nemění. Jestliže například někdo přijde s další entitou Y, starý kód nebudeme již otvírat (viz cyklus, který se nemění), pouze je třeba novou funkcionalitu přidat do cyklu jako prvek F[3]. Jedinou otázkou zůstává, jak toho efektu docílit. Existuje několik možností, jak vytvořit cyklus z funkcionalit. Volání funkce přes ukazatel na funkce Jedna z možností, kterou nabízí strukturální programování, je vytvořit seznam ukazatelů na funkce a s ním pracovat podle předešlého schématu. Pak skutečně hovoříme o i-té funkci. Toto řešení bychom zvolili například v C jazyce (tj. v C bez ++). Volání přes proměnnou typu funkce Některé jazyky nabízejí předešlý způsob práce s ukazateli na funkce ve vyšší syntaxi jazyka přímo deklarací proměnné typu funkce (například Pascal). Vytvořil by se strana 8
9 seznam z takovýchto proměnných typu funkce a s nimi by se pracovalo podle předešlého schématu. Volání přes název funkce Některá prostředí neumožňují práci s ukazateli a ani neznají objektové programování ale poskytují možnost zavolat funkci přes její název uschovaný jako hodnota stringu v nějaké proměnné. Nazvěme symbolicky takové volání jako CallFunctionByName(název_funkce: string) Funkce CallFunctionByName převezme hodnotu název funkce jako vstupní parametr a poté zavolá funkci s názvem, který odpovídá hodnotě vstupního parametru. Nyní stačí založit tabulku (obecně seznam) názvů funkcí a poté ji cyklem přečíst a u každé načtené hodnoty zavolat CallFunctionByName. Přidat novou funkci znamená přidat nový řetězec s odpovídajícím názvem do tabulky funkcí. Volání přes delegáty Jazyk C# umožňuje řešení této situace přes tzv. delegáty. Jedná se vlastně o řešení seznamu odkazů na metody objektů. Princip je opět stejný Volání přes polymorfní metodu použití vzoru OBSERVER (alias LISTENER) Opravdu objektově čistým řešením je použití vzoru OBSERVER (v jazce JAVA se nazývá LISTENER). Poznámka: Problematiku návrhových vzorů a vzor OBSERVER si můžete podrobně prostudovat v knize Design patterns v OOP zdarma ke stažení na našem serveru. Jak známo, vzor OBSERVER umožňuje zavést mechanismus sledování objektu tak, že když tento objekt změní stav, ostatní objekty na tuto změnu zareagují, avšak nedojde k přímé vazbě od sledovaného objektu k těmto objektům, tj. sledující a reagující objekty jsou zavolány nepřímo přes polymorfní metodu. Jednoduše řečeno, vzor OBSERVER funguje tak, že naše funkcionality nebudeme schovávat ani za ukazatel na funkci jako v C, ani za proměnnou typu funkce, ani za proměnnou typu string s názvem funkce a ani za delegáta, ale schováme ji za polymorfní metodu (podrobně viz uvedená kniha). strana 9
10 Závěr Z uvedeného vyplývá, že pokud chceme správně vrstvit systém a zamezit cirkulárním vazbám, musí se nutně použít vzor OBSERVER anebo použijeme nějakou jeho obdobu. V každém případě je nutností odstínit přímé volání sledujícího objektu od sledovaného objektu (tj. zamezit přímému volání proti směru statické vazby). Při zanedbání tohoto pravidla jednak hrozí tvorba nepříjemných molochů (jako přímý důsledek cirkulárních referencí) a kromě toho vzniká neblahý efekt, kdy přidání úplně nového nezávislého kódu nutně vede k otevírání již existujícího starého kódu. To má mimo jiné velmi nepříznivý vliv na postupy při změnovém řízení, při vývoji nové verze a při použití iterativní a inkrementální metody vývoje. Jak vidět, problematika tvorby vrstev v informačním systému je velmi důležitá a není jednoduchá. Musím však z vlastní praxe poznamenat, že v mnoha SW firmách je tento problém bohužel při návrhu IS velmi hrubě opomíjen a to se všemi důsledky. Oproti tomu školení o modelování informačních systémů v UML, která jako autor vedu, se zabývají podrobně jak syntaxí UML, tak se také věnují tzv. doporučeným a nedoporučeným postupům. A konkrétně problematice, jak v systému vytvářet necirkulární vrstvy (a následně dobré komponenty), a jak se tedy vyhnout molochům, se věnuje celá jedna velká kapitola i to se spoustou příkladů dobrých a špatných postupů --- Konec článku --- strana 10
Proč je analytický model IS nutným předpokladem pro zabránění tvorbě molochálních systémů
Proč je analytický model IS nutným předpokladem pro zabránění tvorbě molochálních systémů Část 1 autor RNDr. Ilja Kraval, http://www.objects.cz březen 2007 firma Object Consulting s.r.o. Úvod V reakci
VíceS KONFIGURACÍ POVOLENÝCH KOMBINACÍ DĚDICŮ
VZOR HETEROGENNÍ SEZNAM S KONFIGURACÍ POVOLENÝCH KOMBINACÍ DĚDICŮ RNDr. Ilja Kraval, září 2008 http://www.objects.cz ÚVOD Jak známo, v CLASS DIAGRAMU se dělí vztahy do dvou základních typů: Buď se jedná
VíceOdpověď na dotaz ohledně asociační třídy v modelu měření
Odpověď na dotaz ohledně asociační třídy v modelu Část 4. Tento článek navazuje na předešlé články jako jejich pokračování autor RNDr. Ilja Kraval, http://www.objects.cz září 2007 firma Object Consulting
VíceNAUČTE SE MALOVAT SI INSTANCE!
NAUČTE SE MALOVAT SI INSTANCE! část 2. RNDr. Ilja Kraval, září 2009 http://www.objects.cz ÚVOD V předešlém článku jsme otevřeli jeden ze základních problémů, který musí analytik řešit: Jak vypadá skladba
VíceROZDÍL MEZI VZTAHEM EXTEND A INCLUDE V USE CASE DIAGRAMECH
ROZDÍL MEZI VZTAHEM EXTEND A INCLUDE V USE CASE DIAGRAMECH 3. část RNDr. Ilja Kraval, srpen 2009 http://www.objects.cz ÚVOD Tento článek je pokračováním předešlých článků. Článek vysvětluje použití vztahu
VíceJak správně psát scénáře k případům užití?
Jak správně psát scénáře k případům užití? Autor RNDr. Ilja Kraval 2007 http://www.objects.cz K napsání tohoto článku mne inspiroval tento mail: Dobrý den pane Kravale, chci Vás poprosit o radu, která
VíceTřetí část odpovědi na mail ohledně zpracování případů užití, aneb jak je to s číslováním pořadí případů užití
Třetí část odpovědi na mail ohledně zpracování případů užití, aneb jak je to s číslováním pořadí případů užití autor RNDr. Ilja Kraval leden 2008 www.objects.cz Úvod Tento článek navazuje jako pokračování
VíceJedna z velmi častých a závažných chyb při návrhu IS aneb jak vznikají tzv. molochální systémy
Jedna z velmi častých a závažných chyb při návrhu IS aneb jak vznikají tzv. molochální systémy Část druhá autor RNDr. Ilja Kraval, http://www.objects.cz červenec 2006 (pozn.: článek navazuje na první část
VíceDruhá část odpovědi na mail ohledně zpracování případů užití
Druhá část odpovědi na mail ohledně zpracování případů užití Autor RNDr. Ilja Kraval leden 2008 www.objects.cz Úvod Tento článek navazuje jako pokračování na článek předešlý. Minule jsme si vysvětlili,
VíceVzor OBSERVER a jeho zajímavá varianta v kombinaci se vzorem ADAPTER Část 2
Vzor OBSERVER a jeho zajímavá varianta v kombinaci se vzorem ADAPTER Část 2 autor RNDr. Ilja Kraval, http://www.objects.cz únor 2007 firma Object Consulting s.r.o. Úvod V předešlé části článku jsme si
VíceVYHLEDÁVÁNÍ PRVKŮ ACTOR A PROCESNÍ MODELOVÁNÍ
VYHLEDÁVÁNÍ PRVKŮ ACTOR A PROCESNÍ MODELOVÁNÍ Část 3 Tento článek je pokračováním předešlých článků RNDr. Ilja Kraval, duben 2009 http://www.objects.cz ÚVOD V předešlých článcích jsme se seznámili s použitím
VíceŠumperský efekt rozmnožení případů užití
Šumperský efekt rozmnožení případů užití Ilja Kraval, 2007 http://www.objects.cz Článek pojednává o jednom velmi nepříjemném efektu bobtnání projektu. 1. Odhad velikosti a rozsahu informačního systému
VíceOdpověď na dotaz ohledně asociační třídy v modelu měření
Odpověď na dotaz ohledně asociační třídy v modelu měření Část 3. Tento článek navazuje na předešlé články jako jejich pokračování autor RNDr. Ilja Kraval, http://www.objects.cz srpen 2007 firma Object
VíceJEDNODUCHÁ A PRAKTICKÁ METODA ODHADU PRACNOSTI PROJEKTU (S UTILITOU KE STAŽENÍ ZDARMA)
JEDNODUCHÁ A PRAKTICKÁ METODA ODHADU PRACNOSTI PROJEKTU (S UTILITOU KE STAŽENÍ ZDARMA) 2. část autor: RNDr. Ilja Kraval, červenec 2010 http://www.objects.cz ÚVOD V minulém článku bylo pojednáno o složitosti
VíceČtvrtá část odpovědi aneb jak je to vlastně s interakcí <<include>>
Čtvrtá část odpovědi aneb jak je to vlastně s interakcí autor RNDr. Ilja Kraval leden 2008 www.objects.cz Úvod Tento článek navazuje jako pokračování na články předešlé. Minule jsme si zde
VícePrincipy OOP při tvorbě aplikací v JEE. Michal Čejchan
Principy OOP při tvorbě aplikací v JEE Michal Čejchan Témata přednášky Principy OOP - připomenutí Úvod - co nás vede k používání OOP Reálný svět - jak (ne)používáme OOP Nedostatky na úrovni programovacích
VíceÚvod do objektově orientovaného programování s použitím jazyka C# pro střední školy
Úvod do objektově orientovaného programování s použitím jazyka C# pro střední školy Učebnice je určena pro střední školy k volnému šíření (FREE) autor RNDr. Ilja Kraval, 2006-2007, www.objects.cz Tato
VícePB161 Programování v jazyce C++ Přednáška 7
PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z
VícePB161 Programování v jazyce C++ Přednáška 7
PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z
VíceÚvod do programovacího jazyka Python
Úvod do programovacího jazyka Python Co je to Python? Python je objektově orientovaný programovací jazyk, který se může využít v mnoha oblastech vývoje softwaru. Nabízí významnou podporu k integraci s
VíceÚvod do programovacího jazyka Python
Úvod do programovacího jazyka Python Co je to Python? Python je objektově-orientovaný programovací jazyk. Tento programovací jazyk je velice výkonný, čitelný a dá se snadno naučit. Jeho použití je velice
VíceProblém identity instancí asociačních tříd
Problém identity instancí asociačních tříd Autor RNDr. Ilja Kraval Ve školeních a také následně po jejich ukončení se stále častěji objevují dotazy, které se týkají tzv. identity instancí asociační třídy.
VíceÚvod do principů objektově orientovaného programování
OBSAH DISTANČNÍHO E-LEARNINGOVÉHO KURZU PROFESNÍ RŮST ANALYTIKA OD ZÁKLADŮ (BASE) ÚVOD DO TECHNOLOGIÍ INFORMAČNÍCH SYSTÉMŮ Jak funguje počítač na základní úrovni Základy HTML Skripty ve webovských technologiích
VíceVýběr báze. u n. a 1 u 1
Výběr báze Mějme vektorový prostor zadán množinou generátorů. To jest V = M, kde M = {u,..., u n }. Pokud je naším úkolem najít nějakou bázi V, nejpřímočařejším postupem je napsat si vektory jako řádky
VíceHromadná korespondence
Hromadná korespondence Teoretická část: Typickým příkladem použití hromadné korespondence je přijímací řízení na školách. Uchazeči si podají přihlášku, škola ji zpracuje a připraví zvací dopis k přijímací
VíceKurz Postupy návrhu IS pomocí UML a OOP (5 dnů, in-house)
Kurz Postupy návrhu IS pomocí UML a OOP (5 dnů, in-house) přednáší RNDr. Ilja Kraval pořádá firma OBJECT CONSULTING Obsah: Kurz Efektivní postupy návrhu IS pomocí UML a OOP (5 dnů, in-house)... 1 1. Jak
VíceDelphi - objektově orientované
Kapitola 6 Delphi - objektově orientované programování Objektově orientované programování (zkracováno na OOP, z anglického Object oriented programming) je metodika vývoje softwaru, založená na těchto myšlenkách,
VíceVyřešené teoretické otázky do OOP ( )
Vyřešené teoretické otázky do OOP (16. 1. 2013) 1) Vyjmenujte v historickém pořadí hlavní programovací paradigmata a stručně charakterizujte každé paradigma. a) Naivní chaotičnost, špatná syntaxe a sémantika
VíceIB111 Programování a algoritmizace. Programovací jazyky
IB111 Programování a algoritmizace Programovací jazyky Programovací jazyky Programovací jazyk Prostředek pro zápis algoritmů, jež mohou být provedeny na počítači Program Zápis algoritmu v programovacím
VíceTÉMATICKÝ OKRUH Softwarové inženýrství
TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 24. Otázka : Implementační fáze. Postupy při specifikaci organizace softwarových komponent pomocí UML. Mapování modelů na struktury programovacího
Více10 Balíčky, grafické znázornění tříd, základy zapozdření
10 Balíčky, grafické znázornění tříd, základy zapozdření Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům balíčkům, grafickému
VíceUnity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.
Unity a Objekty Programování 2 (NMIN102) RNDr. Michal Žemlička, Ph.D. Větší programy Časté problémy: Ve více programech by se nám hodilo využít stejné řešení nějakého podproblému dalo by se vyřešit překopírováním
VíceAnalýza a Návrh. Analýza
Analysis & Design Návrh nebo Design? Design = návrh Není vytváření použitelného uživatelského prostředí (pouze malinká podmnožina celého návrhu) Často takto omezeně chápáno studenty nedokáží si představit,
VíceProgramujeme v softwaru Statistica
Programujeme v softwaru Statistica díl třetí Newsletter Statistica ACADEMY Téma: Programování, makra, skripty Typ článku: Návody V předchozích článcích (díl první, díl druhý) jsme si osvětlili základní
VícePolymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března
Polymorfismus Cíle lekce Cílem lekce je vysvětlit význam pojmu polymorfismus jako základní vlastnosti objektově orientovaného programování. Lekce objasňuje vztah časné a pozdní vazby a jejich využití.
VíceTypy souborů ve STATISTICA. Tento článek poslouží jako přehled hlavních typů souborů v programu
StatSoft Typy souborů ve STATISTICA Tento článek poslouží jako přehled hlavních typů souborů v programu STATISTICA, ukáže Vám jejich možnosti a tím Vám dovolí využívat program efektivněji. Jistě jste již
VíceKolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín
Kolekce ArrayList napsal Pajclín Tento článek jsem se rozhodl věnovat kolekci ArrayList, protože je to jedna z nejpoužívanějších. Tento článek není kompletním popisem třídy ArrayList, ale budu se snažit
VíceStatické proměnné a metody. Tomáš Pitner, upravil Marek Šabo
Statické proměnné a metody Tomáš Pitner, upravil Marek Šabo Úvod Se statickou metodou jsme se setkali už u úplně prvního programu - Hello, world! public class Demo { public static void main(string[] args)
VíceÚloha - rozpoznávání číslic
Úloha - rozpoznávání číslic Vojtěch Franc, Tomáš Pajdla a Tomáš Svoboda http://cmp.felk.cvut.cz 27. listopadu 26 Abstrakt Podpůrný text pro cvičení předmětu X33KUI. Vysvětluje tři způsoby rozpoznávání
VíceFunkcionální programování. Kristýna Kaslová
Funkcionální programování Kristýna Kaslová Historie Alonzo Church (30. léta) Netypovaný lambda kalkul Základ prvních funkcionálních jazyků Jeho konstrukce i v mnoha současných programovacích jazycích (Python)
VíceProjekt Obrázek strana 135
Projekt Obrázek strana 135 14. Projekt Obrázek 14.1. Základní popis, zadání úkolu Pracujeme na projektu Obrázek, který je ke stažení na http://java.vse.cz/. Po otevření v BlueJ vytvoříme instanci třídy
VíceZdroje chyb. Absolutní a relativní chyba. Absolutní chyba. Absolutní chyba přibližného čísla a se nazývá absolutní hodnota rozdílu přesného
Zdroje chyb. Absolutní a relativní chyba. Absolutní chyba Absolutní chyba přibližného čísla a se nazývá absolutní hodnota rozdílu přesného čísla A a přibližného čísla a = A a. Je třeba rozlišovat dva případy:
VícePHP PHP je skriptovací programovací jazyk dynamických internetových stránek PHP je nezávislý na platformě
PHP PHP původně znamenalo Personal Home Page a vzniklo v roce 1996, od té doby prošlo velkými změnami a nyní tato zkratka znamená Hypertext Preprocessor. PHP je skriptovací programovací jazyk, určený především
VícePB161 Programování v jazyce C++ Přednáška 4
PB161 Programování v jazyce C++ Přednáška 4 Přetěžování funkcí Konstruktory a destruktory Nikola Beneš 9. října 2017 PB161 přednáška 4: přetěžování funkcí, konstruktory, destruktory 9. října 2017 1 / 20
VíceKlasické metodiky softwarového inženýrství I N G M A R T I N M O L H A N E C, C S C. Y 1 3 A N W
Klasické metodiky softwarového inženýrství I N G M A R T I N M O L H A N E C, C S C. Y 1 3 A N W Osnova přednášky Co to je softwarové inženýrství Softwarový proces Metodika a metoda Evoluce softwarových
VíceTÉMATICKÝ OKRUH Softwarové inženýrství
TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 29. Otázka : Zpracování událostí: mechanismus událostí a jejich zpracování (Event/Listener), nepřímá invokace (Observer/Observable). Obsah : 1. Mechanisums
VíceLokální definice (1) plocha-kruhu
Lokální definice (1) syntaxe: (local (seznam definic) výraz) definice jsou dostupné pouze uvnitř příkazu local příklad: (local ( (define Pi 3.1415926) (define (plocha-kruhu r) (* Pi r r)) ) (plocha-kruhu
VíceAplikované úlohy Solid Edge. SPŠSE a VOŠ Liberec. Radek Havlík [ÚLOHA 40 PODSESTAVY]
Aplikované úlohy Solid Edge SPŠSE a VOŠ Liberec Radek Havlík [ÚLOHA 40 PODSESTAVY] 1 CÍL KAPITOLY Cílem této kapitoly je naučit se tvořit pracovat s podsestavami v CAD softwaru SolidEdge. Podsestavy se
VíceAplikační vrstva. Úvod do Php. Ing. Martin Dostal
Aplikační vrstva Úvod do Php Ing. Martin Dostal Co to je PHP? php soubory se nekompilují, interpret je spouští přímo bez překladu php běží na serveru php soubor je.txt soubor obsahující php kód: Zkrácený
VíceProgramování II. Abstraktní třída Vícenásobná dědičnost 2018/19
Programování II Abstraktní třída Vícenásobná dědičnost 2018/19 Osnova přednášky Polymorfismus - důsledky. Abstraktní třída. Vícenásobná dědičnost. Polymorfismus - důsledky Polymorfismus Polymorfismus je
Více2. Modelovací jazyk UML 2.1 Struktura UML 2.1.1 Diagram tříd 2.1.1.1 Asociace 2.1.2 OCL. 3. Smalltalk 3.1 Jazyk 3.1.1 Pojmenování
1. Teoretické základy modelování na počítačích 1.1 Lambda-kalkul 1.1.1 Formální zápis, beta-redukce, alfa-konverze 1.1.2 Lambda-výraz jako data 1.1.3 Příklad alfa-konverze 1.1.4 Eta-redukce 1.2 Základy
VíceLekce 12 Animovaný náhled animace kamer
Lekce 12 Animovaný náhled animace kamer Časová dotace: 2 vyučovací hodina V poslední lekci tohoto bloku se naučíme jednoduše a přitom velice efektivně animovat. Budeme pracovat pouze s objekty, které jsme
VíceDUM 06 téma: Tvorba makra pomocí VBA
DUM 06 téma: Tvorba makra pomocí VBA ze sady: 03 tematický okruh sady: Tvorba skript a maker ze šablony: 10 Algoritmizace a programování určeno pro: 4. ročník vzdělávací obor: 18-20-M/01 Informační technologie
VíceSynchronizace CRM ESO9 a MS Exchange
Synchronizace CRM ESO9 a MS Exchange Zpracoval: U Mlýna 2305/22, 141 Praha 4 Záběhlice Dne: 1.4.2015 tel.: +420 585 203 370-2 e-mail: info@eso9.cz Revize: Urych Tomáš www.eso9.cz Dne: 23.2.2016 Obsah 1.
VíceJak funguje element deep history v UML
Jak funguje element deep history v UML autor RNDr. Ilja Kraval, http://www.objects.cz březen 2007 firma Object Consulting s.r.o. Úvod Již několikrát jsem v internetových diskusích a při školeních narazil
Více1 Linearní prostory nad komplexními čísly
1 Linearní prostory nad komplexními čísly V této přednášce budeme hledat kořeny polynomů, které se dále budou moci vyskytovat jako složky vektorů nebo matic Vzhledem k tomu, že kořeny polynomu (i reálného)
VíceDerivace funkcí více proměnných
Derivace funkcí více proměnných Pro studenty FP TUL Martina Šimůnková 16. května 019 1. Derivace podle vektoru jako funkce vektoru. Pro pevně zvolenou funkci f : R d R n a bod a R d budeme zkoumat zobrazení,
VíceMATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ
MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE
VíceEPLAN Electric P8 2.7 s databázemi na SQL serveru
EPLAN Electric P8 2.7 s databázemi na SQL serveru EPLAN Electric P8 2.7 k dispozici pouze ve verzi 64bit. EPLAN Electric P8 využívá k ukládání některých dat databáze. Artikly, překladový slovník 1 ) a
VíceRedakční systém Joomla. Prokop Zelený
Redakční systém Joomla Prokop Zelený 1 Co jsou to red. systémy? Redakční systémy (anglicky Content Management System - CMS) jsou webové aplikace používané pro snadnou správu obsahu stránek. Hlavním cílem
VíceMatice přechodu. Pozorování 2. Základní úkol: Určete matici přechodu od báze M k bázi N. Každou bázi napíšeme do sloupců matice, např.
Matice přechodu Základní úkol: Určete matici přechodu od báze M k bázi N. Každou bázi napíšeme do sloupců matice, např. u příkladu 7 (v ) dostaneme: Nyní bychom mohli postupovat jako u matice homomorfismu
VíceNávrh IS - UML. Jaroslav Žáček
Návrh IS - UML Jaroslav Žáček jaroslav.zacek@osu.cz http://www1.osu.cz/~zacek/ Trochu historie neuškodí Do roku 1994 chaos ve světě objektově orientovaných metod (několik jazyků pro vizuální modelování,
Vícewww.iskola.cz příručka modulu docházka v systém iškola.cz Adresa naší školy: www.iskola.cz/
www.iskola.cz příručka modulu docházka v systém iškola.cz Adresa naší školy: www.iskola.cz/ Verze této příručky: 1.000 Aktuální verzi této příručky, popisující nejnovější možnosti serveru www.iskola.cz
VícePHP framework Nette. Kapitola 1. 1.1 Úvod. 1.2 Architektura Nette
Kapitola 1 PHP framework Nette 1.1 Úvod Zkratka PHP (z anglického PHP: Hypertext Preprocessor) označuje populární skriptovací jazyk primárně navržený pro vývoj webových aplikací. Jeho oblíbenost vyplývá
VíceVytvoření.NET komponenty (DLL) ve Visual Studiu
Jak vytvořit.net komponentu (DLL, COM Class) pro Excel? A proč? A co k tomu budeme potřebovat? Velký Visual Basic (dnes VB.NET) se rozešel s Visual Basicem pro aplikace (VBA) před cca 16 lety. A i když
VíceJE TŘEBA DBÁT NA ANONYMITU KLIENTA NEBO NE?
JE TŘEBA DBÁT NA ANONYMITU KLIENTA NEBO NE? RNDr. Ilja Kraval, říjen 2008 http://www.objects.cz ÚVOD Začnu jedním zajímavým postřehem: Na našich školeních OOP a UML existují určitá témata, která při jejich
VíceRobot BBC Micro:bit kódovaní v PXT Editoru
Robot BBC Micro:bit kódovaní v PXT Editoru Ze softwarového hlediska je robot dálkově ovládaný. Skládá se z kódu běžícího na BBC mikro:bit a aplikace nazvané micro:bit blue. Běží na Androidech, smartphonech
VíceQuestionnaire příručka uživatele
Questionnaire příručka uživatele Obsah: K čemu aplikace slouží? Popis funkcí Návod k použití o Úvodní dialogové okno o Pro respondenty o Pro administrátory K čemu aplikace slouží? Program questionnaire
VíceProgramování II. Polymorfismus
Programování II Polymorfismus Osnova přednášky Vztah přetížení, překrytí a protected přístupu. Co je polymorfismus? Příklad. Přetížení, překrytí, protected Přetížení x překrytí Přetížením řešíme doplnění
Více6. Příkazy a řídící struktury v Javě
6. Příkazy a řídící struktury v Javě Příkazy v Javě Příkazy v Javě Řídicí příkazy (větvení, cykly) Přiřazovací příkaz = Řízení toku programu (větvení, cykly) Volání metody Návrat z metody - příkaz return
VíceVztah typu Extend v UML a jeho zvláštnosti
Vztah typu Extend v UML a jeho zvláštnosti RNDr. Ilja Kraval 2007 Object Consulting s.r.o. http://www.objects.cz objects@objects.cz Do diskusního fóra na Pandoře (http://pandora.idnes.cz/conference/objcon/)
Vícefakulty MENDELU v Brně (LDF) s ohledem na disciplíny společného základu http://akademie.ldf.mendelu.cz/cz (reg. č. CZ.1.07/2.2.00/28.
Základy lineárního programování Vyšší matematika, Inženýrská matematika LDF MENDELU Podpořeno projektem Průřezová inovace studijních programů Lesnické a dřevařské fakulty MENDELU v Brně (LDF) s ohledem
VíceKoncept řešení EOS EVIDENCE ORGANIZAČNÍ STRUKTURY
Koncept řešení EOS komplexní řešení informačních systémů EVIDENCE ORGANIZAČNÍ STRUKTURY Městský rok informatiky v Olomouci Datum: 12.6. 2009 MARBES CONSULTING s.r.o. Brojova 16, 326 00 Plzeň Jaroslav PEROUTKA
VíceProgramování II. Dědičnost změna chování 2018/19
Programování II Dědičnost změna chování 2018/19 Osnova přednášky Rozšíření chování. Změna chování. Příklad. Rozšíření chování Když rozšiřujeme chování Můžeme bezpečně použít to, co už máme. Nehrozí žádný
VíceModul msender message Sender. Brána do světa SMS zpráv a E-mail obchodní komunikace
Modul msender message Sender Brána do světa SMS zpráv a E-mail obchodní komunikace Představení modulu msender je samostatně prodávaným modulem a rozšiřujícím doplňkem informačního systému Money S5. msender
Více4. Rekurze. BI-EP1 Efektivní programování Martin Kačer
4. Rekurze BI-EP1 Efektivní programování 1 ZS 2011/2012 Ing. Martin Kačer, Ph.D. 2010-11 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické v Praze
VíceKritéria hodnocení praktické maturitní zkoušky z databázových systémů
Kritéria hodnocení praktické maturitní zkoušky z databázových systémů Otázka č. 1 Datový model 1. Správně navržený ERD model dle zadání max. 40 bodů teoretické znalosti konceptuálního modelování správné
VíceTechnologické postupy práce s aktovkou IS MPP
Technologické postupy práce s aktovkou IS MPP Modul plánování a přezkoumávání, verze 1.20 vypracovala společnost ASD Software, s.r.o. dokument ze dne 27. 3. 2013, verze 1.01 Technologické postupy práce
VíceDefinice. Vektorový prostor V nad tělesem T je množina s operacemi + : V V V, tj. u, v V : u + v V : T V V, tj. ( u V )( a T ) : a u V které splňují
Definice. Vektorový prostor V nad tělesem T je množina s operacemi + : V V V, tj. u, v V : u + v V : T V V, tj. ( u V )( a T ) : a u V které splňují 1. u + v = v + u, u, v V 2. (u + v) + w = u + (v + w),
VíceJak testovat software v praxi. aneb šetříme svůj vlastní čas
Jak testovat software v praxi aneb šetříme svůj vlastní čas Proč testy nepíšeme Nemáme na to čas Platí v cca 5% případů Nový projekt Prototyp je třeba mít během pár dní Počítá se s tím, že další verze
VícePOČÍTAČE A PROGRAMOVÁNÍ
POČÍTAČE A PROGRAMOVÁNÍ Moderní metody vývoje softwaru, Demontrační příklad piškvorky Miroslav Vavroušek PPI 09 V1.0 Opakovaní z minulé přednášky Vícerozměrná statická a dynamická pole Pole polí Datový
VíceNávrh IS - UML. Jaroslav Žáček
Návrh IS - UML Jaroslav Žáček jaroslav.zacek@osu.cz http://www1.osu.cz/~zacek/ UML UML není metodikou ani programovacím jazykem, je to pouze vizuální modelovací nastroj pro objektově orientované systémy.
VíceARITMETICKÉ OPERACE V BINÁRNÍ SOUSTAVĚ
Sčítání binárních čísel Binární čísla je možné sčítat stejným způsobem, jakým sčítáme čísla desítková. Příklad je uveden v tabulce níže. K přenosu jedničky do vyššího řádu dojde tehdy, jeli výsledkem součtu
VíceVýchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo
Výchozí a statické metody rozhraní Tomáš Pitner, upravil Marek Šabo Výchozí a statické metody rozhraní Java 8 přidává ohledně metod v rozhraní nové možnosti. Neuvidíme je tedy ve starém kódu a mnozí vývojáři
Vícepřetížení operátorů (o)
přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního
VíceVstupní požadavky, doporučení a metodické pokyny
Název modulu: Základy PHP Označení: C9 Stručná charakteristika modulu Modul je orientován na tvorbu dynamických stánek aktualizovaných podle kontextu volání. Jazyk PHP umožňuje velmi jednoduchým způsobem
VíceVyužití OOP v praxi -- Knihovna PHP -- Interval.cz
Page 1 of 6 Knihovna PHP Využití OOP v praxi Po dlouhé teorii přichází na řadu praxe. V následujícím textu si vysvětlíme možnosti přístupu k databázi pomocí různých vzorů objektově orientovaného programování
VíceVýčtový typ strana 67
Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce
VíceLDF MENDELU. Simona Fišnarová (MENDELU) Základy lineárního programování VMAT, IMT 1 / 25
Základy lineárního programování Vyšší matematika, Inženýrská matematika LDF MENDELU Podpořeno projektem Průřezová inovace studijních programů Lesnické a dřevařské fakulty MENDELU v Brně (LDF) s ohledem
VíceObjektově orientované programování v jazyce Python
Objektově orientované programování v jazyce Python Co to je objektově orientované programování Python není přímo objektově orientovaný jazyk, ale podporuje nejdůležitější části objektově orientovaného
VícePříspěvkové organizace PAP (pomocný analytický přehled)
Příspěvkové organizace PAP (pomocný analytický přehled) Návod 5.8.2016 Kocourkova Petra Bc. Datum tisku 12.9.2016 2 Příspěvkové organizace PAP (pomocný analytický přehled) Příspěvkové organizace PAP (pomocný
Více3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda
1. Lze vždy z tzv. instanční třídy vytvořit objekt? 2. Co je nejčastější příčinou vzniku chyb? A. Specifikace B. Testování C. Návrh D. Analýza E. Kódování 3. Je defenzivní programování technikou skrývání
VíceRegistrační číslo projektu: CZ.1.07/1.5.00/34.0553 Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost
Registrační číslo projektu: CZ.1.07/1.5.00/34.0553 Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost Projekt je realizován v rámci Operačního programu Vzdělávání pro konkurence
VíceŘízení reálných projektů, agilní metodiky
Agent Technology Group Katedra kybernetiky Fakulta elektrotechnická - České vysoké učení technické Praha, 2009 Osnova Lze vyvíjet software bez metodiky? - bohužel ano menší komerční firmy (zejména vývoj
VíceProgramujeme v softwaru Statistica
Programujeme v softwaru Statistica díl druhý Newsletter Statistica ACADEMY Téma: Programování, makra, skripty Typ článku: Návody V tomto článku si ukážeme další možnosti při psaní maker v softwaru Statistica.
VíceSTŘEDNÍ ŠKOLA INFORMAČNÍCH TECHNOLOGIÍ A SOCIÁLNÍ PÉČE
STŘEDNÍ ŠKOLA INFORMAČNÍCH TECHNOLOGIÍ A SOCIÁLNÍ PÉČE WEBOWÉ STRÁNKY TŘÍD KAMIL POPELKA ZÁVĚREČNÁ MATURITNÍ PRÁCE BRNO 2011 Prohlášení Prohlašuji, že maturitní práce je mým původním autorským dílem, které
Více12. Lineární programování
. Lineární programování. Lineární programování Úloha lineárního programování (lineární optimalizace) je jedním ze základních problémů teorie optimalizace. Našim cílem je nalézt maximum (resp. minimum)
VíceV 70. letech výzkumy četnosti výskytu instrukcí ukázaly, že programátoři a
1 Počítače CISC a RISC V dnešní době se ustálilo dělení počítačů do dvou základních kategorií podle typu použitého procesoru: CISC - počítač se složitým souborem instrukcí (Complex Instruction Set Computer)
VíceDatabáze I. 4. přednáška. Helena Palovská
Databáze I 4. přednáška Helena Palovská palovska@vse.cz Mapování ER modelu do relačního DB schématu Od 80. let 20. stol. znám algoritmus, implementován v CASE nástrojích Rutinní postup s volbami rozhodnutí
Více