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

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

Strategy „Definujte rodinu algoritmů, zapouzdřuje je aby byly vzájemně zaměnitelné. Strategie umožňuje, aby se algoritmus nebyl závislý na klientech, kteří.

Podobné prezentace


Prezentace na téma: "Strategy „Definujte rodinu algoritmů, zapouzdřuje je aby byly vzájemně zaměnitelné. Strategie umožňuje, aby se algoritmus nebyl závislý na klientech, kteří."— Transkript prezentace:

1 Strategy „Definujte rodinu algoritmů, zapouzdřuje je aby byly vzájemně zaměnitelné. Strategie umožňuje, aby se algoritmus nebyl závislý na klientech, kteří jej používají.“ 1

2 Motivace - Takhle to může začít
Ještě není třeba implementovat strategy public Output RunScheduler( string algorithm, Input parameter)          {       if (algorithm == "HOCF" || algorithm == "LOCF")                      return LOCForHOCF(parameter);                           if (algorithm == "HOCFv2" || algorithm == "LOCFv2")             {                  var preprocessed = LOCForHOCFv2_preprocess(parameter); return LOCForHOCFv2(preprocessed);              }              return null;          } public Output LOCForHOCF(Input parameter) { /*…*/} public Output LOCForHOCFv2(InputPrep prep) public InputPrep LOCForHOCFv2_preprocess (Input parameter)

3 Motivace – Takhle to pokračuje
Přidám další... Je to jen jedna větev public Output LOCForHOCF(Input parameter) { /*…*/} public Output LOCForHOCFv2(InputPrep prep) public InputPrep LOCForHOCFv2_preprocess (Input parameter) public Output MILP (InputPrep2 prep) public InputPrep2 MILP_preprocess(Input parameter) public Output RunScheduler(string algorithm, Input parameter)          {       if (algorithm == "HOCF" || algorithm == "LOCF")                      return LOCForHOCF(parameter);                           if (algorithm == "HOCFv2" || algorithm == "LOCFv2")             {                  var preprocessed = LOCForHOCFv2_preprocess(parameter); return LOCForHOCFv2(preprocessed);              } if (algorithm == "MILP" || algorithm == "LP_Heuristic")        var preprocessed = MILP_preprocess(parameter); return MILP(preprocessed);              }              return null;         

4 Vlastnosti takového kódu
Komplexní kód Špatná čitelnost Těžká správa kódu Těžka rozšiřitelnost Důsledky Zkrátka to porušuje

5 Motivace – Teď už je čas to změnit
...za nějaký čas v TFS

6 Motivace – Případně už od začátku
„Chceme, aby aplikace dělala to a tamto, ale ješte to není úplně jisté a může se to v budoucnu změnit…“

7 Strategy pattern Strategy - behavioral pattern Vhodné když
Používáme více algoritmů nad stejnými daty Máme různé implementace téhož algoritmu Chceme měnit chování dynamicky Hromada kódu v mnoha podmínkách Zapouzdřuje algoritmy ze společné rodiny Open/closed principle Otevřená pro rozšíření, uzavřená pro modifikaci Vyhýbat se abstraktním třídám

8 Struktura Účastníci Strategy ConcreteStrategy Context
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

9 Strategy Jak z toho ven? public interface IAlgorithm {
ResultClass RunAlgorithm(InputClass input);       } public class HOCF : IAlgorithm {              CustomInputClass preprocess(InputClass input)  {/*preprocessing*/}    public OutputClass RunAlgorithm(InputClass input) { var processedInput = preprocess(input); /*compute what needs to be computed*/ return result;              }          } public class Scheduler : IScheduler{    public OutputClass runScheduler (string algName, InputClass input){          var processedInput = AlgFactory.Get(algName); return Algorithm.RunAlgorithm(input);              }          }

10 Strategy Ještě trochu lépe (Dependency injection)
public class Scheduler : IScheduler{              /*dovoluje změnit strategii za běhu*/ public IAlgorithm Algorithm {get; set;}              public Shceduler(IAlgorithm alg){                  Algorithm  = alg;              }              public OutputClass runScheduler(InputClass input){                  return Algorithm.RunAlgorithm(input);              }          } public class Caller{              private IAlgorithmFactory _algorithmFactory;              private IScheduler _scheduler;              public Scheduler(IAlgorithmFactory algFac , IScheduler sched){ /*nastavení fieldů*/ }              public OutputClass Do(string algorithmName, InputClass input){      var alg = _algorithmFactory.Get(algorithmName); _scheduler=new Scheduler(alg); return _scheduler.RunScheduler(input);              }          }

11 Implementace – Chováni jednotek
Rodina strategií public interface IDifficulty        {              void pickAction(ContextClass context);         }         public class EasyDifficulty : IDifficulty        {             public void pickAction(ContextClass context){                 //wait patiently untill defeated             public class HardDifficulty : IDifficulty        {             //fight for every inch             public class NightmareDiff : IDifficulty        {             public void pickAction(ContextClass context) {         //cheat for unlimited resources             }

12 Implementace – příklad (C#)
Kontext public class Enemy : IEnemy{               public IDifficulty Difficulty { get; set; }                           public void GameTurn(){                  // Difficulty.PickAction(context);       //...              }          }

13 Implementace – příklad (C#)
Klientský kód public void Game() { IEnemy terran = new Enemy();                 terran.Difficulty = new EasyDifficulty(); IEnemy zerg = new Enemy(); zerg.Difficulty = new HardDifficulty(); terran.GameTurn(); \\terran-easy , zerg.GameTurn(); \\zerg hard terran.Difficulty=new NightmareDiff(); zerg.Difficulty = new EasyDifficulty(); terran.GameTurn(); \\ terran nightmare zerg.GameTurn();   \\zerg easy } Určuje Strategii Kontextu Operuje jenom na Kontextu

14 Implementace Jak předat kontext strategii?
Předání kontextových dat v parametrech metody Nemusí být použity Můžu jich být hodně. Přistupuje jen k datům, které potřebuje Rozhraní a kontext 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

15 Vlastnosti Výhody Nevý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

16 Aplikace Použití v praxi GUI Třídění Komprese dat Obecně
Validace formulářových prvků Layout manager – různé algoritmy pro layout prvků 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íť…)

17 Související návrhové vzory
State Chování určeno stavem Stav se může měnit implicitně, Strategii mění uživatel Command Chování zapouzdřeno v objektu

18 KONEC Pro více informací Dependency injeciton -
Tfs – C# Properties -


Stáhnout ppt "Strategy „Definujte rodinu algoritmů, zapouzdřuje je aby byly vzájemně zaměnitelné. Strategie umožňuje, aby se algoritmus nebyl závislý na klientech, kteří."

Podobné prezentace


Reklamy Google