Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Strategy. Motivace Ze života - jak to taky může vypadat (R): source("../algorithms/HOCForLOCF.R") source("../algorithms/HOCForLOCFv2.R") source("../MILP/MILP.R")

Podobné prezentace


Prezentace na téma: "Strategy. Motivace Ze života - jak to taky může vypadat (R): source("../algorithms/HOCForLOCF.R") source("../algorithms/HOCForLOCFv2.R") source("../MILP/MILP.R")"— Transkript prezentace:

1 Strategy

2 Motivace Ze života - jak to taky může vypadat (R): source("../algorithms/HOCForLOCF.R") source("../algorithms/HOCForLOCFv2.R") source("../MILP/MILP.R") runScheduler <- function(input, "parameters") { if (algorithm == "HOCF" || algorithm == "LOCF" ) { result <- LOCForHOCF("parameters") } else if (algorithm == "HOCFv2" || algorithm == "LOCFv2" ){ preprocessed <- preprocess(input) result <- LOCForHOCFv2(preprocessed, "parameters") } else if (algorithm == "MILP" || algorithm == "LP_Heuristic" ){ preprocessed <- MILP_preprocess(input) result<- MILP(preprocessed, "parameters") } else { return(NULL) } return (result) }

3 Motivace ■ Různé algoritmy pro stejnou akci ■ Hromada kódu v mnoha podmínkách ■ Důsledky ❑ Komplexnost ❑ Špatná čitelnost ❑ Těžká správa kódu ❑ Těžka rozšiřitelnost trvá si to pročíst ještě déle trvá to upravit a když to ještě potřebujeme rozšířit...

4 Motivace (konkrétně) ■ Jak z toho ven? public interface Ialgorithm { ResultClass runAlgorithm(InputClass input,int flags) } public class HOCF: Ialgorithm { InputClass preprocess(InputClass input) {/*preprocessing*/} public OutputClass runAlgorithm(InputClass input,int flags) { var processedInput = preprocess(input); /*compute what needs to be computed*/ return result; } static void Main(string[] args) { var factory = new AlgorithmFactory(); Ialgorithm toRun = factory.getAlgorithm("HOCF"); result = toRun.runAlgorithm(/*input*/); }

5 Strategy pattern ■ Strategy - behavioral pattern ■ Kdy je použití strategie vhodné ❑ Používáme více algoritmů nad stejnými daty ❑ Máme různé implementace téhož algoritmu ❑ Chceme mít možnost měnit chování dynamicky ❑ Potřebujeme skrýt detaily a datové struktury implementace ■ Zapouzdřuje algoritmy ze společné rodiny ❑ ukládání do různych formátů ❑ operace nad obrazem ❑ chování AI ve hrách v závislosti na obtížnosti/rase

6 Struktura ■ Účastníci ❑ Strategy ■ Interface, definuje rozhraní společné všem algoritmům ❑ ConcreteStrategy ■ Implementace konkrétního algoritmu - strategie ❑ Context ■ Je mu nastaven ConcreteStrategy objekt ■ Spravuje referenci na Strategy objekt ■ Může zpřístupňovat data/API konkrétním ConcreteStrategy objektům

7 Implementace – příklad (C#) ■ Strategická hra a chováni jednotek public interface IDifficulty { void pickAction(ContextClass context); } public class EasyDifficulty: IDifficulty { public void pickAction(ContextClass context) { //wait patiently untill defeated } public class HardDifficulty: IDifficulty { public void pickAction(ContextClass context) { //fight for every inch } public class NightmareDiff: IDifficulty { public void pickAction(ContextClass context) { //cheat for unlimited resources } public class Enemy { IDifficulty difficulty; String race; public Enemy(String race) { this.race = race; } public void setDifficulty(IDifficulty level) { this.difficulty = level; } public void gameTurn() { //... difficulty.pickAction(context); //... } Rodina strategií Kontext

8 Implementace – příklad (C#) ■ Klientský kód public class Main { public static void main(String[] args) { Enemy[] enemies = new Enemy[] { new Enemy("Terran"), new Enemy("Zerg"), new Enemy("Protoss") }; enemies[0].setDifficulty(new EasyDifficulty()); enemies[1].setDifficulty(new HardDifficulty()); enemies[2].setDifficulty(new NightmareDiff()); foreach (var e in enemies) e.gameTurn(); enemies[0].setDifficulty(new NightmareDiff()); enemies[1].setDifficulty(new EasyDifficulty()); foreach (var e in enemies) e.gameTurn(); } Operuje jenom na Kontextu Určuje Strategii Kontextu

9 Implementace pomocí delegátů (C#) class Enemy { public delegate void Action(Difficulty); Action pickAction; public void setDifficulty(Difficulty level) { pickAction = level; } public static void Main(String[] args) { var e1 = new Enemy("protoss"); e1.setDifficulty( (Context context) => { /*do something*/ }); } v případě, že algoritmus není příliš složitý/nepotřebuje si uchovávat data

10 Implementace pomocí šablony (C++) ■ Strategie jako parametr šablony ❑ Kdy? ■ Strategie je známa již v době překladu ■ Nemění se za běhu programu ❑ Výhody ■ Není třeba definovat abstraktní třídu ■ Strategie spojena s kontextem během kompilace – vyšší efektivita template class Context { public: void Operation() { s_.execute(); } private: Strategy s_; }; class MyStrategy { public: void execute(); }; Context myContext;

11 Implementace ■ Jak předat kontext strategii? ❑ Předání kontextových dat v parametrech metody ■ Mohou se předávat data, které daná strategie nepotřebuje ■ Spousta parametrů, na které musíme myslet. ❑ Předání reference na kontext strategii ■ Strategie přistupuje jen k datům, které potřebuje ■ Kontext musí být se strategií lépe provázaný a rozhraní musí být dobře navržené. ■ Strategie může být pro kontextovou třídu volitelná ❑ Defaultní Strategie ❑ Pokud uživatel nechce, nemusí nic nastavovat

12 Vlastnosti ■ Výhody ❑ Zapouzdření algoritmu ❑ Převod výběru algoritmu (switch/if) na dědičnost ❑ Rozšiřitelnost chování ❑ Konkrétní chování lze určit za běhu ■ Nevýhody ❑ Overhead ❑ Klient musí umět vybrat strategii

13 ■ Použití v praxi ❑ GUI ■ Validace formulářových prvků ■ Layout manager – různé algoritmy pro layout prvků ❑ Úprava obrazu ■ Různé operace nad obrazem ❑ Třídění ■ Možnost vybírat strategii třídění dle okolností ❑ Komprese dat ■ Různé metody komprese dat ❑ Obecně ■ Nahrávání, ukládání a generování výsledků v různých formátech ■ Operace výstupu (konzole, soubor, síť…) ■ Použití optimalizovaných implementací dle prostředí (např. pomocí Factory metody) šéf: „Chceme, aby aplikace dělala to a tamto, ale ješte to není úplně jisté a může se to v budoucnu změnit…“ Aplikace

14 Související návrhové vzory - State

15 Související návrhové vzory ■ State ❑ Chování určeno stavem ❑ Stav se může měnit implicitně, Strategii mění uživatel ■ Template method ❑ Template method používá dědičnost pro změnu části algoritmu ❑ Strategy používá delegaci pro změnu celého algoritmu ■ Flyweight ❑ Pokud používáme velké množství Strategií, které si nedrží stav, můžeme použít Flyweight

16 KONEC


Stáhnout ppt "Strategy. Motivace Ze života - jak to taky může vypadat (R): source("../algorithms/HOCForLOCF.R") source("../algorithms/HOCForLOCFv2.R") source("../MILP/MILP.R")"

Podobné prezentace


Reklamy Google