Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Standardy w zakresie systemów rozproszonych i baz danych

Podobne prezentacje


Prezentacja na temat: "Standardy w zakresie systemów rozproszonych i baz danych"— Zapis prezentacji:

1 Standardy w zakresie systemów rozproszonych i baz danych
Wykład 12: Wprowadzenie do języka VIDE Piotr Habela Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik Komputerowych, Warszawa

2 Całościowa architektura systemu VIDE

3 Język programowania VIDE dla poziomu PIM
Obiektowy język programowania oparty na UML Umożliwia programowanie zadań biznesowych na bardzo wysokim poziomie abstrakcji Podobnie do SQL Łatwy do nauczenia się do użycia OCL jako język wyrażeń lub zapytań Istotna semantyczna nowość: aby umożliwić aktualizację, zapytania OCL mogą zwrócić referencje do obiektów, a nie (złożone) wartości Mocna kontrola typologiczna zarówno OCL jak i VIDE Ortogonalna trwałość: zarówno system typów jak i OCL nie wprowadzają różnic w dostępie do trwałych i nietrwałych obiektów OCL jest zaimplementowany na bazie SBQL (ten sam runtime) Optymalizacja zapytań (odziedziczona z SBQL) Dostęp do zewnętrznych relacyjnych baz danych (odziedziczony z SBQL) Dostęp do plików XML i Web Services (odziedziczony z SBQL)

4 Bezszwowa integracja OCL i VIDE
Brak niezgodności impedancji pomiędzy zapytaniami i programami Niezgodność impedancji jest charakterystyczna dla SQL Zapytania są używane wewnątrz programów (konstrukcji imperatywnych) jako wyrażenia Nie ma innych wyrażeń Zapytania mogą być komunikowane jako parametry procedur i metod (zarówno in jak i out) Zapytanie określa wynik procedury/metody funkcyjnej Zunifikowany styl syntaktyczny i system typów dla zapytań i programów (kompromis pomiędzy UML i OCL) Makroskopowe konstrukcje imperatywne (wiele obiektów przetwarzanych quasi-równolegle) Podobnie do konstrukcji update, insert i delete języka SQL Zapytania OCL oraz programy VIDE podlegają tym samym regułom nazewnictwa danych, zakresów nazw, wiązania nazw i mocnej kontroli typów

5 Struktury UML zaadoptowane w VIDE
Cechy UML Założenia VIDE Pakiety Wspierane jako zasadniczy środek dekompozycji złożonych modeli Opisy klas Bez zmian, każda klasa ma nazwę, listę własności i operacji Własności klas Bez zmian, każda własność ma nazwę, typ, krotność i widoczność (prywatność) Asocjacje Ograniczone wyłącznie do binarnych. Rozróżnia się kompozycje i normalne asocjacje Dziedziczenie Wspomagane jest wielokrotne dziedziczenie, ale konflikt nazw traktowany jest jako błąd. Typy Zaadoptowano zestaw prostych typów języka OCL

6 Struktury UML nie wspierane w VIDE
Cechy UML Założenia VIDE Klasy asocjacji Nie są wspierane, gdyż powodują nadmierny rozrost opcji w języku programowania i wzrost złożoności oprogramowania. Można łatwo je odwzorować na normalne klasy i dodatkowe asocjacje Zależności (dependency) Przeznaczone raczej do modelowania niż do programowania. VIDE wprowadza bardziej specyficzne związki, np. import pakietów. Interfejsy W obecnej wersji nie są zaimplementowane. Można je zastąpić poprzez klasy abstrakcyjne.

7 Hierarchia typów w VIDE
Typy prymitywne: Boolean, Integer, Real String Date

8 Zmienne lokalne Wewnątrz każdego bloku kodu (tj. ciała metody, bloku foreach, warunkowego, lub pętli) możemy zadeklarować zmienną lokalną. Zmienne możemy następnie stosować w wyrażeniach OCL tak samo, jak inne nazwane byty (w szczególności – atrybuty czy końce powiązań), podając ich nazwy. Aktualizację wartości zmiennej można wykonać: dla zmiennej jednowartościowej – symbolami przypisania: :=, +=, -=, *=, /= , zaś dla wielowartościowej – instrukcjami insert lub replace. Zmienne mogą być typów prostych (Integer, String, Boolean, Real, Date) oraz klasowych (np. Person). Deklaracja zmiennej jest identyczna z deklaracją atrybutu w diagramach klas, np. lacznaNaleznosc : Integer; Zmienne jednowartościowe można inicjować w miejscu deklaracji – np. lacznaNaleznosc : Integer = 5; Dla zmiennych wielowartościowych musimy explicite podać rodzaj ich kolekcji – np. powiadomienia : Bag[0..*](String);

9 Instrukcje aktualizujące
Przypisania wartości dla jednowartościowych właściwości: :=, +=, -=, *=, /= Dla atrybutów wielowartościowych (oraz dla zmiennych lokalnych) - operator insert: wyrZwracająceAtrybut insert wyrażenieZwracająceWartość Chcąc nadpisać istniejącą zawartość użyjemy replace: wyrZwracająceAtrybut replace wyrażenieZwracająceWartość W edytorze tekstowym należy rozróżnić zwykłe atrybuty (ew. złożone) od końców asocjacji. Te drugie aktualizujemy innymi poleceniami – link oraz unlink. Tworzeniu powiązań asocjacyjnych służy instrukcja link .. to: wyrZwracająceObiekt link nazwaKońcaAsocjacji to wyrażenieZwracająceObiekt Usuwanie - unlink: wyrZwracająceObiekt unlink nazwaKońcaAsocjacji [ from wyrażenieZwracająceObiekt ]

10 Instrukcja iteracyjna i instrukcje pętli
Ponieważ większość poleceń imperatywnych działa na pojedynczych obiektach, a przetwarzamy często kolekcje, dużą rolę odgrywa instrukcja iteracyjna: wyrZwracająceWartości foreach { nazwaIteratora | ...instrukcje ...} Instrukcje pętli Stanowią odpowiednik popularnych instrukcji for, while i do … while. Cechuje je niższy poziom abstrakcji, niż instrukcję foreach i stąd okazują się rzadziej potrzebne w VIDE. Ogólnie działają tak samo jak w popularnych językach (C/C++, Java)

11 Instrukcja warunkowa i powrotu z metody
składnia jest podobna, jak np. w Javie: if ( warunek ){ ...instrukcje ...} else { ...instrukcje ...} if ( warunek ){ ...instrukcje ...} Instrukcja powrotu z metody: return wyrażenie; Instrukcja pusta: nop;

12 Tworzenie nowych obiektów
Nowy obiekt tworzymy poleceniem create, podając nazwę jego klasy. Nie mamy do dyspozycji konstruktora, ale za to możliwość natychmiastowego zainicjowania powiązań i atrybutów obiektu. Instrukcja ta ma również cechy wyrażenia, tzn. można przypisać ją do atrybutu, linka czy przekazać jako parametr operacji. NazwaKlasy create { nazwaAtrybutu:= wyrażenie; ... link nazwaKońcaAsocjacji to wyrażenie; ... } Średnik jest tylko separatorem, po ostatnim poleceniu podstawienia albo instrukcji link wewnątrz create-a nie powinniśmy go umieszczać, np. Feedback create { rating := ‘positive’; comment := ‘Very fast delivery!’ }

13 Składnia VIDE - kontekst
Kod może dotyczyć specyfikacji ciała metody lub pojedynczego zdania VideCodeVCS ::= VideMethodBodyDeclVCS | statementVCS VideMethodBodyDeclVCS ::= 'context' ActivityReferenceVCS 'body' statementVCS Ta reguła reprezentuje referencję do metody zdefiniowanej w odpowiednim modelu klas, ActivityReferenceVCS ::=    pathNameCS '.' simpleNameCS | simpleNameCS '.' simpleNameCS

14 Zdania języka VIDE statementVCS ::= VideStatementVCS | VideExpressionVCS';' | codeBlockVCS Ta produkcja reprezentuje zdanie języka VIDE. Średnik kończy wszystkie zdania, ale nie jest dozwolony po bloku znajdującym się w nawiasach klamrowych. VideStatementVCS ::=    assignmentStatementVCS';' | ifStatementVCS | switchStatementVCS | forStatementVCS | whileStatementVCS | doWhileStatementVCS | tryStatementVCS | throwStatementVCS ';' | returnStatementVCS ';' | nopStatementVCS ';' | insertStatementVCS ';' | replaceStatementVCS ';' | deleteStatementVCS ';' | linkStatementVCS ';' | unlinkStatementVCS ';' | foreachStatementVCS | withStatementVCS | VariableDeclarationVCS ';' codeBlockVCS ::= '{‘ statementsVCS '}' Każdy blok kodu może zawierać na początku deklaracje zmiennych lokalnych. Zakres zmiennych jest ustalony w sposób normalny, t.j. obowiązuje w bloku i blokach w nim zagnieżdżonych. Deklaracje zmiennych i zdania VIDE są ograniczone nawiasami klamrowymi.

15 Zdania podstawienia Pierwsze zdanie to normalne podstawienie.
assignmentStatementVCS ::=    VideExpressionVCS ':=' VideExpressionVCS |  VideExpressionVCS '+=' OclExpressionCS |  VideExpressionVCS '-=' OclExpressionCS |  VideExpressionVCS '*=' OclExpressionCS |  VideExpressionVCS '/=' OclExpressionCS Pierwsze zdanie to normalne podstawienie. Następne są podstawieniami z wykonaniem operacji arytmetycznych.

16 Zdania sterujące if oraz switch
ifStatementVCS ::= 'if' '(' OclExpressionCS ')' statementVCS ('else' statementVCS)? switchStatementVCS ::=    'switch' '(' VideExpressionVCS ')' {' casePartsVCS '}' |  'switch' '(' VideExpressionVCS ')' {' casePartsVCS 'default' ':' statementVCS'}' Przykład: switch (wyrażenie OCL) { case ”Abacki”: {zdania dla wartości ”Abacki”} case ”Babacki”: {zdania dla wartości ”Babacki”} ... default: {zdania domyślne} } Argumentami zdania case mogą być prymitywne literały. Semantyka podobna do znanej z wielu języków programownia.

17 Zdanie sterujące for oraz while
forStatementVCS ::= 'for' '(' VariableDeclarationVCS ')' 'while' '(' VideExpressionVCS ')' statementVCS for (i : integer = 1) while (i<=10){ ... i += 2; } Przykład: whileStatementVCS ::= 'while' '(' VideExpressionVCS ')' statementVCS Semantyka typowa: jeżeli VideExpressionVCS zwróci false, to we wszystkich przypadkach zdanie sterujące jest zakończone. doWhileStatementVCS ::= 'do' statementVCS 'while' '(' VideExpressionVCS ')'

18 Obsługa wyjątków Podobnie jak w języku Java tryStatementVCS ::=
    'try' statementVCS catchPartsVCS catchPartsVCS ::= 'catch' '(' VariableDeclarationVCS ')' statementVCS catchPartsVCS? Przechwytywanie wyjątków throwStatementVCS ::= 'throw' VideExpressionVCS Rzucanie wyjątków. Wyrażenie powinno zwrócić obiekt. try { kod zawierający instrukcje rzucania wyjątków } catch (x : ExceptionClass) { kod obsługi wyjątku x } Przykład:

19 Instrukcje manipulacji obiektami
createExpressionVCS ::= simpleNameCS 'create' '{' initStatementsVCS '}' initStatementsVCS ::= simpleNameCS ':=' VideExpressionVCS (';' initStatementsVCS)? insertStatementVCS ::= VideExpressionVCS 'insert' VideExpressionVCS replaceStatementVCS ::= VideExpressionVCS 'replace' VideExpressionVCS deleteStatementVCS ::= OclExpressionCS 'delete' linkStatementVCS ::= VideExpressionVCS 'link' simpleNameCS 'to' VideExpressionVCS unlinkStatementVCS ::= OclExpressionCS 'unlink' simpleNamesListVCS ('from' OclExpressionCS)? Jeżeli klauzula ‘from’ jest obecna, to rozłączenie dotyczy związków z obiektami wymienionymi po ‘from’. W przeciwnym przypadku rozłączenie dotyczy wszystkich związków w danych obiektach posiadających jedną z danych nazw. simpleNamesListVCS ::= simpleNameCS (',' simpleNamesListVCS)?

20 Zdanie for each foreachStatementVCS ::=
    VideExpressionVCS 'foreach' statementVCS |  VideExpressionVCS 'foreach' '{' simpleNameCS '|' statementsVCS '}' Semantyka: przed ‘for each’ znajduje się wyrażenie zwracające kolekcję. Pierwszy wariant zakłada iterowanie po elementach tej kolekcji, przy czym w każdym obrocie pętli wykonywany jest program znajdujący się po ‘for each’. W drugim wariancie podobnie, ale każdy element kolekcji jest nazwany specjalną zmienną. Przykłady: Wariant 1: Wariant 2: accounts foreach { chargeFee(); calculateInterest(); operationIndex += 2; } accounts foreach { a | a.chargeFee(); a.calculateInterest(); a.operationIndex += 2; }

21 Zdanie with Jest to wariant ‘for each’, w którym przetwarzany jest dokładnie jeden obiekt. withStatementVCS ::=     VideExpressionVCS 'with' statementVCS |  VideExpressionVCS 'with' '{' simpleNameCS '|' statementsVCS '}' Przykład: emp1 with { job := 'programmer'; salary *= 1.1; }

22 Deklaracje zmiennych VideExpressionVCS ::= OclExpressionCS| createExpressionVCS VariableDeclarationVCS ::= simpleNameCS ':' typeVCS ('=' VideExpressionVCS)? Typ powoływanej zmiennej jest obowiązkowy, natomiast wyrażenie inicjujące powoływaną zmienną nie jest obowiązkowe. W części imperatywnej języka liczność kolekcji może być zdefiniowana jawnie, w ramach collectionTypeVCS. Nie dotyczy to OCL. typeVCS ::= typeCS| collectionTypeVCS collectionTypeVCS ::= CollectionTypeIdentifierCS '[' CollectionRangeVCS ']' '(' typeCS ')' Forma bez określania liczności kolekcji jest również możliwa. Bag[1..30](Integer) Sequence[2..*](String) OrderedSet[7..15](String) Przykłady: CollectionRangeVCS ::=     IntegerLiteralExpCS '..' IntegerLiteralExpCS | IntegerLiteralExpCS '..' '*' | '*' Pojedyncza gwiazdka jest równoważna 0..*.

23 Większy przykład – z-Shop
Cel przykładu: osadzenie w procesie biznesowym (model konwersacji z usługami zewnętrznymi) łatwa redefinicja logiki aplikacji (np. kalkulacja rabatów czy kosztów dostawy zamówienia) zarządzanie trwałymi danymi wsparcie dla platformy implementacyjnej z relacyjną bazą danych; dostęp poprzez obiektowe API (JDO?) komunikacja z istniejącymi wcześniej systemami – poprzez Web Services Uwagi ogólne: Część klas posłuży jako definicje struktur z sygnatur wołanych usług zewnętrznych. Jedna z klas posłuży jako „pojemnik” na główną funkcjonalność i skład danych; Dodatkowy problem stanowi obiektowość struktury danych a mechanizm przechowywania (mapowanie O-R).

24 Wymagania funkcjonalne (przypadki użycia)

25 Model konwersacji

26 Interfejsy Web Services dostawcy
VIDE traktuje Web Services w sposób transparentny – programista aplikacji widzi je jak normalne metody: Wołanie usług Web Services w modelu w sposób analogiczny do wywołań lokalnych metod. Import definicji usług z WSDL do postaci specyfikacji klas/interfejsów w VIDE (i odwrotnie).

27 Struktura danych po stronie sklepu

28 Przykład kodu VIDE dla metody Shop::processOrder
processOrder(in customerId : Integer) : Boolean Sygnatura metody: res : Boolean = false; customer->select(custId = customerId) with { res := placeOrder(); } return res; Ciało metody: Pominięto sprawdzenie, czy identyfikator klienta istnieje w systemie. Niniejszy przykład wykorzystuje klauzulę with, która pozwala uruchomić sekwencję dowolnych instrukcji imperatywnych w środowisku obiektu znajdującego się po jej lewej stronie. Stanowi odpowiednik foreach, ale wzmocniony dodatkową dynamiczną kontrolą, czy wyrażenie po lewej stronie with zwraca dokładnie jeden element rezultatu. Metody pozbawione efektów ubocznych mogą być wołane wewnątrz wyrażeń OCL. Ponieważ nie kontrolujemy obecności efektów ubocznych w metodach, powyższe ciało metody można zapisać następująco: return customer->select(custId = customerId).placeOrder();

29 Przykład kodu VIDE dla metody Customer::placeOrder
Sygnatura metody: placeOrder() : Boolean item : OrderLine [0..*]; // struktura danych wymagana dla wywołania serwisu orderNo : Integer; basket.basketContent foreach { bc | item insert OrderLine create { productId := bc.prodId; quantity := bc.qty } } orderNo := productOrdersRef.reserve(items); // wywołanie serwisu if(orderNo=0) return false // produkt niedostępny else this link order to Order create { orderId := orderNo; orderItem insert items } return true; Ciało metody:

30 Co dalej? W MDA po napisaniu kodu na poziomie PIM powinno nastąpić jego rozłożenie na elementy metamodelu PIM, w danym przypadkuUML + OCL. Na nim mogą działać dodatkowe narzędzia, np. kontrola jakości lub aspektowość. Następnie z tego modelu odpowiedni kompilator modelu powinien wyprodukować model na poziomie PSM, np. metamodel dla J2EE. Następnie z tego drugiego metamodelu powinien być wygenerowany kod. który może być uruchomiony na konkretnej platformie. Podejście VIDE zmienia tę sytuację poprzez umożliwienie pisania, debugowania i optymalizowania programów na poziomie PIM: OCL jest optymalizowany, po tej optymalizacji generowanie kodu dla PSM może być utrudnione i/lub może zniszczyć efekt optymalizacyjny. Dostęp do zewnętrznych zasobów (RDB, XML, WS) następuje poprzez wrappery zaimplementowane na poziomie PIM. Wywołanie tych wrapperów na poziomie PSM może stać się niemożliwe. W efekcie, VIDE nieco rozkłada koncepcję MDA, podważając jej fundamentalne założenia …. które dla większości przypadków nie wydają się rozsądne. Trwałymi zdobyczami VIDE jest więc: programowanie na wyższym poziomie abstrakcji bezszwowa integracja narzędzia implementacyjnego z narzędziem projektowym (UML)


Pobierz ppt "Standardy w zakresie systemów rozproszonych i baz danych"

Podobne prezentacje


Reklamy Google