25
www.devbg.org/patterns course / Васил Бакалов mail[at]vassil.info mail[at]vassil.info Американски Университет в България Американски Университет в България http://www.aubg.bg/ http://www.aubg.bg/ Interpreter Interpreter Pattern Pattern Design Patterns Design Patterns in C# in C#

Interpreter Pattern

  • Upload
    pier

  • View
    70

  • Download
    0

Embed Size (px)

DESCRIPTION

Design Patterns in C#. Interpreter Pattern. www.devbg.org/patterns course /. Васил Бакалов. mail[at]vassil.info Американски Университет в България http://www.aubg.bg/. Съдържание. Накратко за шаблона Проблем Структура на шаблона Примерна реализация Въпроси при реализацията - PowerPoint PPT Presentation

Citation preview

Page 1: Interpreter Pattern

www.devbg.org/patternscourse/www.devbg.org/patternscourse/

Васил Бакаловmail[at]vassil.infomail[at]vassil.infoАмерикански Университет в БългарияАмерикански Университет в Българияhttp://www.aubg.bg/http://www.aubg.bg/

Interpreter PatternInterpreter Pattern

Design Patterns Design Patterns in C#in C#

Page 2: Interpreter Pattern

СъдържаниеСъдържаниеСъдържаниеСъдържание

• Накратко за шаблонаНакратко за шаблона

• ПроблемПроблем

• Структура на шаблонаСтруктура на шаблона

• Примерна реализацияПримерна реализация

• Въпроси при реализациятаВъпроси при реализацията

• За и против шаблонаЗа и против шаблона

• УпражненияУпражнения

• Накратко за шаблонаНакратко за шаблона

• ПроблемПроблем

• Структура на шаблонаСтруктура на шаблона

• Примерна реализацияПримерна реализация

• Въпроси при реализациятаВъпроси при реализацията

• За и против шаблонаЗа и против шаблона

• УпражненияУпражнения

Page 3: Interpreter Pattern

Накратко за шаблонаНакратко за шаблонаНакратко за шаблонаНакратко за шаблона

• Схема, коСхема, кояято решава различни задачи то решава различни задачи по тяхното описаниепо тяхното описание

• Създаване на :Създаване на :

- език, чрез който се описва една задачаезик, чрез който се описва една задача

- схемата за нейното решаванесхемата за нейното решаване

• Вместо решение на конкретен вариант Вместо решение на конкретен вариант на задачата, чрез описателен на задачата, чрез описателен механизъм съставяме общо решениемеханизъм съставяме общо решение

• Схема, коСхема, кояято решава различни задачи то решава различни задачи по тяхното описаниепо тяхното описание

• Създаване на :Създаване на :

- език, чрез който се описва една задачаезик, чрез който се описва една задача

- схемата за нейното решаванесхемата за нейното решаване

• Вместо решение на конкретен вариант Вместо решение на конкретен вариант на задачата, чрез описателен на задачата, чрез описателен механизъм съставяме общо решениемеханизъм съставяме общо решение

Page 4: Interpreter Pattern

Накратко за шаблонаНакратко за шаблонаНакратко за шаблонаНакратко за шаблона

• РРазпределение на задачата на азпределение на задачата на съставящите я подзадачисъставящите я подзадачи

• Дефинира се език, който описва всяка Дефинира се език, който описва всяка подобна задача. На този език подобна задача. На този език съответстват класове, косъответстват класове, коиито то извършват решаването на извършват решаването на задачатазадачата..

• РРазпределение на задачата на азпределение на задачата на съставящите я подзадачисъставящите я подзадачи

• Дефинира се език, който описва всяка Дефинира се език, който описва всяка подобна задача. На този език подобна задача. На този език съответстват класове, косъответстват класове, коиито то извършват решаването на извършват решаването на задачатазадачата..

Page 5: Interpreter Pattern

ПроблемПроблемПроблемПроблем

Често срещан тип задача, на която е Често срещан тип задача, на която е възможно да се състави общо възможно да се състави общо решениерешение

Опростяване на логиката при Опростяване на логиката при извършване на задача с повтарящи се извършване на задача с повтарящи се подзадачиподзадачи

Често срещан тип задача, на която е Често срещан тип задача, на която е възможно да се състави общо възможно да се състави общо решениерешение

Опростяване на логиката при Опростяване на логиката при извършване на задача с повтарящи се извършване на задача с повтарящи се подзадачиподзадачи

Page 6: Interpreter Pattern

Структура на шаблонаСтруктура на шаблонаСтруктура на шаблонаСтруктура на шаблона

Граматиката на езика се изгражда въз основа на Граматиката на езика се изгражда въз основа на следните класове:следните класове:

AbstractExpressionAbstractExpressionДекларира абстрактният метод Декларира абстрактният метод InterpretInterpret, който е общ за , който е общ за

всички възли в абстрактното синтактично дървовсички възли в абстрактното синтактично дърво. .

TerminalExpressionTerminalExpressionИмплементира действието наИмплементира действието на Interpret Interpret операцията за операцията за

крайните символи в граматиката.крайните символи в граматиката.

Необходима е инстанция на такъв обект за всеки краен Необходима е инстанция на такъв обект за всеки краен символ в изречението.символ в изречението.

NonterminalExpressionNonterminalExpressionТакъв клас е необходим за всяко едно правило Такъв клас е необходим за всяко едно правило RR ::= ::= RR1 1 RR2 ... 2 ... RRn n в граматикатав граматиката. .

Съдържа инстанции от тип Съдържа инстанции от тип AbstractExpression AbstractExpression за всеки от за всеки от символите от символите от RR1 1 до до RRn.n.

Граматиката на езика се изгражда въз основа на Граматиката на езика се изгражда въз основа на следните класове:следните класове:

AbstractExpressionAbstractExpressionДекларира абстрактният метод Декларира абстрактният метод InterpretInterpret, който е общ за , който е общ за

всички възли в абстрактното синтактично дървовсички възли в абстрактното синтактично дърво. .

TerminalExpressionTerminalExpressionИмплементира действието наИмплементира действието на Interpret Interpret операцията за операцията за

крайните символи в граматиката.крайните символи в граматиката.

Необходима е инстанция на такъв обект за всеки краен Необходима е инстанция на такъв обект за всеки краен символ в изречението.символ в изречението.

NonterminalExpressionNonterminalExpressionТакъв клас е необходим за всяко едно правило Такъв клас е необходим за всяко едно правило RR ::= ::= RR1 1 RR2 ... 2 ... RRn n в граматикатав граматиката. .

Съдържа инстанции от тип Съдържа инстанции от тип AbstractExpression AbstractExpression за всеки от за всеки от символите от символите от RR1 1 до до RRn.n.

Page 7: Interpreter Pattern

Структура на шаблонаСтруктура на шаблонаСтруктура на шаблонаСтруктура на шаблона

Имплементира операцията Имплементира операцията Interpret Interpret за не крайните за не крайните символи в граматиката.символи в граматиката. Interpret Interpret обикновено се извиква обикновено се извиква рекурсивно за променливите представляващи рекурсивно за променливите представляващи символите символите RR1 1 додо RRn.n.

Context Context Съдържа информация глобална за интерпретатора.Съдържа информация глобална за интерпретатора.

Client Client Построява (или приема) абстрактно синтактично дърво Построява (или приема) абстрактно синтактично дърво

представляващо конкретно изречение в езика, представляващо конкретно изречение в езика, дефиниран от граматиката.дефиниран от граматиката. Абстрактното синтактично Абстрактното синтактично дърво се съставя от инстанции надърво се съставя от инстанции на NonterminalExpression NonterminalExpression и и TerminalExpression TerminalExpression класовекласове..

Имплементира операцията Имплементира операцията Interpret Interpret за не крайните за не крайните символи в граматиката.символи в граматиката. Interpret Interpret обикновено се извиква обикновено се извиква рекурсивно за променливите представляващи рекурсивно за променливите представляващи символите символите RR1 1 додо RRn.n.

Context Context Съдържа информация глобална за интерпретатора.Съдържа информация глобална за интерпретатора.

Client Client Построява (или приема) абстрактно синтактично дърво Построява (или приема) абстрактно синтактично дърво

представляващо конкретно изречение в езика, представляващо конкретно изречение в езика, дефиниран от граматиката.дефиниран от граматиката. Абстрактното синтактично Абстрактното синтактично дърво се съставя от инстанции надърво се съставя от инстанции на NonterminalExpression NonterminalExpression и и TerminalExpression TerminalExpression класовекласове..

Page 8: Interpreter Pattern

Структура на шаблонаСтруктура на шаблонаСтруктура на шаблонаСтруктура на шаблона

Page 9: Interpreter Pattern

Структура на шаблонаСтруктура на шаблонаСтруктура на шаблонаСтруктура на шаблона

Конкретните класове зависят от решавания Конкретните класове зависят от решавания проблем. Нека разгледаме конкретните проблем. Нека разгледаме конкретните класове в два примеракласове в два примера

ПримерПример 1 1: Регулярни изрази: Регулярни изрази

Пример 2: Булева алгебраПример 2: Булева алгебра

Конкретните класове зависят от решавания Конкретните класове зависят от решавания проблем. Нека разгледаме конкретните проблем. Нека разгледаме конкретните класове в два примеракласове в два примера

ПримерПример 1 1: Регулярни изрази: Регулярни изрази

Пример 2: Булева алгебраПример 2: Булева алгебра

Page 10: Interpreter Pattern

Примерна реализацияПримерна реализацияПримерна реализацияПримерна реализация

Регулярни изразиРегулярни изразиРегулярни изразиРегулярни изрази

Page 11: Interpreter Pattern

Примерна реализацияПримерна реализацияПримерна реализацияПримерна реализация

Идентифициране на обектитеИдентифициране на обектите

• Главен абстрактен клас, входна точка Главен абстрактен клас, входна точка към задачатакъм задачата

(в примера (в примера RegularExpressionRegularExpression))

Класове наследници, представляващи Класове наследници, представляващи подклас задачаподклас задача

(в примера (в примера LiteralExpression, LiteralExpression, AlternationExpression, AlternationExpression, SequenceExpression, SequenceExpression, ии RepetitionExpressionRepetitionExpression))

Идентифициране на обектитеИдентифициране на обектите

• Главен абстрактен клас, входна точка Главен абстрактен клас, входна точка към задачатакъм задачата

(в примера (в примера RegularExpressionRegularExpression))

Класове наследници, представляващи Класове наследници, представляващи подклас задачаподклас задача

(в примера (в примера LiteralExpression, LiteralExpression, AlternationExpression, AlternationExpression, SequenceExpression, SequenceExpression, ии RepetitionExpressionRepetitionExpression))

Page 12: Interpreter Pattern

Примерна реализацияПримерна реализацияПримерна реализацияПримерна реализация

raining & (dogs | cats) *

raining dogsraining cats dogsraining cats and dogsIt is raining cats and dogs

Page 13: Interpreter Pattern

Примерна реализацияПримерна реализацияПримерна реализацияПримерна реализация

Пример 2: Булева АлгебраПример 2: Булева Алгебра

Пресмятане на стойността на булев Пресмятане на стойността на булев израз. Поддръжка на:израз. Поддръжка на:

• Изрази (Изрази (AND/ ORAND/ OR/ / NOT)NOT)

• ПроменливиПроменливи

• КонстантиКонстанти

Пример 2: Булева АлгебраПример 2: Булева Алгебра

Пресмятане на стойността на булев Пресмятане на стойността на булев израз. Поддръжка на:израз. Поддръжка на:

• Изрази (Изрази (AND/ ORAND/ OR/ / NOT)NOT)

• ПроменливиПроменливи

• КонстантиКонстанти

Page 14: Interpreter Pattern

Примерна реализацияПримерна реализацияПримерна реализацияПримерна реализация

Page 15: Interpreter Pattern

Примерна реализацияПримерна реализацияПримерна реализацияПримерна реализация

Дефинициите на класовете:Дефинициите на класовете:

КласътКласът BooleanExp:BooleanExp:

Дефинициите на класовете:Дефинициите на класовете:

КласътКласът BooleanExp:BooleanExp:

public abstract class BooleanExp

{

public BooleanExp(){}

public abstract bool Evaluate(Context aContext);

public abstract BooleanExp Replace(string name, BooleanExp bExp);

public abstract BooleanExp Copy();

}

Page 16: Interpreter Pattern

Примерна реализацияПримерна реализацияПримерна реализацияПримерна реализация

Класът Класът VariableExpression:VariableExpression:Класът Класът VariableExpression:VariableExpression:public class VariableExp : BooleanExp

{

public VariableExp(string name){mname = name;}

public override bool Evaluate(Context aContext)

{return aContext.Lookup(this);}

public override BooleanExp Replace(string name, BooleanExp bExp)

{

if (name.Equals(mname))

return bExp.Copy();

else

return new VariableExp(mname);

}

Page 17: Interpreter Pattern

Примерна реализацияПримерна реализацияПримерна реализацияПримерна реализация

public override BooleanExp Copy()

{

return new VariableExp(mname);

}

public string mname;

}

public class Context

{

Hashtable values;

public Context()

{

values = new Hashtable();

}

Page 18: Interpreter Pattern

Примерна реализацияПримерна реализацияПримерна реализацияПримерна реализация

public bool Lookup(VariableExp varExp)

{

bool result = (bool)values[varExp.mname];

return result;

}

public void Assign(VariableExp varExp, bool bval)

{

values.Add(varExp.mname, bval);

}

}

Page 19: Interpreter Pattern

ДемонстрацияДемонстрацияДемонстрацияДемонстрация

Булева алгебра, реализирана чрез Булева алгебра, реализирана чрез шаблона Интерпретаторшаблона Интерпретатор

Булева алгебра, реализирана чрез Булева алгебра, реализирана чрез шаблона Интерпретаторшаблона Интерпретатор

Page 20: Interpreter Pattern

Въпроси при Въпроси при реализациятареализациятаВъпроси при Въпроси при реализациятареализацията

Създаване на абстрактното синтактично дървоСъздаване на абстрактното синтактично дървоРазпознаването (парсване) не е дефинирано конкретно. Разпознаването (парсване) не е дефинирано конкретно. Възможни са различни подходи, като табличен парсер или Възможни са различни подходи, като табличен парсер или други (например рекурсивно спускане).други (например рекурсивно спускане).

Дефиниране на Дефиниране на Interpret Interpret операциятаоперациятаВместо всеки израз да имплементира Вместо всеки израз да имплементира Interpret Interpret операцията операцията може да се използва шаблона може да се използва шаблона VisitorVisitor. Решение ако се . Решение ако се налага да ползваме различни интерпретатори.налага да ползваме различни интерпретатори.

Споделяне на крайните символи чрез шаблона Споделяне на крайните символи чрез шаблона FlyWeightFlyWeight

Граматики, чийто изречения съдържат множество Граматики, чийто изречения съдържат множество срещания на даден краен символ, ще спечелят ако срещания на даден краен символ, ще спечелят ако използват единствена инстанция на дадения символ.използват единствена инстанция на дадения символ.

Създаване на абстрактното синтактично дървоСъздаване на абстрактното синтактично дървоРазпознаването (парсване) не е дефинирано конкретно. Разпознаването (парсване) не е дефинирано конкретно. Възможни са различни подходи, като табличен парсер или Възможни са различни подходи, като табличен парсер или други (например рекурсивно спускане).други (например рекурсивно спускане).

Дефиниране на Дефиниране на Interpret Interpret операциятаоперациятаВместо всеки израз да имплементира Вместо всеки израз да имплементира Interpret Interpret операцията операцията може да се използва шаблона може да се използва шаблона VisitorVisitor. Решение ако се . Решение ако се налага да ползваме различни интерпретатори.налага да ползваме различни интерпретатори.

Споделяне на крайните символи чрез шаблона Споделяне на крайните символи чрез шаблона FlyWeightFlyWeight

Граматики, чийто изречения съдържат множество Граматики, чийто изречения съдържат множество срещания на даден краен символ, ще спечелят ако срещания на даден краен символ, ще спечелят ако използват единствена инстанция на дадения символ.използват единствена инстанция на дадения символ.

Page 21: Interpreter Pattern

За и против шаблонаЗа и против шаблонаЗа и против шаблонаЗа и против шаблона

Предимства:Предимства:

• Граматиката се променя и разширява лесно Граматиката се променя и разширява лесно Тъй като се използват класове, чрез наследяване лесно Тъй като се използват класове, чрез наследяване лесно

можем да променим или допълним граматикатаможем да променим или допълним граматиката

• Подобност на класоветеПодобност на класоветеКласовете се имплементират по много сходен начин, което Класовете се имплементират по много сходен начин, което

улеснява реализирането на шаблона и автоматизираното улеснява реализирането на шаблона и автоматизираното генериране на класовегенериране на класове

• Добавяне на нови начини за Добавяне на нови начини за интерпретиране на изразиинтерпретиране на изразиЛесно, чрез добавяне на нови операции на съществуващите Лесно, чрез добавяне на нови операции на съществуващите

класовекласове

Предимства:Предимства:

• Граматиката се променя и разширява лесно Граматиката се променя и разширява лесно Тъй като се използват класове, чрез наследяване лесно Тъй като се използват класове, чрез наследяване лесно

можем да променим или допълним граматикатаможем да променим или допълним граматиката

• Подобност на класоветеПодобност на класоветеКласовете се имплементират по много сходен начин, което Класовете се имплементират по много сходен начин, което

улеснява реализирането на шаблона и автоматизираното улеснява реализирането на шаблона и автоматизираното генериране на класовегенериране на класове

• Добавяне на нови начини за Добавяне на нови начини за интерпретиране на изразиинтерпретиране на изразиЛесно, чрез добавяне на нови операции на съществуващите Лесно, чрез добавяне на нови операции на съществуващите

класовекласове

Page 22: Interpreter Pattern

За и против шаблонаЗа и против шаблонаЗа и против шаблонаЗа и против шаблона

Недостатъци:Недостатъци:

• Сложните граматики се поддържат Сложните граматики се поддържат труднотрудноТъй като за всяко правило в граматиката се дефинира поне Тъй като за всяко правило в граматиката се дефинира поне

един клас, при граматики с много правила броят на един клас, при граматики с много правила броят на класовете се увеличава и кода става труден за класовете се увеличава и кода става труден за поддръжка.поддръжка.

Недостатъци:Недостатъци:

• Сложните граматики се поддържат Сложните граматики се поддържат труднотрудноТъй като за всяко правило в граматиката се дефинира поне Тъй като за всяко правило в граматиката се дефинира поне

един клас, при граматики с много правила броят на един клас, при граматики с много правила броят на класовете се увеличава и кода става труден за класовете се увеличава и кода става труден за поддръжка.поддръжка.

Page 23: Interpreter Pattern

InterpreterInterpreterInterpreterInterpreter

Въпроси?Въпроси?

Page 24: Interpreter Pattern

УпражненияУпражненияУпражненияУпражнения

1.1. Да се напише програма, която чрез Да се напише програма, която чрез използване на шаблона използване на шаблона Интерпретатор да изчислява Интерпретатор да изчислява десетичната стойност на дадено десетичната стойност на дадено римско числоримско число

1.1. Да се напише програма, която чрез Да се напише програма, която чрез използване на шаблона използване на шаблона Интерпретатор да изчислява Интерпретатор да изчислява десетичната стойност на дадено десетичната стойност на дадено римско числоримско число

Page 25: Interpreter Pattern

Използвана литератураИзползвана литератураИзползвана литератураИзползвана литература

• Ерик Гама, Ричард Хелм, Ралф Ерик Гама, Ричард Хелм, Ралф Джонсън, Джон Влисидес, Шаблони за Джонсън, Джон Влисидес, Шаблони за дизайн, СофтПрес, 2005, дизайн, СофтПрес, 2005, ISBN 954-685-ISBN 954-685-352-6352-6

• Ерик Гама, Ричард Хелм, Ралф Ерик Гама, Ричард Хелм, Ралф Джонсън, Джон Влисидес, Шаблони за Джонсън, Джон Влисидес, Шаблони за дизайн, СофтПрес, 2005, дизайн, СофтПрес, 2005, ISBN 954-685-ISBN 954-685-352-6352-6