Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilGabriela Staňková
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 -
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.