Interpreter (wzorzec projektowy)

Z Wikipedii, wolnej encyklopedii

Interpreter – czynnościowy wzorzec projektowy, którego celem jest zdefiniowanie opisu gramatyki pewnego języka interpretowalnego, a także stworzenie dla niej interpretera, dzięki któremu będzie możliwe rozwiązanie opisanego problemu.

Diagram UML[edytuj | edytuj kod]

  • AbstractExpression (wyrażenie abstrakcyjne) – deklaruje abstrakcyjną operację interpretera
  • TerminalExpression (wyrażenie terminalne) – interpretuje wyrażenie zawierające jakiś symbol terminalny gramatyki
  • NonterminalExpression (wyrażenie nieterminalne) – interpretuje wszystkie nieterminalne symbole gramatyki
  • Context (kontekst) – zawiera globalną informację należącą do parsera, np. stos symboli
  • Client (klient) – buduje drzewo składni z poprzednich typów wyrażeń i rozpoczyna operację interpretowania

Zastosowanie[edytuj | edytuj kod]

Omawiany wzorzec projektowy można wykorzystać w sytuacjach, gdy zdania, zapisane w pewnym interpretowalnym języku, mogą być reprezentowane jako drzewa składniowe oraz istnieje prosta gramatyka opisująca ten język. Jednakże brak doświadczenia programisty może utrudniać rozpoznanie, czy dany przypadek wymaga zastosowania tego wzorca. Według Jamesa Williama Coopera[1] są trzy przypadki, kiedy wzorzec ten jest pomocny:

  1. Użytkownik tworzy różnego rodzaju zapytania o różne dane i wzorzec Interpreter pomoże tutaj w przetworzeniu tych zapytań i poleceń.
  2. Program musi dokonać obliczeń na podstawie wyrażeń algebraicznych, zapisów funkcji lub równań. Wówczas wzorzec Interpreter spełni swoje zadanie przetwarzając tekst na modele matematyczne.
  3. Program generujący zmieniające się dane w różnej kolejności i ilości, tzw. generatory raportów. Wzorzec Interpreter pozwoli na dowolną manipulację danymi, aby otrzymać żądany raport.

Do przykładowych zastosowań tego wzorca należy interpretacja rzymskiego systemu liczbowego, interpretacja wyrażeń zapisanych w odwrotnej notacji polskiej oraz sprawdzanie poprawności pewnych reguł[2]. Stosowany jest także w kompilatorach (np. kompilatorze języka Smalltalk).

Konsekwencje stosowania[3][edytuj | edytuj kod]

  1. Informowanie użytkowników o sposobach wprowadzania poleceń i zapytań języka. To wymusza często tworzenie dokumentacji dla naszego języka, które szczegółowo i w prosty sposób przedstawią wszystkie możliwości wykorzystania danego języka.
  2. Dodatkowa praca musi być włożona w sprawdzanie poprawności składni i gramatyki. Również zaimplementowanie informowania o błędach nie jest wcale łatwe. Może się okazać, że nakład pracy będzie zbyt duży.
  3. Zaletą tego wzorca jest możliwość generowania słów języka automatycznie z interfejsu użytkownika, co może pomóc w stworzeniu sekwencji uporządkowanych operacji. Można dzięki temu wprowadzić system makr.
  4. Jeżeli mamy utworzone narzędzia do parsownia i redukcji stosu, wtedy zaletą wzorca jest możliwość rozszerzania lub zmieniania gramatyki poprzez dodawanie nowych poleceń i zmiennych.
  5. Rozszerzanie języka może być również wadą, ponieważ pociąga to za sobą tworzenie małych, podobnych do siebie klas.
  6. Jeżeli sama gramatyka jest skomplikowana, również pojawia się ryzyko trudności w dalszym utrzymaniu kodu lub jego rozbudowywaniu.

Podobne wzorce[edytuj | edytuj kod]

Wzorzec Strategia podobnie jak Interpreter wykorzystuje klasę kontekstową. Również tam stosuje się abstrakcyjną metodę, aby przełączać za pomocą kontekstu jej konkretne implementacje. Interpreter stosuje tą zasadę z tą różnicą, że kontekst nie jest aktywny i nie steruje implementacjami, ale jest biernym odbiorcą przechowującym dane (najczęściej w stosie).

Przykłady[edytuj | edytuj kod]

Zobacz też[edytuj | edytuj kod]

Przypisy[edytuj | edytuj kod]

  1. Interpreter, [w:] James William Cooper, Java. Wzorce projektowe, Helion, 2001, s. 157-158, ISBN 83-7197-529-5.
  2. Przykłady zastosowań wzorca projektowego.
  3. Interpreter, [w:] James William Cooper, Java. Wzorce projektowe, Helion, 2001, s. 166-167, ISBN 83-7197-529-5.

Bibliografia[edytuj | edytuj kod]

  • Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Inżynieria oprogramowania: Wzorce projektowe (Wyd. II). Warszawa: WNT, 2008, s. 255-269. ISBN 978-83-204-3472-9.
  • James W. Cooper: Java. Wzorce projektowe. Gliwice: Helion, 2001. ISBN 83-7197-529-5.