PAT: persistence aspect Tomasz Nazar Wrocław, 08.03.2005
Jaki jest cel prezentacji? Zaznajomienie z Prevayler Zaprezentowanie aspektu zagadnienia trwałości W jaki sposób i na ile da się ukryć warstwę danych Pogłębienie wiedzy na temat wykorzystania technik aspektowych
Plan Motto Historia Motywacja do napisania Aplikacja kliencka Prevayler PAT
Motto Simplicity is the key Lubię programować obiektowo Nie lubię powtarzać kodu Lubię mieć krótki kod
Motto Simplicity is the key Lubię programować obiektowo Nie lubię powtarzać kodu Lubię mieć krótki kod
Historia 2002 pierwsza praca, RDBMS 2003 WS, Obiekty, TDD, XP, Prevayler, Ilybra 2004 Siemens, AOSD, PAT, KKIO'04 2005 AOSD'05,...
Motywacja do napisania PAT
Motywacja Frustracja z użyciem dostępnych technik tworzenia warstwy danych dla aplikacji Zbyt dużo czasu poświęcane na realizację niefunkcjonalnych wymagań aplikacji Czas, który możemy zyskać, przeznaczymy na realizację wymagań biznesowych Brak warstwy danych daje prostsze oprogramowanie Prostota = Czas = Pieniądze = :-)
1 krok: Aplikacja Ilybra
System biblioteczny Z perspektywy bibliotekarza: Dodanie książki, nowa klasyfikacja, nowa osoba, edycja książki, ładowanie książki, prolongata, zwrot, uaktualnienie książki, wszystkie książki, przeszukiwanie książek (różne kategorie), anulowanie wypożyczenia, wypożyczenie książki, pokazanie rekordu histori, załadowanie czytelnika, dodanie czytelnika, edycja czytelnika, uaktualnienie czytelnika, wszyscy czytelnicy, wszystkie książki, wielotomowe, logowanie 32 prostych akcji i więcej, 41 obiektów biznesowych..
Przykładowa akcja Przykład 7-6. Implementacja Library public Book lendbook(book book, Reader reader) { book.lend(reader); reader.lend(book); } return book; Przykład 7-9. Wypożyczenie książki czytelnikowi public void lendbookaction(..) { //reader_barcode, book_barcode lent = library.getlentbooks(book_barcode); if (lent) alert("book already lent"); library.lendbook(book_barcode, reader_barcode); } return OK;
2 krok: Prevayler
Prevayler Poszukiwania prostego, szybkiego rozwiązania satysfakcjonującego nasze potrzeby w zakresie pamiętania danych Prevayler Zalety: Szybki start (ang. time to market ), obiektowy, mocna kontrola typów, szybkość działania Wady: Ilość danych, tworzenie transakcji, popularność
Prevayler Korzeń (root) Przykład 5-1. Przykład korzenia public class World { public Departments departments; public Employees employees; /*... */ } Korzeń Obiekty
Prevayler Gdzie trzymane są dane? W pamięci operacyjnej Kopia bezpieczeństwa na dysku Serializacja Zapis danych: Dziennikowanie (ang. journalling) Transakcje Migawka (ang. snapshot) Zapis całości Schemat działania na obiektach...
Prevayler Gdzie trzymane są dane? W pamięci operacyjnej Kopia bezpieczeństwa na dysku Serializacja Zapis danych: Dziennikowanie (ang. journalling) Transakcje Migawka (ang. snapshot) Zapis całości Schemat działania na obiektach...
Obiekty Linia czasu 0.00 7.00...
Obiekty Linia czasu 0.00 T1.transakcja0(R, a, b) 7.00...
Obiekty Linia czasu 0.00 T1.transakcja0(R, a, b) T2.transakcja1(a, b) 7.00...
Obiekty Linia czasu 0.00 T1.transakcja0(R, a, b) T2.transakcja1(a, b) T1.transakcja2(c) 7.00...
Obiekty Linia czasu 0.00 T1.transakcja0(R, a, b) T2.transakcja1(a, b) T1.transakcja2(c) T3.transakcja3(d,...) 7.00...
Obiekty Linia czasu 0.00 T1.transakcja0(R, a, b) T2.transakcja1(a, b) T1.transakcja2(c) T3.transakcja3(d,...)... 7.00...
Obiekty Linia czasu 0.00 T1.transakcja0(R, a, b) T2.transakcja1(a, b) T1.transakcja2(c) T3.transakcja3(d,...)... 7.00 T8.transakcja17(X)...
Obiekty Linia czasu 0.00 T1.transakcja0(R, a, b) T2.transakcja1(a, b) T1.transakcja2(c) T3.transakcja3(d,...)... 7.00 T8.transakcja17(X) T9.transakcja18(X)...
Obiekty Linia czasu 0.00 T1.transakcja0(R, a, b) T2.transakcja1(a, b) T1.transakcja2(c) T3.transakcja3(d,...)... 7.00... T8.transakcja17(X) T9.transakcja18(X)...
Obiekty Linia czasu 0.00 T1.transakcja0(R, a, b) T2.transakcja1(a, b) T1.transakcja2(c) T3.transakcja3(d,...)... 7.00... T8.transakcja17(X) T9.transakcja18(X)......
Transakcje Każda zmiana stanu systemu w transakcji Przykład 5-2. Transakcja realizująca dodanie nowego pracownika. public class AddEmployee extends TransactionWithQuery { private Employee employee; public AddEmployee(Employee employee){ this.employee = employee; } public Object executeandquery(object prevsystem) throws Exception{ World system = (World)prevSystem; /* tutaj umieszczona jest logika biznesowa */ Department department = world.getdepartment("it"); department.add(employee); } } return employee;
3 krok: Programowanie aspektowe
4 krok: PAT
Czym jest warstwa danych? Część oprogramowania zajmująca się zarządzaniem trwałymi danymi w aplikacjach - obsługa systemu baz danych Pobieranie i przeszukiwanie danych Dodawanie nowych danych Usuwanie danych Inicjalizacja i zatrzymanie systemu Ewolucja schematu danych Rozróżnienie danych trwałych i nietrwałych Transakcje
Zasady tworzenia aspektu Jak ma wyglądać kod aplikacji? Wybór języka aspektowego
Jaką bazę wykorzystam? Wykorzystanie cech Prevayler: Przezroczyste: Dodawanie danych Przeszukiwanie, pobieranie danych Usuwanie danych Wymaga kodowania: Transakcje Aspekty nie pomagają: Ewolucja schematu
Co powstało? Nazywa się to: PAT Jest zaimplementowane z użyciem JBossAOP adnotacje w przyszłości AspectJ http://patsystem.sf.net
PAT Jaki kod wyszedł?
Przykład 7-2. PAT - deklaracja obiektu biznesowego /** @@pat.bo */ public class Reader {... } Przykład 7-3. PAT - dostęp do danych public void findsomebookcards() { library = new Library(); bookcards = library.getbookcards(); } for (int i=0; i>bookcards.size(); i++) { bookcard = bookcards.next(); }
Przykład 7-5. PAT - uaktualnianie danych /** @@pat.bo */ public class Book { } /** @@pat.transaction */ public void clearpersondata() { this.persondata = null; } public void changetitleofbookaction(..) { Book book = new Book("Algorytmy"); } book.settitle("algorytmy 2"); book.clearpersondata();
Przykład 7-4. PAT - tworzenie nowych obiektów /** @@pat.root */ public class Library { private List list = new List(); } /** @@pat.transaction */ public void addbook(book book) { list.add(book); } public void addbookaction() { Library library = new Library(); //korzeń Book book = new Book("Algorytmy"); } library.addbook(book)
Dziękuje www.ii.uni.wroc.pl/~/