Wzorce projektowe: Interpreter(Interpreter)

Jestem tak jak obiecałem po dwóch tygodniach i tak jak obiecałem będzie o interpreterze, jak można się domyśleć interpretuje jakąś treść na treść jaką my chcemy, czyli np jest wykorzystywany w translatorach i kompilatorach itp dokładniej dalej w artykule.

 

Cel

  • Interpretacja określonych wyrażeń np do określonego języka programowania.
  • Zdefiniowanie opisu gramatyki języka interpretowanego.

 

Problem

Problem w którym można wykorzystać interpreter może dotyczyć dziedzin, które dotyczą języków których nie chcemy tłumaczyć samodzielnie z każdym razem i możemy stworzyć do nich interpreter, który będzie sam tłumaczył ich gramatykę.

 

Użyj wtedy kiedy:

  • Chcesz stworzyć np własny kompilator
  • Tworzysz projekt, który posiada funkcjonalności, które muszę być zinterpretowane na język zrozumiały dla użytkownika.
  • Jakieś zadania w projekcie są zapisane w interpretowanym języku oraz istnieje gramatyka do niego.

 

Dyskusja

Każda abstrakcyjna klasa bazowa wzorca interpreter definiuje metodę interpret() a każda klasa konkretna dziedzicząca po klasie bazowej implementuje metodę interpret(), która tłumaczy wymaganą w tym momencie konkretną część języka.

Jak widać zrozumienie zastosowania wzorca interpreter jest łatwe, ale jego implementacja jest odrobinę trudniejsza, opis implementacji i struktury wzorca dalej w artykule.

 

Struktura

Jak widać na diagramie UML poniżej interpreter składa się z:

  • Klasy Context, która przetrzymuje dane poddawane interpretacji.
  • Klasy AbstractExpression, która interpretuje polecenia.
  • Konkretnych klas dziedziczących po klasie AbstractExpression, które interpretują Context dla poszczególnych przypadków.

Scheme of Interpreter

Schemat w kodzie wzorca interpreter wygląda tak:

Diagram UML wzorca interpreter można wyglądać też tak:

Interpreter Pattern UML Diagram

Różni się jedynie tym, że nie ma klasy Context, w kodzie wygląda tak:

W tym przykładzie rozdzielamy znaki a liczby wrzucamy na stos, gdy chcemy je dodać lub odjać to po kolei zdejmujemy liczby ze stosu, taki mamy wynik:

 

Przykłady z życia wzięte

Takim przykładem może być np klawiatura muzyczna, która interpretuje kliknięcia w klawisze na określone tony i nuty.

Example of Interpreter

 

Rzymski system liczbowy

Przykład z życia wzięty, który przerobimy w kodzie, bazuje na rzymskim systemie liczbowym, który będziemy interpretować na system dziesiętny, czyli ten system liczbowy, który używamy na co dzień.

Tak wygląda w kodzie:

Wygląda podobnie jak w poprzednich przykładach, w kliencie tworzymy i zapisujemy klasy konkretne do listy i w pętli foreach po kolei interpretujemy. Główną metodę Interpret() mamy w klasie Expression, która interpretuje wszystkie znaki rzymskie i oblicza je na wartości dziesiętne. Przeanalizuj dokładnie ten kod, przez samo patrzenie na przykłady niczego nie nauczysz😐

Wyniki są takie:

 

Relacje z innymi wzorcami projektowymi

  • Abstrakcyjne drzewko składni Interpretera jest podobne do drzewka liści kompozytu.
  • Interpreter może użyć Iteratora do przemierzania struktury.
  • Pyłka można wykorzystać do podzielenia symboli w abstrakcyjnym drzewku składni interpretera.
  • Odwiedzający(Visitor) może zarządzać zachowaniem w każdym węźle drzwka interpretera.

 

Podsumowanie

I to cała filozofia na temat wzorca interpreter🙂

Link do githuba z wszystkimi przykładami: https://github.com/Slaw145/InterpreterTutorial

Mam świadomość, że sporo tych wzorców i trudno je wszystkie ogarnąć, ale wracaj do nich czasem jak będziesz musiał rozwiązać jakiś problem, który można rozwiązać za pomocą jakiegoś wzorca nie ma chyba nikogo albo jest bardzo niewielu ludzi, którzy pamiętają wszystkie wzorce🙂

W następnym artykule, będzie mowa o wzorcu Iterator(Iterator).

Standardowo, przypominam o newsletterze, którym wysyłam powiadomienia o nowych wpisach oraz dodatkowe informacje na temat, ogółem mówiąc, świecie IT.

Link do strony i grupy na fb:

-strona na fb: Devman.pl-Sławomir Kowalski

-grupa na fb: DevmanCommunity

Pytaj, komentuj pod spodem na końcu wpisu, podziel się nim, oceń go, co tam chcesz🙂 Do zobaczenia za tydzień🙂

 

 
Jeśli ten wpis ci się przydał podziel się nim ze swoimi znajomymi :)

Post a comment

avatar
  Subscribe  
Notify about