Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

P.Habela, K.Subieta. SSR, Wykład 11, Folia 1 maj 2009 Standardy w zakresie systemów rozproszonych i baz danych Piotr Habela Kazimierz Subieta Polsko-Japońska.

Podobne prezentacje


Prezentacja na temat: "P.Habela, K.Subieta. SSR, Wykład 11, Folia 1 maj 2009 Standardy w zakresie systemów rozproszonych i baz danych Piotr Habela Kazimierz Subieta Polsko-Japońska."— Zapis prezentacji:

1 P.Habela, K.Subieta. SSR, Wykład 11, Folia 1 maj 2009 Standardy w zakresie systemów rozproszonych i baz danych Piotr Habela Kazimierz Subieta Polsko-Japońska Wyższa Szkoła Technik Komputerowych, Warszawa Wykład 11: c.d. Wprowadzenie do OCL

2 P.Habela, K.Subieta. SSR, Wykład 11, Folia 2 maj 2009 Specyfikacja OCL (1) Deklarowanie zmiennych OclExpressionCS ::= 'let' VariableDeclarationListCS 'in' OclExpressionCS –Przykład: let zmienna: TypZmiennej = wyrażenie1 in wyrażenie2 Operator if OclExpressionCS ::= 'if' OclExpressionCS 'then' OclExpressionCS 'else' OclExpressionCS 'endif' –W OCL dla wyrażenia 'if' część 'else' jest obowiązkowa –Przykład: if wiek < 35 then młody' else stary' Porównania OclExpressionCS ::= OclExpressionCS Porównanie OclExpressionCS Porównanie ::= '=' | '<>' | ' ' | ' = Operatory arytmetyczne OclExpressionCS ::= OclExpressionCS OperatorArytmet OclExpressionCS OperatorArytmet ::= +' | -' | *' | /'

3 P.Habela, K.Subieta. SSR, Wykład 11, Folia 3 maj 2009 Wołanie operacji infiksowych OclExpressionCS ::= OclExpressionCS simpleNameCS OclExpressionCS –simpleNameCS pochodzi z biblioteki OCL –Przykład: booleanExpression1 implies booleanExpression2 Wołanie operacji prefiksowych OclExpressionCS ::= '-' OclExpressionCS | simpleNameCS OclExpressionCS –Przykład: not booleanExpression Iteratory na pojedynczych zmiennych OclExpressionCS ::= OclExpressionCS '->' simpleNameCS '(' VariableDeclarationCS '|' OclExpressionCS ')' –Przykłady: employees -> select (e | e.age < 50) employees -> select (p: Person | p.age < 50) Iteratory na dwóch zmiennych OclExpressionCS ::= OclExpressionCS '->' simpleNameCS '(' VariableDeclarationCS ',' VariableDeclarationCS '|' OclExpressionCS ')' –Pierwsze OclExpressionCS musi być pojedynczą nazwą –Przykład: employees -> forAll (e1, e2 | e1 <> e2 implies e1.empno <> e2.empno) Specyfikacja OCL (2)

4 P.Habela, K.Subieta. SSR, Wykład 11, Folia 4 maj 2009 Specyfikacja OCL (3) Wołanie operacji na kolekcjach OclExpressionCS ::= OclExpressionCS '->' simpleNameCS '(' ')' –Przykład: employees -> count() OclExpressionCS ::= OclExpressionCS '->' simpleNameCS '(' OclExpressionCS argumentsCS_trail ')' –Przykład: employees -> sortedBy(surname) –argumentsCS_trail – być może pusta lista dalszych argumentów Zwyczajne wołanie operacji OclExpressionCS ::= OclExpressionCS '.' simpleNameCS '(' argumentsCS ')' –Przykład: employees -> select (age < 35).raise(100) Wiązanie atrybutu lub zmiennej OclExpressionCS ::= OclExpressionCS '.' simpleNameCS | simpleNameCS Wołanie operacji OclExpressionCS ::= simpleNameCS '(' ')' | simpleNameCS '(' argumentsCS ')'

5 P.Habela, K.Subieta. SSR, Wykład 11, Folia 5 maj 2009 OCL – ścieżki dostępu, literały Ścieżki: pathNameCS ::= simpleNameCS '::' simpleNameCS | simpleNameCS '::' pathNameCS –Ta reguła reprezentuje ścieżkę nazw, która jest używana do dostępu do nazw (np. typów) w innych pakietach. –Przykład: packageA::subpackageA1::typeX Literały: LiteralExpCS ::= CollectionLiteralExpCS| TupleLiteralExpCS| PrimitiveLiteralExpCS CollectionLiteralExpCS ::= CollectionTypeIdentifierCS '{ CollectionLiteralPartsCS '}' –Przykłady: OrderedSet {'first', 'second', 'third'} Bag {10, 20, 10, 50, 50} –Identyfikatory kolekcji: 'Set', 'Bag', 'Sequence', 'OrderedSet' Literały kolekcji określane przez zakres: CollectionRangeCS ::= OclExpressionCS '..' OclExpressionCS –Przykład: Sequence { 1..12, }

6 P.Habela, K.Subieta. SSR, Wykład 11, Folia 6 maj 2009 Prymitywne literały i krotki Prymitywne literały PrimitiveLiteralExpCS ::= IntegerLiteralExpCS | RealLiteralExpCS | StringLiteralExpCS | BooleanLiteralExpCS –Włączają literały: Real, Boolean, Integer, String Krotki (struktury) TupleLiteralExpCS ::= 'Tuple' '{' VariableDeclarationListCS '} –Reguła reprezentuje literały reprezentujące krotki –Przykład: Tuple {name: String = 'John', surname: String = 'Brown', age: Integer = 47}

7 P.Habela, K.Subieta. SSR, Wykład 11, Folia 7 maj 2009 Deklaracje zmiennych, typy i argumenty VariableDeclarationCS ::= VariableDeclarationCS_strict | simpleNameCS –Typ i wyrażenie inicjujące są opcjonalne. –Przykłady: p: Person i: Integer = 7 VariableDeclarationCS_strict ::= simpleNameCS ':' typeCS | simpleNameCS ':' typeCS '=' OclExpressionCS | simpleNameCS '=' OclExpressionCS typeCS ::= simpleNameCS | pathNameCS | collectionTypeCS | tupleTypeCS collectionTypeCS ::= CollectionTypeIdentifierCS '(' typeCS ')' –Przykłady: Bag(Integer) Sequence(String) OrderedSet(String) tupleTypeCS ::= 'TupleType' '(' VariableDeclarationListCS ')' –Przykład: TupleType(name: String, surname: String, age: Integer) argumentsCS ::= OclExpressionCS argumentsCS_trail ? argumentsCS_trail ::= ',' OclExpressionCS argumentsCS_trail ?

8 P.Habela, K.Subieta. SSR, Wykład 11, Folia 8 maj 2009 Operacje na typie Boolean OperatorPrzykładTyp rezultatuOpis ora or bBooleanAlternatywa anda and bBooleanKoniunkcja xora xor bBoolean Alternatywa wyłączna notnot aBooleanNegacja =a = bBooleanRówność <>a <> bBooleanNierówność impliesa implies bBooleanImplikacja

9 P.Habela, K.Subieta. SSR, Wykład 11, Folia 9 maj 2009 Operacje na typach Integer i Real OperatorPrzykładTyp rezultatuOpis = <>a = bBooleanRówność, nierówność < <=a < bBooleanMniejszy, mniejszy lub równy > >=a > bBooleanWiększy, większy lub równy + -a + bInteger lub RealDodawanie, odejmowanie * /a * bInteger lub RealMnożenie, dzielenie moda.mod(b)IntegerModullo (reszta od dzielenia) diva.div(b)IntegerDzielenie liczb całkowitych absa.abs()Integer lub RealWartość absolutna maxa.max(b)Integer lub RealWartość maksymalna z a i b mina.min(b)Integer lub RealWartość minimalna z a i b rounda.round()IntegerWartość zaokrąglona floora.floor()IntegerWartość zaokrąglona w dół

10 P.Habela, K.Subieta. SSR, Wykład 11, Folia 10 maj 2009 Operacje na typie String Postfiksowa konwencja a la Smalltalk nie jest fortunnym pomysłem twórców OCL Klasyczna konwencja, np. toUpper(a), wydaje się dużo lepsza. OperatorPrzykładTyp rezultatuOpis = <>a = bBooleanRówność, nierówność concat + a.concat(b) a + b StringKonkatenacja Konkatenacja dodana w VIDE toLowera.toLower()StringZmiana na małe litery toUppera.toUpper()StringZmiana na duże litery substringa.substring(i, j)StringWybranie podstringu od i-tego do j-tego znaku

11 P.Habela, K.Subieta. SSR, Wykład 11, Folia 11 maj 2009 Standardowe operatory na kolekcjach OperatorPrzykład Typ rezultatu Opis countx->count(y)IntegerLiczba wystąpień obiektu y w kolekcji x excludesx->excludes(y)BooleanTrue jeżeli y nie jest elementem x excludesAllx->excludesAll(y)Boolean True jeżeli nie ma elementu kolekcji y, który jest jednocześnie elementem x includesx->includes(y)BooleanTrue jeżeli y jest elementem x includesAllx->includesAll(y)BooleanTrue jeżeli wszystkie elementy kolekcji y są w x isEmptyx->isEmpty()BooleanTrue jeżeli kolekcja x jest pusta notEmptyx->notEmpty()BooleanTrue jeżeli kolekcja x jest niepusta

12 P.Habela, K.Subieta. SSR, Wykład 11, Folia 12 maj 2009 Funkcje agregowane OperatorPrzykład Typ rezultatu Opis sizex->size()IntegerLiczba elementów w kolekcji x sumx->sum()Integer lub RealSuma arytmetyczna elementów kolekcji x avgx->avg()RealŚrednia arytmetyczna elementów kolekcji x minx->min() Integer, Real lub String Najmniejsza wartość w kolekcji x maxx->max() Integer, Real lub String Największa wartość w kolekcji x Operatory sum, avg, min i max zostały wprowadzone w VIDE, są rozszerzeniem standardu.

13 P.Habela, K.Subieta. SSR, Wykład 11, Folia 13 maj 2009 Dalsze operatory na kolekcjach (1) OperatorPrzykład Typ rezultatu Opis =x = yBooleanIdentyczność kolekcji x i y <>x <> yBooleanPrzecięcie kolekcji x i y jest puste -x - yset Różnica zbiorów: wynik zawiera te elementy x, których nie ma w y appendx->append(o) OrderedSet lub Sequence Dodaj element o na koniec sekwencji x asBagx->asBag()BagKonwersja do Bag asOrderedSetx->asOrderedSet()OrderedSetKonwersja do OrderedSet asSequencex->asSequence()SequenceKonwersja do Sequence asSetx->asSet()SetKonwersja do Set

14 P.Habela, K.Subieta. SSR, Wykład 11, Folia 14 maj 2009 Dalsze operatory na kolekcjach(2) OperatorPrzykład Typ rezultatu Opis atx->at(i)object Zwraca element kolekcji x znajdujący się na pozycji i excludingx->excluding(o)collection Zwraca kolekcję x pomniejszoną o element o firstx->first()objectPierwszy element kolekcji x flattenx->flatten()collection Spłaszcza zagnieżdżoną kolekcję x o jeden poziom includingx->including(o)collectionZwraca kolekcję x zwiększoną o element o indexOfx->indexOf(o)Integer Zwraca numer pozycji elementu o w kolekcji x insertAtx->insertAt(i, o) OrderedSet lub Sequence Zwraca OrderedSet lub Sequence, w których wstawiony został element o na pozycję i intersectionx->intersection(y)Set lub BagPrzecięcie kolekcji x i y lastx->last()objectOstatni element w kolekcji x

15 P.Habela, K.Subieta. SSR, Wykład 11, Folia 15 maj 2009 Dalsze operatory na kolekcjach (3) Wątpliwości budzi redundancja operatorów, np. symmetricDifference łatwo wyrazić przez sumę i różnicę kolekcji: x sD y = (x – y) (y – x) = (x y) – (x y) Niekiedy ma znaczenie, czy operacja jest dokonywana na zapamiętanej kolekcji, czy też na kolekcji obliczonej poprzez zapytanie. Np. wstawienie nowego elementu do zapamiętanego zbioru (including) jest nieco inną operacją. OperatorPrzykład Typ rezultatu Opis prependx->prepend(o) OrderedSet lub Sequence Dodaje element o jako pierwszy przed kolekcją x subOrderedSetx->subOrderedSet(i, j)OrderedSet Wybiera elementy sekwencji od i- tego do j-tego; rezultat typu OrderedSet subSequencex->subSequence(i, j)Sequence Wybiera elementy sekwencji od i- tego do j-tego; rezultat typu Sequence symmetricDifference x -> symmetricDifference (y)Set Zawiera elementy x, których nie ma w y, i vice versa unionx->union(y)collection Suma dwóch kolekcji lub konkatenacja sekwencji

16 P.Habela, K.Subieta. SSR, Wykład 11, Folia 16 maj 2009 Operatory pętli i zmienne iteracyjne (1) OperatorPrzykład Typ rezultatu Opis anyx->any(e)object Wybiera dowolny element z kolekcji x dla którego wyrażenie e jest prawdziwe collectx->collect(e)collection Projekcja: zwraca wartości wyrażenia e dla każdego elementu kolekcji x collectNested x-> collectNested(e) collection Tak samo jak dla collect, ale dotyczy to kolekcji kolekcji iterate x->iterate( i: Type1; a: Type2=e1 | e2) Type2 Zmiennej a jest początkowo przypisana wartość wyliczona przez e1. Zmienna iteracyjna i iteruje po kolekcji x i w każdym obrocie jest wyliczane e2 dla tego i oraz a. Wartość ta jest podstawiana pod a. Funkcja agregowana sum: x->iterate(i: Integer; a: Integer=0 | a+i) Funkcja agregowana max: x->iterate(i: Integer; a: Integer= -9999| i.max(a))

17 P.Habela, K.Subieta. SSR, Wykład 11, Folia 17 maj 2009 Operatory pętli i zmienne iteracyjne (2) OperatorPrzykład Typ rezultatu Opis existsx->exists(e)Boolean Kwantyfikator egzystencjalny: zwraca true jeżeli e jest true dla przynajmniej jednego elementu x forAllx->forAll(e)Boolean Kwantyfikator uniwersalny: zwraca false jeżeli e jest false dla przynajmniej jednego elementu x isUniquex->isUnique(e)Boolean Zwraca true jeżeli wyrażenie e zwraca różną wartość dla każdego elementu x onex->one(e)Boolean Zwraca true jeżeli e jest true dla dokładnie jednego elementu x rejectx->reject(e)collectionZwraca te elementy x, dla których e jest false selectx->select(e)collectionZwraca te elementy x, dla których e jest true sortedByx->sortedBy(e) OrderedSet lub Sequence Zwraca elementy kolekcji x posortowane zgodnie z wyrażeniem e

18 P.Habela, K.Subieta. SSR, Wykład 11, Folia 18 maj 2009 Przykłady wykorzystania OCL w VIDE Utwórz nowego pracownika newEmp := Emp create {name = John; address = 44th Street; salary = 3000} Podaj nazwiska pracowników, których szefem jest Bert: Emp->select(worksIn.boss.name=Bert).name Dla każdego pracownika, którego szefem jest Smith i zarabiającego mniej niż 2000 podwyższ zarobek o 100: (Dept ->select (boss.name = Smith).employs -> select (salary < 2000) foreach salary += 100; Czy to prawda, że w każdym dziale istnieje pracownik zarabiający więcej od swego szefa? (Dept -> forAll(d | d.employs -> exists(e | e.salary > d.boss.salary)) Emp name : String address : String salary: Integer Dept name : String location: String[1..*] boss[0..1] employs[0..*] worksIn

19 P.Habela, K.Subieta. SSR, Wykład 11, Folia 19 maj 2009 Dalsze przykłady (1) Dept->allInstances()->select(name=toys).employs->size() Dept->allInstances()->select(name=toys).employs.salary->sum() Dept->allInstances()->select(name=toys).employs.salary->avg() Dept->allInstances()->select(name=toys).employs.salary->min() Dept->allInstances()->select(name=toys).employs.salary->max() Niech Person będzie nadklasą dla Emp, zaś getIncome metodą zdefiniowaną dla Emp. Wówczas można wykorzystać dziedziczenie i polimorfizm: Person->allInstances()->collect(getIncome())->sum() Można także uzyskać efekt operatora zależnego złączenia (podaj identyfikator działu pod dept i sumaryczny zarobek pod totalSal): Dept->allInstances()->collect(d | Tuple{ dept = d, totalSal = d.employs.getSalary()->avg() } ) –Tuple jest konstruktorem struktury allInstances: jeżeli przed -> jest nazwa klasy, to operator ten odzyskuje wszystkie obiekty tej klasy.

20 P.Habela, K.Subieta. SSR, Wykład 11, Folia 20 maj 2009 Dalsze przykłady i porównanie z SBQL Dla każdej lokacji działu podaj zbiór nazw działów, które są tam ulokowane: Dept->allInstances()->collect(location)->asSet() ->collect(loc | Tuple{ L = loc, Dnames = (Dept->allInstances->select(location=loc)->collect(name))}) To samo zapytanie w SBQL (44 -> 22 jednostki leksykalne): unique(Dept.location) as L join ((Dept where L in location).name) groupas Dnames Dla każdej lokacji działu podaj zbiór nazw działów, które są tam ulokowane oraz średni zarobek szefów tych działów: Dept->allInstances()->collect(location)->asSet() ->collect(loc | Tuple{ L = loc, Dnames = Dept->allInstances->select(location=loc)->collect(name), bossAvg = Dept->allInstances->select(location=loc) ->collect(d | d.boss.salary)->avg()}) To samo zapytanie w SBQL: unique(Dept.location) as loc join ((Dept where loc in location) groupas d). (loc as L, (d.name) groupas Dnames, (d.boss.Emp.salary) as bossAvg))

21 P.Habela, K.Subieta. SSR, Wykład 11, Folia 21 maj 2009 Jeszcze przykłady Podaj miasta goszczące wszystkie działy: Dept->allInstances()-> select(d | (Dept->allInstances()->collect(location)->asSet()) ->forAll(loc | d.location -> exists(dloc | loc = dloc))) Załóżmy, że klasa Dept ma metodę budget pozwalającą na obliczenie rocznego budżetu działu. Dla każdego pracownika działu zlokalizowanych w Radomiu przygotuj komunikaty stringowe zawierające nazwisko oraz procent rocznego budżetu konsumowany przez tego pracownika. Emp->allInstances()->select(e | e.worksIn.location -> includes(Radom))-> collect(Employee + name + consumes + (salary * 12 * 100 /(e.worksIn.Dept.budget())) + % of the " + worksIn.Dept.name + department budget.) Zapis oryginalny w OCL: Emp->allInstances()->select(e | e.worksIn.location -> includes(Radom))-> collect(Employee.concat(name). concat( consumes ). concat(salary * 12 * 100 /(e.worksIn.Dept.budget()). concat( % of the ). concat(worksIn.Dept.name). concat( department budget.))

22 P.Habela, K.Subieta. SSR, Wykład 11, Folia 22 maj 2009 …i jeszcze przykład Dla każdego przedziału, n = 0, 1000, 2000, 3000,... przygotuj komunikat zawierający liczbę pracowników mających zarobek z tego przedziału i sam przedział. Komunikaty wyjściowe powinny mieć poprawną formę gramatyczną (w języku angielskim): przyrostki –s dla liczby mnogiej rzeczowników i dla czasowników w liczbie pojedynczej. Bag {0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000} -> collect(i | Emp->allInstances()->select(salary >= i and salary size()-> collect(c | if c = 1 then 1 + employee earns between + i + and + (i+999) else c + employees earn between + i + and + (i+999))

23 P.Habela, K.Subieta. SSR, Wykład 11, Folia 23 maj 2009 Przykłady użycia OCL w zdaniach imperatywnych Daj minimalną płacę dla tych pracowników, którzy nie mają jeszcze określonej płacy. Emp->allInstances()->select(salary->size() = 0) foreach { e | e.raiseSalary(e.worksIn.getSalary()->min()); } Przesuń wszystkich pracowników z działu zabawek do działu badawczego Dept->allInstances()->select(name = Toys)->collect(employs) foreach { e |e unlink worksIn; e link worksIn to Dept->allInstances() ->select(name = Research);} Inny wariant: Emp->allInstances()->select(worksIn.name = Toys) foreach { e | e unlink worksIn; e link worksIn to Dept->allInstances()->select(name = Research);} Daj 10% podwyżki wszystkim studentom, którzy są jednocześnie pracownikami działu znajdującego się w Warszawie: EmpStudent->allInstances()->select(worksIn.location->select(m| m = Warsaw) ) foreach { es | es.raiseSalary(es.getSalary * 0.1)); } Niektóre zapytania trudno uznać za łatwe, ale ważne jest, że da się je zadać.

24 P.Habela, K.Subieta. SSR, Wykład 11, Folia 24 maj 2009 Plusy i minusy OCL Plusy: –Język obsługuje pełny model obiektowy UML –Jest ortogonalny (brak dużych zlepków takich jak select…from…where…group by…having...order by…) –Jest dość popularny w środowisku UML –Łatwa intuicyjna semantyka Minusy –Fatalna składnia, przerosty składniowe, nieczytelne wyrażenia –Jak dotąd, nie ma programistów w OCL –Brak uniwersalności (np. żadnych możliwości rekurencyjnych) –Niedospecyfikowanie (np.. brak semantyki dla zakresów nazw) –Redundantny i trochę przypadkowy wybór funkcjonalności –Nieprzystosowanie do roli języka zapytań (brak optymalizacji) –Brak myślenia o zanurzeniu OCL w uniwersalny język programowania –Brak perspektyw baz danych i innych abstrakcji programistycznych –Brak efektów ubocznych –Niejasny stosunek do wartości zerowych (podważa przykrycie SQL, gdzie wartości zerowe są ważną funkcjonalnością) –Niespójność i przecinanie się funkcjonalności OCL z funkcjonalnością UML 2.1 –…


Pobierz ppt "P.Habela, K.Subieta. SSR, Wykład 11, Folia 1 maj 2009 Standardy w zakresie systemów rozproszonych i baz danych Piotr Habela Kazimierz Subieta Polsko-Japońska."

Podobne prezentacje


Reklamy Google