Wzorce czynnościowe - Interpreter, Iterator, Odwiedzający, Pamiątka, Polecenie Flashcards
Wzorce czynnościowe - druga połowa
- interpreter
- iterator
- odwiedzający
- pamiątka
- polecenie
Interpreter - nazwa
ang. interpreter
Interpreter - typ
klasowy, czynnościowy
Interpreter - Przeznaczenie
Zadaniem wzorca jest interpretacja poleceń innego języka. Użycie tego wzorca polega na zdefiniowaniu opisu gramatyki sformalizowanego języka interpretowanego i stworzenie dla niego interpretera, dzięki któremu będzie możliwe rozwiązanie danego problemu. Wzorzec ten implementuje swojego rodzaju parser, który konwertuje jedną reprezentację danych w inną
Interpreter - Uzasadnienie
Złożone często występujące problemy, można zapisać za pomocą prostego języka, a następnie zbudować interpreter rozwiązujący problem za jego pomocą. Odpowiednim regułom służą klasy
Interpreter - Warunki stosowania
Jeśli istnieje interpretowany język, a zdania z tego języka można przedstawić za pomocą drzewa składni abstrakcyjnej.
• prosta gramatyka (przy skomplikowanej, hierarchia klas staje się trudna w zarządzaniu)
• wydajność nie jest najważniejsza (wydajne tłumaczą na inną postać, np. wyr. regularne przekształcane są w maszyny stanowe)
Interpreter – Elementy
• AbstractExpression
- obejmuje deklarację operacji Interpret wspólnej wszystkim węzłom
• TerminalExpression
- implementacja operacji Interpret, dla każdego symbolu końcowego należy utworzyć egzemplarz tej klasy
• NonterminalExpression
- dla każdej reguły w gramatyce trzeba utworzyć egzemplarz tej klasy, przechowuje zmienne egzemplarza typu AbstractExpression
• Context
- przechowuje informacje globalne interpretera
• Client
- tworzy drzewo składni abstrakcyjnej reprezentujące określone zadanie w języku zdefiniowanym przez gramatykę, wywołuje operację Interpret
Interpreter – Współdziałanie elementów
- Klient tworzy (lub otrzymuje) zdanie jako drzewo składni abstrakcyjnej obejmujące egzemplarze klas NonterminalExpression i TerminalExpression. Następnie klient inicjuje kontekst i wywołuje operację Interpret.
- Każdy węzeł klasy NonterminalExpression definiuje operację Interpret w kategoriach operacji Interpret poszczególnych podwyrażeń. Operacja Interpret w każdej klasie TerminalExpression określa przypadek bazowy w rekurencji.
- Operacje Interpret w każdym węźle wykorzystują kontekst do zapisywania i pobierania stanu interpretera
Interpreter – Konsekwencje
- modyfikowanie i rozszerzanie gramatyki jest łatwe
- implementowanie gramatyki także jest łatwe
- zarządzanie złożonymi gramatykami jest trudne
Interpreter – Implementacja
- Wzorzec interpreter nie określa jak tworzyć drzewa składni abstrakcyjnej.
- Można użyć wzorca pyłek do współużytkownika symboli końcowych.
Interpreter – Powiązane wzorce
- Kompozyt - drzewo składni abstrakcyjnej to przykład zastosowania tego wzorca
- Pyłek - współużytkowanie symboli końcowych
- Iterator - można użyć do przechodzenia po strukturze
- Odwiedzający - do umieszczenia w jednej klasie zachowania każdego z węzłów kl. abstrakcyjnej
Interpreter - przykład
Sposób zapisu wyrażeń arytmetycznych, w którym znak wykonywanej operacji umieszczony jest po operandach (zapis postfiksowy), a nie pomiędzy nimi jak w konwencjonalnym zapisie algebraicznym (zapis infiksowy).
Konwencjonalny zapis (2+3)*5 => ONP zapis 2 3 + 5
Iterator - nazwa
ang. iterator
pol. kursor
ang. cursor
Iterator - typ
obiektowy, czynnościowy
Iterator - Przeznaczenie
Czynnościowy wzorzec projektowy, którego zadaniem jest zapewnienie sekwencyjnego dostępu do elementów zbioru bez ujawnienia jego implementacji wewnętrznej.
Pod pojęciem zbioru kryją się bardzo różne struktury danych, takie jak listy, kolejki, stosy, zbiory, mapy, tabele, itp.
Wzorzec ten ma na celu udostępnienie zunifikowanego interfejsu dostępowego do elementów tych struktur danych.
Iterator - Uzasadnienie
- Obiekty zagregowane powinny umożliwiać dostęp do swoich elementów bez ujawniania wewnętrznej struktury.
- Można poruszać się po liście na różne sposoby, jednak bez rozbudowywania interfejsu klasy list.
- Możliwość uruchomienia kilku procesów poruszających się po liście w jednym czasie.
Iterator - Warunki stosowania
- W celu uzyskania dostępu do zawartości obiektu zagregowanego bez ujawniania jego wewnętrznej reprezentacji.
- Aby umożliwić jednoczesne działanie wielu procesom przechodzenie po obiektach zagregowanych.
- Udostępnienie jednolitego interfejsu do poruszania się po różnych zagregowanych strukturach (czyli zapewnienie obsługi iteracji polimorficznej).
Iterator - Elementy i współdziałanie
• Iterator:
- definiuje interfejs umożliwiający dostęp do elementów i przechodzenie po nich.
• Concretelterator:
- obejmuje implementację interfejsu klasy Iterator;
- śledzi bieżącą pozycję w czasie przechodzenia po agregacie.
• Aggregate:
- definiuje interfejs do tworzenia obiektów Iterator.
• ConcreteAggregate:
- obejmuje implementację interfejsu do tworzenia obiektów Iterator zwracającą egzemplarz odpowiedniej klasy Concretelterator.
Obiekt Concretelterator śledzi bieżący obiekt w agregacie i potrafi ustalić następny obiekt, do którego należy przejść.
Iterator - Konsekwencje
- Umożliwienie zmiany sposobu przechodzenia po elemencie złożonym (agregacie) - zmiana algorytmu w trakcie przechodzenia.
- Uproszczenie interfejsu klasy Aggregate.
- Możliwość jednoczesnego działania więcej niż jednego procesu przechodzenia po elemencie złożonym.