Standardy w zakresie systemów rozproszonych i baz danych

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Programowanie obiektowe
Procedury wyzwalane Procedura wyzwalana (ang. trigger) - stanowi kod użytkownika przechowywany wewnątrz bazy i uruchamiany w określonych sytuacjach np.
Wzorce.
Język ANSI C Funkcje Wykład: Programowanie komputerów
Programowanie I Rekurencja.
Wprowadzenie do języka skryptowego PHP – cz. 2
© K.Subieta. Konstrukcja systemów obiektowych i rozproszonych 3, Folia 1 październik 2004 Konstrukcja systemów obiektowych i rozproszonych Wykładowca:
PROGRAMOWANIE STRUKTURALNE
Tworzenie i obsługa programów – przykład 3 uwagi cd. Wykorzystując różne klasy biblioteki języka Java należy pamiętać w jakim pakiecie się znajdują. Wszystkie.
Projektowanie systemów informacyjnych
Generyczne Repozytorium Dokumentów w XML
PySBQL Język zapytań dla obiektowych baz danych. Aplikacje bazodanowe Główny nurt budowania aplikacji opiera się na połączeniu: SQL JDBC Java Jak wyświetlić
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
ODE Triggery. Wstęp n Triggery są trójką zdarzenie-warunek-akcja (event-condition- action). n Zdarzenia mogą być proste lub złożone, co zostanie omówione.
Inżynieria oprogramowania Lecture XXX JavaTM – część IV: IO
Kurs Pascala – spis treści
Java – programowanie obiektowe
Projektowanie i programowanie obiektowe II - Wykład IV
Modele baz danych - spojrzenie na poziom fizyczny
Schemat Hornera Mgr inż. Michał Szucki.
Podstawy programowania
Podstawy programowania
Automatyczne dereferencje w języku SBQL
Podstawy programowania
A ctive S erver P ages Technologia dostępu do danych.
© A. Jędryczkowski – 2006 r. © A. Jędryczkowski – 2006 r.
Źródła: podręcznikopracował: A. Jędryczkowski.
MDA – Model Driven Architecture
Programowanie obiektowe – zastosowanie języka Java SE
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
STEROWANIE Ale nie tylko
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Języki i środowiska programowania systemów rozproszonych, Wykład 03, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Języki i środowiska programowania systemów rozproszonych, Wykład 05, Slajd Języki i środowiska programowania systemów rozproszonych Wykładowca:
Rozwiązanie zadań do zaliczenia I0G1S4 // indeks
Podstawy informatyki 2013/2014
Programowanie obiektowe 2013/2014
ZWIĄZKI MIĘDZY KLASAMI KLASY ABSTRAKCYJNE OGRANICZENIA INTERFEJSY SZABLONY safa Michał Telus.
Zajęcia I Organizacja zajęć Rejestracja i uruchamianie makr
Podstawy języka Instrukcje - wprowadzenie
UML W V ISUAL S TUDIO Mateusz Lamparski. UML D EFINICJA Unified Modeling Language (UML) to graficzny język do obrazowania, specyfikowania, tworzenia i.
Model obiektowy bazy danych
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
Projektowanie obiektowe. Przykład: Punktem wyjścia w obiektowym tworzeniu systemu informacyjnego jest zawsze pewien model biznesowy. Przykład: Diagram.
Projektowanie bazy danych z użyciem diagramów UML Obiektowe projektowanie relacyjnej bazy danych Paweł Jarecki.
Waldemar Bartyna 1 Programowanie zaawansowane LINQ to XML.
Platforma .Net.
Łukasz Bieszczad Mateusz Gałązka Karol Włodarek
Podsumowanie wiedzy MPDI2 sem.3 INFORMATYKA. tworzenie nowego pliku i katalogu, nawigacja po katalogach, listowanie zawartości katalogu, zmiana nazw,
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
PHP jest językiem skryptowym służącym do rozszerzania możliwości stron internetowych. Jego składnia jest bardzo podobna do popularnych języków programowania.
Wstęp do programowania Wykład 2 Dane, instrukcje, program.
Visual Basic przygotował Michał Miłek Visual Basic – język programowania wysokiego poziomu i narzędzie programistyczne firmy Microsoft. Składnia jest oparta.
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
Dominik Benduski Michał Mandecki Podstawy Visual Basic w Excelu.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Programowanie Obiektowe – Wykład 6
Programowanie Obiektowe – Wykład 2
Strukturalny język zapytań SQL - historia
Programowanie obiektowe – zastosowanie języka Java SE
Haskell Składnia funkcji.
PGO Dziedziczenie Michail Mokkas.
Modele baz danych - spojrzenie na poziom fizyczny
Zapis prezentacji:

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

Całościowa architektura systemu VIDE

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)

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

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

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.

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

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);

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 ]

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)

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;

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!’ }

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

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.

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.

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.

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 ')'

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:

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)?

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; }

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; }

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..*.

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).

Wymagania funkcjonalne (przypadki użycia)

Model konwersacji

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).

Struktura danych po stronie sklepu

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();

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:

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)