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