Programowanie aspektowe
|
|
- Zofia Borkowska
- 7 lat temu
- Przeglądów:
Transkrypt
1 Programowanie aspektowe Prowadzący: Bartosz Walter Programowanie aspektowe 1
2 Plan wykładu Rozdział zagadnień (ang. Separation of Concerns) Elementy języka AspectJ Inne implementacje AOP Programowanie aspektowe (2) Wykład poświęcony programowaniu aspektowemu stanowi jedynie wprowadzenie do tej tematyki. Jego celem jest wskazanie potrzeby powstania tego mechanizmu oraz opisanie konstrukcji jego podstawowych elementów. Pierwsza część wykładu obejmuje problem rozdziału zagadnień w oprogramowaniu i jego znaczenie dla pielęgnowalności oprogramowania. Problem ten, mimo zmian paradygmatów programowania, nadal pozostaje nierozwiązany do końca. W kolejnej, najdłuŝszej części omówione zostaną podstawowe pojęcia aspektów: punktu złączenia, punktu cięcia oraz porady oraz ich implementacja w języku AspectJ najpopularniejszej implementacji aspektów dla języka Java. Ostatnim elementem wykładu będzie krótki przegląd innych rozwiązań aspektowych. Programowanie aspektowe 2
3 Plan wykładu Rozdział zagadnień (ang. Separation of Concerns) Elementy języka AspectJ Inne implementacje AOP Programowanie aspektowe (3) Pierwsza część wykładu jest poświęcona koncepcji programowania aspektowego i jego zaletom w porównaniu do innych paradygmatów, przede wszystkim programowania obiektowego. Programowanie aspektowe 3
4 Rozdział zagadnień Zasada rozdziału zagadnień (Separation of Concerns) program powinien być zdekomponowany w taki sposób, aby róŝne jego aspekty znajdowały się w dobrze odseparowanych od siebie częściach systemu kaŝdy aspekt zajmuje się jednym zagadnieniem zagadnienie to szczególny cel programu, koncepcja albo funkcja D. Parnas "On the criteria to be used in decomposing systems..." (1972) G. Polya "How to Solve It?" (1973) E. Dijkstra "A Discipline of Programming" (1976) Programowanie aspektowe (4) O tym, Ŝe modularyzacja jest podstawą prawidłowej pielęgnacji kodu, pisali najwięksi badacze inŝynierii oprogramowania, m.in. D. Parnas i E. Dijkstra. Postulowali oni dekompozycję programu na części, z których kaŝda będzie dotyczyła jednego zagadnienia. Kolejne paradygmaty programowania, począwszy od programowania funkcyjnego, poprzez strukturalne, aŝ po obiektowe, próbowały spełnić ten postulat. W kolejnych generacjach języków i metod programowania pojawiały się nowe koncepcje, które dzieliły program według róŝnych kryteriów. Jednak Ŝadna z dotychczasowych idei nie odpowiadała w pełni temu wymaganiu. MoŜna z tego wyciągnąć wniosek, Ŝe prawidłowa modularyzacja jest jednym ze świętych Graali inŝynierii oprogramowania. Programowanie aspektowe 4
5 Nisza aspektowa W programowaniu obiektowym system jest zbiorem współdziałających, samodzielnych i odpowiedzialnych jednostek obiektów klasy ukrywają implementację, prezentując jedynie interfejsy polimorfizm jest podstawowym mechanizmem łączenia podobnych koncepcji...ale jak prawidłowo zaimplementować cechy, które przecinają wiele obiektów? Programowanie aspektowe (5) Wydaje się, Ŝe programowanie obiektowe jest skuteczną odpowiedzią na problem modularyzacji. Podkreślana w tym paradygmacie zasada odpowiedzialności nakazywała podział systemu na obiekty, natomiast mechanizmy dziedziczenia, polimorfizmu oraz składania klas pozwalały w róŝny sposób łączyć klasy we współpracujące grupy. Okazuje się jednak, Ŝe istnieją takie modele rzeczywistości, które bardzo trudno podzielić na moduły. W większości przypadków dotyczy to sytuacji, w których przyjęte kryterium podziału (np. funkcjonalne) okazuje się być nie jedynym, ale jednym z wielu. Często przywoływanym przykładem jest problem zapisywania informacji o wydarzeniach w systemie (logowania). Wywołanie metody logującej pojawia się wówczas niemal w całym systemie, bez względu na przeznaczenie poszczególnych jego elementów. Próba modyfikacji kodu logującego wymaga skomplikowanych, pracochłonnych i naraŝonych na błędy operacji na wielu fragmentach kodu w systemie Pojawia się zatem zapotrzebowanie na mechanizm, który umoŝliwi osiągnięcie pełnej modularyzacji systemu niezaleŝnie od liczby kryteriów podziału. Programowanie aspektowe 5
6 Przykład Bank Produkt bankowy Rachunek Kredyt Lokata Raport wplata() przelew() wyplata() splata() nalicz() zalozenie() rozwiazanie() wykonaj() transakcyjność Programowanie aspektowe (6) Przykładem takiej sytuacji jest równieŝ fragment kodu systemu bankowego. Obiekt Bank przechowuje kolekcję Produktów bankowych: Rachunków, Kredytów i Lokat. Ponadto przechowuje obiekty klasy Raport, które operują na Produktach bankowych. Łatwo zauwaŝyć, Ŝe poszczególne metody tych klas wymagają zapewnienia wspólnych właściwości, które nie są związane z podziałem funkcjonalnym obiektów, np. transakcyjności wywołań metod. Próba zaimplementowania tej cechy przez odwołania w kaŝdej klasie do kodu realizującego ją moŝe prowadzić do bałaganu i obniŝenia pielęgnowalności kodu. Programowanie aspektowe 6
7 Podział wymagań płatności rozliczenia planowanie edycja trwałość synchronizacja dziennik autentykacja Wymagania podstawowe (biznesowe) Wymagania systemowe (techniczne) Programowanie aspektowe (7) Na podstawie wniosków wyciągniętych z analizy przykładu moŝna zatem podzielić wymagania implementowane w kaŝdym systemie na dwie grupy: wymagań podstawowych, które reprezentują główne biznesowe cele, jakie uŝytkownik chce osiągnąć za pomocą tego systemu. W przypadku systemu bankowego moŝe to być zarządzanie rachunkami bankowymi, realizacja operacji bankowych etc. wymagań systemowych, które odpowiadają np. technicznym wymogom związanym z wieloma lub nawet wszystkimi wymaganiami podstawowymi. Przykładem takiego wymagania jest np. trwałość zapisu danych, transakcyjność, logowanie wywołań). Warto zauwaŝyć, Ŝe wymagania systemowe są ortogonalne w stosunku do wymagań podstawowych, tzn. przecinają je i wymagają implementacji w wielu niezwiązanych ze sobą miejscach. Implementacja kaŝdego z wymagań podstawowych w osobnym module spowoduje, Ŝe moduły te będą musiały być przecięte wymaganiami systemowymi. Taka sytuacja jest jednak rzeczą naturalną w projektowaniu oprogramowania. Problem dotyczy zatem nie opisu rzeczywistości, ale sposobu reprezentacji i implementacji poszczególnych zagadnień systemowych, tak aby zachowując modularność umoŝliwić im bezproblemowe przecinanie innych wymagań. Programowanie aspektowe 7
8 Modularyzacja kodu funkcje podstawowe aspekt 1 aspekt 2 program obiektowy program aspektowy Programowanie aspektowe (8) Program obiektowy, który rozwiązywałby taki problem, najprawdopodobniej wywoływałby w wielu miejscach metody słuŝące do realizacji poszczególnych zagadnień systemowych. W efekcie przypominałby spaghetti-code, w którym pierwotna koncepcja modularyzacji byłaby całkowicie nieczytelna. Programowanie aspektowe (ang. Aspect-Oriented Programming) pozwala rozwiązać ten problem w sposób znacznie bardziej przejrzysty i elegancki. Do typowych mechanizmów obiektowych dodaje ono koncepcję aspektu, grupującego zagadnienia przecinające inne fragmenty kodu. Dzięki temu moŝliwe jest logiczne wydzielenie ich w postaci osobnych jednostek modularyzacji bez naruszania pierwotnego podziału, co pozwala zachować czytelność kodu systemu, jego hermetyczność etc. Klasy reprezentujące zagadnienia biznesowe nadal zawierają tylko to, za co odpowiadają. Aspekty, stosowane obok klas, umoŝliwiają zatem lepszą, wielokryterialną strukturalizację systemu informatycznego niŝ uŝycie samych tylko klas. Programowanie aspektowe 8
9 OOP a AOP Programowanie obiektowe grupowanie podobnych koncepcji za pomocą hermetyzacji i dziedziczenia podstawowa jednostka modularyzacji: klasa Programowanie aspektowe grupowanie podobnych koncepcji w niezwiązanych ze sobą klasach dodatkowy mechanizm modularyzacji: aspekt Programowanie aspektowe (9) RóŜnica pomiędzy programowaniem obiektowym a programowaniem aspektowym nie polega na innym celu (w obu przypadkach chodzi o grupowanie podobnych koncepcji i separację róŝnych), ale na innym doborze narzędzi. W przypadku programowania obiektowego podstawowymi narzędziami są pojęcie klasy, jej hermetyzacja i dziedziczenie. Zwykle pozwalają one stosować grupowanie koncepcji według jednego kryterium, co w części zastosowań jest wystarczające. Zaletą programowania obiektowego jest jego utrwalona i pewna pozycja na rynku, oraz oparcie w szerokiej gamie popularnych języków programowania. Programowanie aspektowe zatem nie stoi w sprzeczności z załoŝeniami ani narzędziami programowania obiektowego. Dodatkowym mechanizmem grupowania jest aspekt, reprezentujący pojedyncze zagadnienie (ang. concern). Pozwala on na rozszerzenie moŝliwości grupowania na wiele kryteriów, w tym takŝe przecinających się. Aspekt grupuje kod i reguły jego łączenia z innymi fragmentami programu. Programowanie aspektowe 9
10 Plan wykładu Rozdział zagadnień (ang. Separation of Concerns) Elementy języka AspectJ Inne implementacje AOP Programowanie aspektowe (10) W drugiej części zostaną przedstawione podstawowe pojęcia programowania aspektowego oraz sposób ich zapisu w języku AspectJ. Zaprezentowane będą takŝe moŝliwości AspectJ oraz przykłady ich zastosowań Programowanie aspektowe 10
11 Język AspectJ AspectJ G. Kiczales (2001), Xerox Palo Alto Research Center uniwersalne aspektowe rozszerzenie Javy aspekt jako specyficzna klasa moŝliwość zmiany zachowania i struktury kodu łączenie aspektów i klas na poziomie bajtkodu własny kompilator ajc integracja z Eclipse IDE AspectJ Java Programowanie aspektowe (11) AspectJ jest językiem opisu aspektów zbudowanym w postaci nadbudówki nad językiem Java. Powstał w laboratoriach Xeroxa w zespole kierowanym przez G. Kiczalesa, prowadzącego badania nad technikami modularyzacji kodu. Pierwsza publiczna wersja języka powstała w roku 2001, i tę datę uznaje się za początek jego istrninia. Stanowi on uniwersalne aspektowe rozszerzenie języka Java, tzn. Ŝe kaŝdy program Javy jest jednocześnie poprawnym programem języka AspectJ. Nie modyfikuje on Ŝadnej konstrukcji tego języka, a dodaje nowe przede wszystkim pojęcie aspektu. Aspekt jest specyficznym rodzajem klasy, który razem z nią pozwala modularyzować program. AspectJ posiada moŝliwości przecinania klas zarówno statycznie (modyfikując jego strukturę, hierarchię dziedziczenia), jak i dynamicznie (zmieniając zachowanie programu). Łączenie aspektów i klas odbywa się na poziomie bajtkodu, tzn. Ŝe kod wynikowy jest nieprawidłowo podzielony na moduły, jednak kod źródłowy podlega modularyzacji na klasy i aspekty. AspectJ jest pełnym językiem programowania: oprócz składni posiada takŝe własne narzędzia kompilator i debugger. Od czasu przeniesienia go do projektu Eclipse obserwuje się coraz silniejszą integrację języka z tą platformą. Istnieje jednak takŝe niezaleŝna od IDE wersja AspectJ. Programowanie aspektowe 11
12 Aspekt Aspekt (w języku AspectJ) specjalizowana klasa, która moŝe przecinać inne klasy podlega dziedziczeniu jednostka modularyzacji (obok klasy) posiada typowe elementy klasy łączy punkty cięcia i porady Aspekt.aj Aspekt.class kompilacja Programowanie aspektowe (12) Aspekt jest szczególnie wyróŝnioną jednostką programu w języku AspectJ, poniewaŝ występuje w nim jako niezaleŝny moduł, podobny do klasy. W rzeczywistości moŝna traktować jako specjalizowaną klasę, która moŝe przecinać inne klasy, modyfikując ich strukturę i zachowanie. Aspekt w języku AspectJ jest dodatkową, obok klasy jednostką modularyzacji Deklaracja aspektu, poza typowymi elementami klasy, jak pola i metody (choć nie moŝe on np. zawierać klas wewnętrznych), definiuje punkty cięcia czyli punkty, w których oryginalny kod programu przecina się z aspektem, oraz porady, będące fragmentami kodu jaki jest umieszczany i wykonywany w odpowiednim punkcie cięcia. W postaci źródłowej aspekty są zapisywane w plikach z rozszerzeniem.aj, a po skompilowaniu przyjmują postać bajtkodu i są przechowywane w plikach z rozszerzeniem.class. Przez maszynę wirtualną Javy są traktowane jako zwyczajne klasy. Programowanie aspektowe 12
13 Zasada działania AspectJ aspekt aspekt aspekt pliki *.aj tkacz obiekt obiekt obiekt pliki *.java pliki *.class Programowanie aspektowe (13) NiepoŜądany efekt, o którym była mowa wcześniej czyli przeplatanie się kodu jest nie do uniknięcia. Celem jest jednak nie całkowite wyeliminowanie go, ale przesunięcie z kodu źródłowego do kodu wynikowego lub nawet wykonania programu. Proces przeplatania nazywany jest tkaniem (ang. weaving), a jego wykonawcą jest tkacz (ang. weaver). NiezaleŜnie od zastosowanej techniki tkania, istota tego procesu polega na identyfikacji określonych punktów programu (punktów złączeń), w których wykonywany jest inny kod, niŝ wskazuje na to oryginalna wersja programu, lub modyfikowana jest struktura programu. Typowym przykładem identyfikowanego punktu złączenia jest np. wywołanie metody. W przypadku AspectJ elementami podlegającymi tkaniu są klasy Javy oraz kod i reguły tkania zawarte w aspektach. Na podstawie tych elementów tkacz generuje bajtkod, który jest poprzeplatanym kodem wynikowym, tak jakby podstawą do jego wygenerowania był poprzeplatany kod źródłowy. Zatem rolę tkacza odgrywa w tym przypadku specjalny kompilator, który produkuje kod wynikowy będący prawidłowym programem w języku Java. Inne metody tkania obejmują przeplatanie kodu w trakcie ładowania kodu lub jego wykonywania. MoŜna wyobrazić sobie np. wirtualną maszynę języka Java wyposaŝoną w moŝliwość łączenia aspektów z kodem. Programowanie aspektowe 13
14 Przykład prostego aspektu public class HelloWorld { public static void hej(string tekst) { System.out.println(tekst); public static void hejkolego(string tekst, String imie) { System.out.println(imie + ", " + tekst); public static int hejludzie(string tekst, String[] imiona) { for (int i = 0; i < imiona.length; i++) System.out.println(imiona[i] + ", " + tekst); return imiona.length; na podstawie przykładu R. Laddada (2002) Programowanie aspektowe (14) PoniewaŜ opis języka najlepiej rozpocząć od przykładu, warto przyjrzeć się powyŝszej klasie. Składa się ona z trzech metod, wyświetlających teksty do wskazanych osób: hej(), hejkolego() oraz hejludzie(). NaleŜy zmodyfikować zachowanie tego programu tak, aby wywołanie jakiejkolwiek metody o nazwie zaczynającej się od hej powodowałoby na początku uprzejme przywitanie się, a na końcu podziękowanie. Programowanie aspektowe 14
15 Przykład prostego aspektu public aspect Maniery { pointcut wywolaniehej () : call(public static void HelloWorld.hej*(..)); before() : wywolaniehej() { System.out.println("Dzień dobry!"); after() : wywolaniehej() { System.out.println("Dziękuję!"); na podstawie przykładu R. Laddada (2002) Programowanie aspektowe (15) W celu realizacji tego zadania zaimplementowano aspekt Maniery. Składa się on z fragmentu kodu zwanego punktem cięcia oraz dwóch porad. Punkt cięcia określa, Ŝe momentem interesującym dla tego aspektu jest wywołanie dowolnej metody zaczynającej się od słowa hej oraz umieszczonej w klasie HelloWorld. Punkt ten jest przydatny przy realizacji dwóch porad: before() i after(), wykonywanych odpowiednio przed i po osiągnięciu punktu złączenia. Porada pierwsza mówi, Ŝe bezpośrednio przed osiągnięciem punktu złączenia określonego jako wywołaniehej(), naleŝy wyświetlić napis "Dzień dobry!". Druga porada dotyczy postępowania bezpośrednio po osiągnięciu punktu złączenia: wyświetlony zostanie napis "Dziękuję". W efekcie wywołanie dowolnej metody o nazwie zaczynającej się od hej będzie poprzedzone przywitaniem, a zakończone podziękowaniem. Programowanie aspektowe 15
16 Punkty złączeń Punkty złączenia (ang. joinpoints) są dowolnymi, identyfikowalnymi miejscami w programie. Posiadają kontekst wywołanie metody i konstruktora wykonanie metody i konstruktora dostęp do pola obsługa wyjątku statyczna inicjacja Programowanie aspektowe (16) Pierwsze, bardzo waŝne pojęcie kaŝdego języka i systemu programowania aspektowego, to punkt złączenia. MoŜe nim być dowolny identyfikowalny punkt programu. W praktyce typowymi punktami złączenia (niezaleŝnie od moŝliwości języka) są: wywołanie i wykonanie dowolnej metody i dowolnego konstruktora odwołanie do pola w klasie (do odczytu i do zapisu) statyczna inicjacja klasy obsługa wyjątku Programowanie aspektowe 16
17 Punkty cięcia Punkt cięcia (ang. pointcut) jest zdefiniowaną kolekcją punktów złączenia. Ma dostęp do ich kontekstu nazwa punktu cięcia pointcut wywolaniehej () : call(public static void HelloWorld.hej*(..)); definicja punktu złączenia Programowanie aspektowe (17) Punkt cięcia jest konsekwencją istnienia punktów złączenia: stanowi on ich zdefiniowaną kolekcję, określoną za pomocą pewnej deklaracji. Punkty cięcia mogą mieć dostęp do kontekstu, w jakim nastąpiło złączenie, i wykorzystać go w swojej definicji. Podany przykład nazwanego punktu cięcia wywolaniehej() składa się ze słowa kluczowego pointcut, definiującego punkt złączenia, nazwy i parametrów, jakie są wówczas przekazywane, oraz definicji punktu złączenia. W tym przypadku punktem złączenia jest wywołanie metody o nazwie zaczynającej się od słowa hej znajdującej się w klasie HelloWorld. KaŜdy element, który w punkcie cięcia został opisany szczegółowo, moŝna opisać takŝe ogólnie, stosując znaki * (dopasowanie nazwy do prostego wyraŝenia regularnego) oraz + (oznaczający domknięcie przechodnie relacji dziedziczenia). Programowanie aspektowe 17
18 Rodzaje punktów cięcia Punkty cięcia dzielą się według złoŝoności na proste, definiujące jeden punkt złączenia złoŝone, zbudowane z kolekcji punktów złączenia powiązanych operatorami logicznymi (!, i &&) Punkty cięcia dzielą się według toŝsamości na nazwane, posiadające nazwę, za pomocą której odwołuje się do nich porada anonimowe, zapisane wprost w warunku porady Programowanie aspektowe (18) Punkty cięcia moŝna podzielić według dwóch podstawowych kryteriów: złoŝoności oraz toŝsamości. W przypadku pierwszego kryterium punkty złączeń dzielą się one na proste punkty cięcia, zbudowane z jednej klauzuli dopasowującej, oraz punkty złoŝone, opisane negacją, alternatywą lub koniunkcją prostych punktów cięć. Ponadto punkty cięcia podobnie jak klasy w Javie mogą posiadać nazwy, ale nie muszą. Nazwane punkty cięcia mogą być wielokrotnie uŝywane w róŝnych miejscach aplikacji, natomiast punkty anonimowe są tworzone w miejscu ich uŝycia i nie moŝna odwołać się do nich z innej części systemu. Programowanie aspektowe 18
19 Wywołanie metody i konstruktora Punkt cięcia call reprezentuje wywołania metod i konstruktorów (po ewaluacji parametrów, przed wykonaniem) call (sygnatura metody lub konstruktora) call(* Klasa.metoda*(int,..)) call(* *.metoda(..)) call(klasa+.new(..)) wywołanie metody o nazwie zaczynającej się od metoda, której pierwszy argument jest typu String wywołanie metody o nazwie metoda w dowolnej klasie wywołanie dowolnego konstruktora w klasie Klasa i jej podklasach Programowanie aspektowe (19) Najpopularniejszym rodzajem punktu cięcia jest wywołanie metody. Poprzez wywołanie naleŝy rozumieć moment po wydaniu polecenia wykonania tej metody i ewaluacji argumentów, ale przed fizycznym rozpoczęciem wykonywania kodu. Punkt jest opisywany klauzulą call, której parametrem jest sygnatura metody lub konstruktora. W przypadku konstruktora nazwą metody jest słowo new. Podobnie jak w innych przypadkach, do określenia metody moŝna uŝyć znaków specjalnych * i +. Lista typów parametrów metody takŝe moŝe być niepełna: dowolną liczbę nieznanych typów moŝna zastąpić dwiema kropkami (..). Programowanie aspektowe 19
20 Wykonywanie metody i konstruktora Punkt cięcia execution reprezentuje wykonanie ciała metody lub konstruktora execution (sygnatura metody lub konstruktora) execution(* * Klasa.metoda(..)) execution(public * pl.elearning..*.*(..)) execution(* * pl.elearning..*.new(..)) wykonanie metody metoda o dowolnych parametrach w klasie Klasa wykonanie dowolnej publicznej metodzie w dowolnej klasie w dowolnym pakiecie poniŝej pl.elearning wykonanie dowolnego konstruktora w dowolnej klasie w pakiecie pl.elearning Programowanie aspektowe (20) Nieco innym typem punktem cięcia jest wykonanie metody lub konstruktora. Punkt ten jest osiągany w momencie fizycznego rozpoczęcia wykonania kodu metody lub konstruktora, zatem następuje później niŝ punkt cięcia call. Parametrem, podobnie jak w poprzednim przypadku, jest sygnatura metody lub konstruktora. Zasady jej opisu są identyczne jak w przypadku wywołania metody. Programowanie aspektowe 20
21 Dostęp do pola Punkty cięcia set i get reprezentują odwołania do pól klasy i obiektu set (deklaracja pola) get (deklaracja pola) set(innaklasa Klasa.pole) get(innaklasa *.pole) nadanie wartości polu pole typu InnaKlasa w klasie Klasa odczyt wartości pola pole typu InnaKlasa w dowolnej klasie Programowanie aspektowe (21) Punkty cięcia get i set reprezentują odwołania do pól obiektu. Punkt set jest osiągany w momencie przypisania wartości do pola, natomiast punkt get jej odczytu. Parametrem tych punktów cięcia jest deklaracja pola, którego punkt dotyczy. Nazwa pola, jego klasy, typ i zasięg widoczności mogą być reprezentowane w postaci uproszczonych wyraŝeń regularnych zawierających * oraz.. Programowanie aspektowe 21
22 Obsługa wyjątku Punkt cięcia handler reprezentuje kod obsługi wyjątku handler (typ wyjątku) handler(sqlexception) handler(runtimeexception+) wykonanie kodu obsługi wyjątku SQLException wykonanie kodu obsługi wyjątku RuntimeException i jego pochodnych (czyli wszystkich wyjątków niesprawdzanych) Programowanie aspektowe (22) Punkt cięcia handler jest osiągany przez program w momencie rozpoczęcia obsługi wyjątku danego typu. Parametrem tego punktu jest typ wyjątku, który równieŝ moŝe być zapisany w sposób uogólniony. Na przykład zapis handler(runtimeexception+) oznacza obsługę wyjątku RuntimeException i wszystkich jego typów potomnych, a więc wyjątków niesprawdzanych (ang. unchecked). W celu przechwycenia wartości wyjątku (czyli reprezentującego go obiektu) naleŝy uŝyć punktu cięcia args. Programowanie aspektowe 22
23 Statyczna inicjacja Punkty cięcia staticinitialization reprezentuje wykonanie kodu inicjacji klasy (static { ) staticinitialization (klasa) staticinitialization(klasa) wykonanie statycznej inicjacji klasy Klasa Programowanie aspektowe (23) Blok statycznej inicjacji klasy (o postaci static {...) jest reprezentowany przez punkt cięcia staticinitialization. Parametrem tego punktu jest klasa, w której blok się znajduje. Programowanie aspektowe 23
24 Cięcie warunkowe Punkty cięcia if pozwala na ewaluację warunku w punkcie złączenia if (wyraŝenie warunkowe) if(rachunek.jestotwarty()) wszystkie miejsca, w których rachunek jest otwarty Programowanie aspektowe (24) Szczególnym rodzajem punktu cięcia jest if, który pozwala na ewaluację warunku logicznego. Punkt ten jest osiągany, gdy warunek staje się prawdziwy. WyraŜenie warunkowe uŝyte w deklaracji punktu cięcia moŝe odwoływać się tylko do składowych statycznych, parametrów punktu cięcia lub porady oraz zmiennych thisjoinpoint. Nie moŝe wywoływać metod niestatycznych aspektów lub korzystać z wartości lub wyjątków zgłaszanych przez poradę after. NaleŜy takŝe unikać efektów wynikających z ewaluacji warunku, poniewaŝ kolejność ewaluacji nie jest zdefiniowana w języku i jej nieoczekiwana zmiana moŝe wywoływać nieprzewidziane efekty. Programowanie aspektowe 24
25 Leksykalne połoŝenie Punkt cięcia within reprezentuje punkty złączeń znajdujące się wewnątrz klasy (i jej klas wewnętrznych) Punkt cięcia withincode reprezentuje punkty złączeń znajdujące się wewnątrz metody lub konstruktora podanej klasy within (klasa) withincode (sygnatura metody) within(klasa) withincode(klasa.hej*(..)) wszystkie miejsca wewnątrz klasy Klasa wszystkie miejsca wewnątrz metod zaczynających się od hej w klasie Klasa Programowanie aspektowe (25) Dwa punkty cięcia within i withincode są osiągane w momencie, gdy sterowanie znajdzie się odpowiednio wewnątrz podanej klasy lub metody. PoniewaŜ są to punkty statyczne, dlatego ich osiągnięcie jest ewaluowane w trakcie kompilacji. Parametrem punktu within jest klasa, natomiast punktu withincode sygnatura metody, które są analizowane. Programowanie aspektowe 25
26 Kontrola przepływu sterowania Punkt cięcia cflow reprezentuje kod wywoływany (pośrednio lub bezpośrednio) przez podaną metodę Punkt cięcia cflowbelow reprezentuje kod wywoływany (pośrednio lub bezpośrednio) przez podaną metodę z jej pominięciem cflow (sygnatura metody) cflowbelow (sygnatura metody) cflow(klasa.hej*(..)) kod wywoływany przez metodę zaczynającą się od hej Programowanie aspektowe (26) Za pomocą AspectJ moŝna kontrolować takŝe bardziej dynamiczne aspekty zachowania programu. Punkt cięcia cflow reprezentuje kod znajdujący się w obszarze sterowania wywoływanym przez podaną metodę, włączają ją samą. Podobny punkt cięcia cflowbelow jest jest poddrzewem cflow, jednak nie zawiera on samej metody, którą określono w sygnaturze punktu. W obu przypadkach stan kontekstu moŝna odczytać wykorzystując punkty cięcia this, target i args. NaleŜy pamiętać, Ŝe tych punktów cięcia nie moŝna negować, czyli uŝywać w konstrukcjach typu! cflow(klasa.metoda()) Programowanie aspektowe 26
27 Cel wywołania i argumenty Punkt cięcia this reprezentuje odwołanie do własnego obiektu Punkt cięcia target reprezentuje odwołanie do wybranego obiektu this (klasa lub obiekt) target (klasa lub obiekt) Punkt cięcia args reprezentuje wywołanie metody o podanych typach argumentów args (lista typów argumentów) Programowanie aspektowe (27) Trzy punkty cięcia: this, target i args słuŝą do dynamicznej ewaluacji stanu program. Punkt this jest osiągany w momencie, gdy bieŝący obiekt jest instancją danej klasy. Punkt target opisuje sytuacje, w których przedmiotem przetwarzania jest obiekt określonej klasy, to znaczy przekazywane jego do niego sterowanie. Zatem w punkcie wywołania metody (call) obiektem tym nie będzie bieŝący obiekt, natomiast w punkcie wykonania metody (execution) będzie to ten sam obiekt. Punkt args słuŝy do stwierdzenia, czy parametry wywołania są określonych typów (dotyczy to zarówno wywołania metody, jak i np. obsługi wyjątku). MoŜe on przechowywać listy typów lub zmiennych związanych wewnątrz punktu cięcia (a więc posiadających wynikający z tego typ). Programowanie aspektowe 27
28 Kontekst punktu cięcia Punkty cięcia this, target i args pozwalają na zebranie informacji kontekstowej i przekazanie jej przez parametr punktu cięcia parametr punktu cięcia pointcut wywolaniehej (String tekst) : call(public static void HelloWorld.hej*(String)) && args(tekst); przechwycenie wartości parametru Programowanie aspektowe (28) Punkty cięcia this, target i args nie słuŝą jednak wyłącznie do zawęŝania zakresu punktu cięcia. Ich podstawowym zadaniem jest zbieranie informacji o stanie kontekstu i przekazywanie jej do sygnatury punktu cięcia lub porady. Punkty this i target mogą słuŝyć zapamiętania w zmiennej referencji do obiektu bieŝącego lub obiektu, na którym wykonywana jest bieŝąca operacja. Natomiast punkt cięcia args pozwala przechwycić i zapamiętać oryginalne wartości parametrów w bieŝącym kontekście (zwykle związanym z wywołaniem metody). Programowanie aspektowe 28
29 Zmienne thisjoinpoint i thisstaticjoinpoint Zmienna thisjoinpoint przechowuje statyczną i dynamiczną informację o miejscu osiągnięcia punktu złączenia Zmienna thisstaticjoinpoint jest ograniczeniem thisjoinpoint do informacji statycznej Signature thisjoinpoint.getsignature() Object thisjoinpoint.getexecutingobject() Class thisjoinpoint.getexecutingclass() Object[] thisjoinpoint.getparameters() SourceLocation thisjoinpoint. getcorrespondingsourcelocation() Programowanie aspektowe (29) Szczególną rolę w dostępie do kontekstowej informacji o punkcie cięcia pełnią zmienne z rodziny thisjoinpoint. Zmienna, od której wzięła nazwę ta rodzina, pozwala na odczyt m.in. sygnatury wywołanej metody, klasy i obiektu wykonującego obecnie kod, listy i wartości parametrów, a nawet danych dotyczących fizycznego połoŝenia kodu źródłowego w pliku. Zmienna thisjoinpoint posiada wiele odmian i podtypów, m.in. ograniczoną do informacji statycznej zmiennę thisstaticjoinpoint. Ponadto moŝliwości tej zmiennej w duŝej mierze zaleŝą od kontekstu: moŝe ona np. odczytywać typ przechwyconego wyjątku w punkcie cięcia handler. Programowanie aspektowe 29
30 Porada Porada (ang. advice) jest fragmentem kodu programu wykonywanym przed, po lub zamiast osiągnięcia przez program punktu cięcia. brak kontekstu punkt cięcia z określeniem momentu obsługi before() : call (public * Klasa.metoda(..)) { // kod porady, który będzie wykonany przed // wywołaniem metody metoda w klasie Klasa Programowanie aspektowe (30) Porada jest funkcjonalnym dopełnieniem punktu cięcia określa akcję, jaką naleŝy wykonać w momencie osiągnięcia punktu cięcia. Definicja porady w AspectJ składa się z określenia momentu uruchomienia porady, definicji punktu cięcia oraz kodu. Programowanie aspektowe 30
31 Rodzaje porad Rodzaje porad before() wykonywana tuŝ przed punktem cięcia after() {returning throwing wykonywana tuŝ po punkcie cięcia (poprawnym lub zgłaszającym wyjątek) around(context) otaczająca punkt cięcia i decydująca o jego wykonaniu lub nie Programowanie aspektowe (31) Ze względu na moment połączenia porady z kodem w punkcie cięcia moŝna podzielić je na trzy rodzaje: before(), after() i around(). Porada before() jest wykonywana tuŝ przed wystąpieniem punktu cięcia. Ten typ porady moŝe np. słuŝyć do weryfikacji parametrów metody, zmiany sposobu sterowania etc. Porada after() jest wykonywana tuŝ po wystąpieniu punktu cięcia. PoniewaŜ jednak jest to pojęcie zbyt ogólne, moŝna wyróŝnić dwie kolejne sytuacje: taką, w której wykonanie oryginalnego kodu w punkcie cięcia zakończyło się poprawnie (sytuacja taka opisywana jest klauzulą after() returning) oraz w której efektem wykonania kodu było zgłoszenie wyjątku (opisywane klauzulą after() throwing) Ostatnim rodzajem porady jest around(). W odróŝnieniu od dwóch poprzednich rodzajów, w tym przypadku istnieje moŝliwość zastąpienia oryginalnego kodu związanego z punktem cięcia treścią porady. Pozwala to m.in. na zmianę zachowania metod programu poprzez jego całkowitą zmianę lub rozszerzenie go. Ta ostatnia moŝliwość jest realizowana za pomocą polecenia proceed(). Programowanie aspektowe 31
32 Przykład: aspekt logujący wywołania metod public aspect Logger { pointcut wywolaniemetody() : call(* * (..)) &&! within(logger); before() : wywolaniemetody() { System.out.println("Przed wywołaniem metody " + thisjoinpoint.getsignature()); after() returning : wywolaniemetody() { System.out.println("Po wywołaniu metody " + thisjoinpoint.getsignature()); after() throwing : wywolaniemetody() { System.out.println("Metoda " + thisjoinpoint.getsignature() + " zgłosiła wyjątek"); Programowanie aspektowe (32) Na slajdzie przedstawiono przykład wspomnianego wcześniej aspektu słuŝącego do logowania wywołań metod w kodzie programu. Aspekt Logger definiuje jeden punkt cięcia o nazwie wywołaniemetody(). Dotyczy on wywołań wszystkich metod o dowolnym zasięgu widoczności, typie, znajdujących się w dowolnym pakiecie i o dowolnych parametrach, o ile nie znajdują się w aspekcie Logger. Warto zwrócić uwagę właśnie na to ograniczenie: jego brak spowodowałby uruchamianie porad takŝe dla wywołań metod wewnątrz tych porad, co skończyłoby się zapętleniem lub przynajmniej niepoŝądanym zachowaniem programu. W aspekcie znajdują się takŝe trzy porady, dotyczące odpowiednio momentów przed osiągnięciem punktu cięcia wywolaniemetody(), po jego osiągnięciu w przypadku prawidłowego zakończenia oraz w przypadku zgłoszenia wyjątku. Wszystkie trzy porady wyświetlają stosowny komunikat związany z wywołaniem metody, powrotem z wywołania oraz zgłoszeniem wyjątku. Odwołania do zmiennej thisjoinpoint pozwalają na odczyt sygnatury metody, która aktualnie jest wywoływana. Programowanie aspektowe 32
33 Przykład: porada around() public aspect Powitania { String around(string napis): execution(* *.powiedz(..)) && args(napis) { System.out.println("przechwytuję metodę"); proceed(napis); System.out.println("koniec przechwycenia"); return "coś innego"; wykonaj zamiast kodu w punkcie cięcia wykonaj oryginalny kod static public String powiedz(string imie) { System.out.println("Witaj, " + napis); return napis; public static void main(string[] a) { System.out.println("powiedziałem: " + powiedz("olu")); Programowanie aspektowe (33) Przykładem zastosowania porady around() jest przedstawiony na slajdzie aspekt. Porada around() zbiera kontekst, którym jest parametr wywołania oryginalnej metody o nazwie rozpoczynającej się od słowa powiedz(). Treść porady składa się z polecenia wyświetlenia napisu "przechwytuję metodę", następnie wywołania oryginalnej metody dopasowanej przez poradę (słuŝąca do tego klauzula proceed() moŝe przyjmować parametry odpowiadające parametrami kontekstu, w jakim została wykonana porada), wyświetleniu kolejnego napisu i zwróceniu jako wyniku napisu "coś innego". W ten sposób została zdefiniowana alternatywna treść metody powiedz(). Metoda powiedz() przyjmuje parametr będący imieniem osoby do pozdrowienia, wyświetla pozdrowienia, a następnie zwraca przekazane imię. W metodzie main() metoda powiedz() zostaje wykonana z argumentem "Olu". Powoduje to wywołanie wskazanej metody, jednak juŝ po uruchomieniu jej osiągnięty zostanie punkt złączenia opisany w poradzie. Treść metody powiedz() będzie efektywnie zastąpiona przez treść porady. PoniewaŜ jednak porada wywołuje oryginalną metodę, więc efekt jej działania w postaci napisu takŝe będzie widoczny. Zmianie ulegnie jednak wartość zwracana przez metodę: zamiast napisu "Olu" będzie ona brzmiała "coś innego". Wynikiem uruchomienia tego aspektu będzie zatem sekwencja: przechwytuję metodę Witaj, Olu koniec przechwycenia powiedziałem: coś innego Programowanie aspektowe 33
34 Przykład: do czego słuŝy ten aspekt? Jaki jest efekt uŝycia tego aspektu? aspect A { before(): call(* *(..)) { System.out.println("przed"); after(): call(* *(..)) { System.out.println("po"); Programowanie aspektowe (34) Po omówieniu podstawowych elementów aspektów oraz przedstawieniu przykładów, moŝna przejść do bardziej zaawansowanych rozwiązań. Na slajdzie przedstawiono aspekt, który przechwytuje wywołania wszystkich metod przed i po tym fakcie, wywołując w odpowiedzi metody System.out.println(). Co wydarzy się po uruchomieniu jakiegokolwiek kodu skompilowanego razem z tym z tym aspektem? OtóŜ program ten nie wyświetli Ŝadnego napisu i zakończy się. Przyczyną jest tzw. cichy błąd zgłoszenie wyjątku, który jednak nie będzie zaprezentowany uŝytkownikowi. Wynika to z konstrukcji punktu cięcia: osiągany jest on w momencie wywołania dowolnej metody w dowolnej klasie. A zatem, wywołanie w programie pierwszej metody spowoduje uruchomienie najpierw porady before() i związanego z nią kodu. Kod ten składa się równieŝ z wywołania metody, co równieŝ spowoduje uruchomienie porady before()... Spowoduje to rekurencyjne zapętlenie, aŝ do pojawienia się wyjątku związanego z przepełnieniem stosu wywołań metod. Jednak informacja o nim równieŝ nie pojawi się, poniewaŝ do akcji wkroczy porada after(), powodująca identyczne zapętlenie rekurencyjne. Skutkiem będzie zatem ciche zakończenie programu. Programowanie aspektowe 34
35 Przykład: wersja 2 Jaki jest efekt uŝycia tego aspektu? aspect A { before(): call(* *(..)) { System.out.println("przed"); after() returning: call(* *(..)) { System.out.println("po"); Programowanie aspektowe (35) Pierwszym sposobem poprawy aspektu jest wprowadzenie do porady after() klauzuli returning zostanie ona wywołana tylko po prawidłowym zakończeniu przechwytywanego kodu. W opisanym wcześniej przypadku przyczyną usunięcia informacji o wyjątku przez zapętlającą się rekurencyjnie poradę after(), dlatego zawęŝenie jej stosowania pozwoli uzyskać przynajmniej wydruk stosu śladu wyjątku. Programowanie aspektowe 35
36 Przykład: wersja 3 Ta wersja nie posiada tej wady... aspect A { before(): call(* *(..)) &&!within(a) { System.out.println("przed"); after() returning: call(* *(..)) &&!within(a) { System.out.println("po"); Programowanie aspektowe (36) Oczywiście, nie to jest zadaniem projektowanego aspektu. Osiągnięcie załoŝonego celu, czyli wskazywania wywoływania metod w kodzie programu (a nie w aspekcie!) wymaga dodania ograniczenia!within(a), które wyklucza kod znajdujący się wewnątrz tego aspektu spod analizy osiągnięcia punktu cięcia. Tak zapisany aspekt poprawnie wykona zadanie. Programowanie aspektowe 36
37 Zmiana struktury klasy Wprowadzenie (ang. introduction) pozwala na modyfikację struktury klas (dodawanie pól i metod) i ich hierarchii (zmiana dziedziczenia). public aspect Maniery { private long Klasa.czas; public long Klasa.czas(){ return czas; public void Klasa.ustawCzas(){ this.czas = System.currentTimeMillis(); pole metoda Programowanie aspektowe (37) Poza modyfikacją zachowania programu, aspekty mogą takŝe zmieniać jego strukturę. Modyfikacje struktury kodu są znany pod nazwą wprowadzeń (ang. introductions). MoŜliwe zmiany obejmują dodanie nowych składowych (konstruktorów, metod i pól) w wybranej klasie lub klasach dodanie implementacji interfejsu do wybranej klasy wprowadzenie dziedziczenia klasy po innej klasie zmianę poziomu widoczności składowych w klasie. Aspekt dodaje składowe do klasy, podając ich deklaracje poprzedzone nazwą klasy. Specyfikując zasięg widoczności składowej naleŝy pamiętać, Ŝe odnosi się on do bieŝącego aspektu, a nie docelowej klasy. Oznacza to, Ŝe oryginalne pola i metody prywatne klasy nie będą miały dostępu do składowej zdefiniowanej w postaci aspektu. Definiowanie nowych składowych rodzi równieŝ niebezpieczeństwo konfliktu w sytuacji, gdy składowa taka juŝ istnieje w docelowej klasie. Kompilator aspektów zapobiega takiej sytuacji, sygnalizując błąd kompilacji. Konflikty pomiędzy róŝnymi aspektami są rozwiązywane w bardziej zaawansowany sposób, który jednak nie będzie omawiany. W podanym przykładzie aspekt Maniery dodaje do klasy Klasa prywtne pole czas oraz metodę ustawczas(). Programowanie aspektowe 37
38 Zmiana hierarchii dziedziczenia Polecenie declare parents pozwala zmienić hierarchię dzidziczenia wybranych klas. public aspect DziedziczenieManier { declare parents: HelloWorld extends Zachowanie; declare parents: HelloWorld implements Observer; Programowanie aspektowe (38) Ustanowienie dziedziczenia w klasie za pomocą aspekty wymaga uŝycia nieco innej składni. Deklaracja zaczyna się od słowa kluczowego declare, po którym następuje określenie rodzaju deklaracji (w tym przypadku parents) i jej treść. W przypadku dziedziczenia treścią deklaracji jest stwierdzenie, Ŝe klasa A ma dziedziczyć po B (A extends B). Implementacja interfejsu wymaga uŝycia konstrukcji A implements B. Programowanie aspektowe 38
39 Zmiana struktury wielu klas Dodanie pól i metod do wielu klas naraz jest moŝliwe np. poprzez zdefiniowanie w aspekcie prywatnego interfejsu z nowymi elementami i zaimplementowanie go w tych klasach public aspect DodajDoWielu { private interface NowePola {; prywatny interfejs declare parents: (Klasa1 Klasa2) implements NowePola; public int NowePola.pole; public int NowePola.pole() { return pole; public void NowePola.ustawPole(int pole) { this.pole = pole; definicja interfejsu Programowanie aspektowe (39) Wprowadzenie jest przewidziane jako metoda dodawania składowych do jednej klasy naraz, dlatego modyfikacje wielu klas zasadniczo wymagają zdefiniowania oddzielnych konstrukcji dla kaŝdej z nich. Jednak moŝna zastosować teŝ inne rozwiązanie: moŝna zadeklarować pola i metody wewnątrz interfejsu, a następnie zadeklarować jego implementację w grupie klas. Koncepcję tę wyjaśnia przykład: Pierwszym krokiem jest zdefiniowanie pustego prywatnego interfejsu o nazwie NowePola. Następnie następuje deklaracja implementacji tego interfejsu w wybranych klasach, określonych za pomocą alternatywy ich nazw. Ostatnim krokiem jest zdefiniowanie składowych nowego interfejsu za pomocą aspektów. W ten sposób kaŝda klasa implementująca nowy interfejs otrzymuje nowe pole oraz metody dostępu do niego. Programowanie aspektowe 39
40 Definiowane błędy kompilacji Definiowane błędy kompilacji pozwalają na zgłaszanie błędów i ostrzeŝeń kompilacji aspektów w momencie osiągnięcia punktu cięcia. public aspect Maniery { pointcut niegrzeczny() : within(chlopiec) && call(public * HelloWorld.brzydko(..)); declare error : niegrzeczny(): "NaleŜy być grzecznym"; deklaracja błędu kompilacji Programowanie aspektowe (40) Bardzo ciekawą cechą AspectJ jest moŝliwość przeniesienia niektórych błędów, które zwykle moŝna wykryć dopiero w momencie uruchomienia kodu, na poziom kompilacji. W ten sposób moŝna określić, które punkty cięcia nie powinny być nigdy osiągnięte, a ich osiągnięcie jest niepoprawnym stanem programu. SłuŜy do tego polecenie declare error, które określa punkt cięcia oraz komunikat wyświetlany przez kompilator. Podobnym poleceniem jest declare warning, które podczas kompilacji zgłasza ostrzeŝenie. Mechanizm ten ma ograniczenia: moŝe słuŝyć jedynie do wskazywania błędów kompilacji w stosunku do konstrukcji, które moŝna określić statycznie. MoŜna zatem w nim wykorzystać jedynie takie punkty cięcia, które posiadają tę właściwość: cflow, cflowbelow, this, target, args, if. Programowanie aspektowe 40
41 Plan wykładu Rozdział zagadnień (ang. Separation of Concerns) Elementy języka AspectJ Inne implementacje AOP Programowanie aspektowe (41) Na tym zakończymy omawianie najwaŝniejszych cech systemu AspectJ. Obecnie przedstawione zostaną wybrane inne mechanizmy aspektowe dostępne dla programów napisanych w języku Java. Warto zauwaŝyć, Ŝe pomimo róŝnic sposobie wyraŝania poszczególnych elementów aspektowych oraz ich implementacji, podstawowe koncepcje pozostają niezmienione. Szczegółowe porównanie większej liczby bibliotek aspektowych moŝna znaleźć w artykule M. Kirstena pod adresem ibm.com/developerworks/java/library/j-aopwork1/ Programowanie aspektowe 41
42 Inne systemy aspektowe: AspektWerkz Spring AOP ( obecnie włączony do AspectJ 1.5 brak własnego języka, aspekt jest klasą typowy zestaw punktów złączenia łączenie klas i aspektów na poziomie bajtkodu wysoka wydajność wsparcie dla anotacji języka Java (JDK 5.0+) definiowanie porad i punktów złączeń w XML Programowanie aspektowe (42) Przegląd innych rozwiązań aspektowych dla języka Java zaczyna się od biblioteki AspectWerkz. System ten był rozwijany i wspierany przez firmę Bea, jednak obecnie został on połączony z AspectJ. W przyszłości oba będą oferowały identyczną funkcjonalność, którą będzie moŝna wyrazić na sposób charakterystyczny dla AspectJ lub AspectWerkz. AspectWerks, w odróŝnieniu od AspectJ, nie posiada specjalizowanego języka do wyraŝania punktów cięcia i porad aspekty są w nim zapisywane w postaci zwykłych klas języka Java. Do wyraŝania elementów aspektowych wykorzystywane są anotacje, które definiują aspekty, punkty cięcia i porady. Oferuje typowy zestaw punktów złączenia, obejmujący przede wszystkim wywołanie metody, obsługę wyjątków, odwołania do pól etc., jednak weryfikacja wszystkich punktów cięcia jest wykonywana w trakcie uruchomienia program. Brak statycznych punktów złączenia jest powaŝnym brakiem, w efekcie którego prawdopodobieństwo popełnienia prostego błędu jest wyŝsze niŝ w przypadku AspectJ. Programowanie aspektowe 42
43 Inne systemy aspektowe: Spring AOP Spring AOP ( cel: integracja AOP wewnątrz Spring IoC aspekt jest komponentem Spring jeden punkt złączenia: wywołanie metody łączenie kodu na poziomie wykonania (Java Dynamic Proxy) konfiguracja poprzez kontener Springa Programowanie aspektowe (43) Mechanizm Spring AOP jest blisko związany z kontenerem IoC Spring (zob. wykład nt. programowania komponentowego). Aspekty są definiowane i konfigurowane identycznie jak inne komponenty Springa, w pliku definiującym rejestr kontenera. Spring AOP stosuje inny mechanizm tkania niŝ przedstawione wcześniej systemy: punkty cięcia są obliczane w trakcie wykonywania kodu, a nie w momencie kompilacji, dlatego poszczególne komponenty pozostają od siebie binarnie niezaleŝne. Jedynym dostępnym rodzajem punktu złączenia jest wywołanie metody, co stanowi powaŝny niedostatek tego systemu (choć, zdaniem twórców Spring AOP, była to ich świadoma decyzja projektowa). Do przechwytywania wywołań metod wykorzystywany jest wbudowany w maszynę wirtualną Javy mechanizm dynamic proxy. Programowanie aspektowe 43
44 Podsumowanie Programowanie aspektowe (AOP) umoŝliwia modularyzację na szerszą skalę niŝ programowanie obiektowe Istotą AOP jest łączenie zwykłego kodu i kodu aspektów (dynamiczne lub statyczne) Aspekt moŝe modyfikować zachowanie kodu lub jego strukturę AspectJ definiuje język opisu aspektów będący nadzbiorem Javy Programowanie aspektowe (44) Programowanie aspektowe stanowi nowy trend w programowaniu. Pozwala, w odróŝnieniu od zwykłych mechanizmów obiektowych, stosować modularyzację, abstrakcję i hermetyzację na duŝo większą skalę niŝ było to moŝliwe dotychczas. Istota programowania aspektowego polega na moŝliwości łączenia zwykłego kodu z kodem przecinającym, zgrupowanym w aspektach. W efekcie program jest wykonywany tak, jakby fizycznie stanowił połączenie róŝnych modułów, choć w rzeczywistości poszczególne części kodu są od siebie oddzielone. Łączenie moŝe odbywać się na poziomie kompilacji kodu, jego ładowania lub wykonania. Aspekty mają niemal nieograniczone moŝliwości w zakresie modyfikacji programu, poczynając od jego zachowania aŝ po zmianę jego struktury. Dzięki temu ich zastosowania nie są bardzo szerokie. Pierwszą implementacją koncepcji aspektów stanowił język AspectJ, będący nadzbiorem języka Java. Jako jedno z nielicznych rozwiązań posiada on własny język opisu aspektów, wzorowany na języku Java. Jego cechami charakterystycznymi są silne wsparcie w środowisku IDE Eclipse oraz bogaty repertuar rodzajów punktów złączenia kodu i aspektów. Inne systemy aspektowe pozostają rozwiązaniami niszowymi. Programowanie aspektowe przeŝywa w ostatnich latach bujny rozwój, który prognozuje wzrost zainteresowania tą techniką takŝe w przyszłości oraz powstanie nowych obszarów zastosowań. Programowanie aspektowe 44
Obiekty, aspekty, komponenty
Obiekty, aspekty, komponenty Obiekty, aspekty, komponenty Bartosz Walter Rozdział zagadnień Zasada rozdziału zagadnień (Separation of Concerns) program powinien być zdekomponowany w taki sposób, aby różne
Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków
Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków mgr inż. Maciej Lasota Version 1.0, 13-05-2017 Spis treści Wyjątki....................................................................................
Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz
Programowanie obiektowe Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Java P. L. Lemay, Naughton R. Cadenhead Java Podręcznik 2 dla kaŝdego Języka Programowania Java Linki Krzysztof Boone oprogramowania
Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.
Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class
Podstawy Programowania Obiektowego
Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja
Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016
Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal
Programowanie obiektowe - 1.
Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która
Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
Programowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.
Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.
Dziedziczenie Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasy Student oraz Pracownik: class Student class Pracownik
Programowanie aspektowe na przykładzie AspectJ JUG Poznań, Jacek Pospychała
Programowanie aspektowe na przykładzie AspectJ Plan prezentacji Co to programowanie aspektowe i AspectJ Szybki start z AspectJ (przykład) Uruchamianie aplikacji z aspektami Jak to działa Możliwości wplatania
JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.
JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod
Aplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - dziedziczenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 W ramach poprzedniego laboratorium
Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Programowanie obiektowe zastosowanie języka Java SE
Programowanie obiektowe zastosowanie języka Java SE Wstęp do programowania obiektowego w Javie Autor: dr inŝ. 1 Java? Java język programowania obiektowo zorientowany wysokiego poziomu platforma Javy z
Dziedziczenie jednobazowe, poliformizm
Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie jednobazowe 2. Polimorfizm część pierwsza 3. Polimorfizm część druga Zofia Kruczkiewicz, ETE8305_6 1 Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Dziedziczenie. Tomasz Borzyszkowski
Dziedziczenie Tomasz Borzyszkowski Podstawy Zobacz: Dziedzictwo1.java Dziedzictwo2.java Dziedziczenie jest jedną z podstawowych cech OOP ponieważ umożliwia łatwe implementowanie klasyfikacji hierarchicznych.
Wykład 9: Polimorfizm i klasy wirtualne
Programowanie obiektowe Wykład 9: i klasy wirtualne 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD Programowanie obiektowe i metody wirtualne 2 W programowaniu obiektowym polimorfizm
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Object-oriented programming Najpopularniejszy obecnie styl (paradygmat) programowania Rozwinięcie koncepcji programowania strukturalnego
Wykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego Iwona Kochaoska Programowanie Obiektowe Programowanie obiektowe (ang. object-oriented programming) - metodyka tworzenia programów komputerowych,
Programowanie obiektowe
Laboratorium z przedmiotu - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia. Wprowadzenie teoretyczne.
Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),
Tworzenie obiektów Dostęp do obiektów jest realizowany przez referencje. Obiekty w języku Java są tworzone poprzez użycie słowa kluczowego new. String lan = new String( Lancuch ); Obszary pamięci w których
Dokumentacja do API Javy.
Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu
Programowanie obiektowe
Programowanie obiektowe IV. Interfejsy i klasy wewnętrzne Małgorzata Prolejko OBI JA16Z03 Plan Właściwości interfejsów. Interfejsy a klasy abstrakcyjne. Klonowanie obiektów. Klasy wewnętrzne. Dostęp do
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Wykład 7: Pakiety i Interfejsy
Wykład 7: Pakiety i Interfejsy Plik Źródłowy w Javie Składa się z: instrukcji pakietu (pojedyncza, opcjonalna) instrukcji importujących (wielokrotne, opcjonalne) deklaracji klasy publicznej (pojedyncza,
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie
Programowanie obiektowe
Programowanie obiektowe Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Java P. L. Krzysztof Lemay, Naughton Barteczko R. Cadenhead JAVA, Java Podręcznik 2 wykłady dla kaŝdego Języka i ćwiczenia Programowania
Modelowanie i Programowanie Obiektowe
Modelowanie i Programowanie Obiektowe Wykład I: Wstęp 20 październik 2012 Programowanie obiektowe Metodyka wytwarzania oprogramowania Metodyka Metodyka ustandaryzowane dla wybranego obszaru podejście do
Enkapsulacja, dziedziczenie, polimorfizm
17 grudnia 2008 Spis treści I Enkapsulacja 1 Enkapsulacja 2 Spis treści II Enkapsulacja 3 Czym jest interfejs Jak definuje się interfejs? Rozszerzanie interfejsu Implementacja interfejsu Częściowa implementacja
Pakiety i interfejsy. Tomasz Borzyszkowski
Pakiety i interfejsy Tomasz Borzyszkowski Pakiety podstawy W dotychczasowych przykładach nazwy klas musiały pochodzić z jednej przestrzeni nazw, tj. być niepowtarzalne tak, by nie doprowadzić do kolizji
Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej
Programowanie obiektowe Interfejsy Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Interfejsy Autor: Paweł Rogaliński Instytut Informatyki,
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Aplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - wprowadzenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 Klasa zbiór pól i metod Obiekt
Szablony funkcji i klas (templates)
Instrukcja laboratoryjna nr 3 Programowanie w języku C 2 (C++ poziom zaawansowany) Szablony funkcji i klas (templates) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp
Czym są właściwości. Poprawne projektowanie klas
Z akcesorów get i set korzysta każdy kto programuje w C#. Stanowią one duże udogodnienie w programowaniu obiektowym. Zapewniają wygodę, bezpieczeństwo i znacząco skracają kod. Akcesory są ściśle związane
Laboratorium 1 - Programowanie proceduralne i obiektowe
Laboratorium 1 - Programowanie proceduralne i obiektowe mgr inż. Kajetan Kurus 4 marca 2014 1 Podstawy teoretyczne 1. Programowanie proceduralne (powtórzenie z poprzedniego semestru) (a) Czym się charakteryzuje?
JAVA W SUPER EXPRESOWEJ PIGUŁCE
JAVA W SUPER EXPRESOWEJ PIGUŁCE Obiekt Obiekty programowe to zbiór własności i zachowań (zmiennych i metod). Podobnie jak w świecie rzeczywistym obiekty posiadają swój stan i zachowanie. Komunikat Wszystkie
Programowanie obiektowe
Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Rozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
Polimorfizm. dr Jarosław Skaruz
Polimorfizm dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com O czym będzie? finalne składowe klasy abstrakcyjne interfejsy polimorfizm Finalne składowe Domyślnie wszystkie pola i metody
Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.
Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.
Ćwiczenie 1. Przygotowanie środowiska JAVA
Ćwiczenie 1 Przygotowanie środowiska JAVA 1. Wprowadzenie teoretyczne Instalacja JDK (Java Development Kit) NaleŜy pobrać z java.sun.com środowisko i zainstalować je. Następnie naleŝy skonfigurować środowisko.
Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie
Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.
Wyjątki Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut. Wydaje się, że żaden użytkownik oprogramowania nie lubi, kiedy stosowany program nagle zawiesza się,
TEMAT : KLASY DZIEDZICZENIE
TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą
Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne
Projektowanie obiektowe Roman Simiński roman.siminski@us.edu.pl www.siminskionline.pl Wzorce projektowe Wybrane wzorce strukturalne Fasada Facade Pattern 2 Wzorzec Fasada Facade Pattern koncepcja 3 Wzorzec
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie
Analiza i projektowanie aplikacji Java
Analiza i projektowanie aplikacji Java Modele analityczne a projektowe Modele analityczne (konceptualne) pokazują dziedzinę problemu. Modele projektowe (fizyczne) pokazują system informatyczny. Utrzymanie
Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/
Paweł Rajba pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Spis treści Wprowadzenie Automatyczne ładowanie klas Składowe klasy, widoczność składowych Konstruktory i tworzenie obiektów Destruktory i
Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14
Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Wirtualne destruktory class A int* a; A(int _a) a = new int(_a);} virtual ~A() delete a;} class B: public A double* b;
PODEJŚCIE OBIEKTOWE. Przykład 1 metody i atrybuty statyczne
Przykład 1 metody i atrybuty statyczne public class Napis1 { static String wynik; public static void Inicjuj() {wynik = ""; PODEJŚCIE OBIEKTOWE public static void Dopisz_do_wyniku(char ch) { wynik+="\nkod
Interfejsy i klasy wewnętrzne
Interfejsy i klasy wewnętrzne mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Interfejs klasy sposób komunikacji z jej obiektami (zestaw składowych publicznych). Określa on zestaw
Początki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8
Początki Javy Java została pierwotnie zaprojektowana dla telewizji interaktywnej, ale była to zbyt zaawansowaną technologią dla branży cyfrowej telewizji kablowej. James Gosling, Mike Sheridan i Patrick
PARADYGMATY PROGRAMOWANIA Wykład 4
PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej
PHP 5 język obiektowy
PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje
Polimorfizm, metody wirtualne i klasy abstrakcyjne
Programowanie obiektowe Polimorfizm, metody wirtualne i klasy abstrakcyjne Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Polimorfizm,
Język C++ zajęcia nr 2
Język C++ zajęcia nr 2 Inicjalizacja Definiowanie obiektu może być połączone z nadaniem mu wartości początkowej za pomocą inicjalizatora, który umieszczany jest po deklaratorze obiektu. W języku C++ inicjalizator
Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski
Adapter: opis Wzorce Strukturalne Tomasz Borzyszkowski Alternatywna nazwa: Wrapper (opakowanie) Rola obiektu Adapter: pełni wobec Klienta rolę otoczki, która umożliwia przetłumaczenie jego żądań na protokół
Programowanie obiektowe, wykład nr 6. Klasy i obiekty
Dr hab. inż. Lucyna Leniowska, prof. UR, Zakład Mechatroniki, Automatyki i Optoelektroniki, IT Programowanie obiektowe, wykład nr 6 Klasy i obiekty W programowaniu strukturalnym rozwój oprogramowania oparto
Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.
Zadanie: Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób. Na kolejnych zajęciach projekt będzie rozwijana i uzupełniana o kolejne elementy omawiane
Technologie obiektowe
WYKŁAD dr inż. Paweł Jarosz Instytut Informatyki Politechnika Krakowska mail: pjarosz@pk.edu.pl LABORATORIUM dr inż. Paweł Jarosz (3 grupy) mgr inż. Piotr Szuster (3 grupy) warunki zaliczenia Obecność
Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura
Programowanie komputerów Programowanie obiektowe. Typy zmiennych proste i złożone Typy zmiennych "wbudowane", tj. identyfikowane przez słowa kluczowe, są określane jako proste: int short long float double
Technologie i usługi internetowe cz. 2
Technologie i usługi internetowe cz. 2 Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 15 luty 2014 r. 1 Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania,
Definiowanie własnych klas
Programowanie obiektowe Definiowanie własnych klas Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Definiowanie własnych klas Autor:
UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.
UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami
Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016
Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac
1 Atrybuty i metody klasowe
1 Atrybuty i metody klasowe Składowe klasowe (statyczne) Każdy obiekt klasy posiada własny zestaw atrybutów. Metody używają atrybutów odpowiedniego obiektu. Czasem potrzeba atrybutów wspólnych dla wszystkich
Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C
#import "Fraction.h" #import @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator:
Języki i metody programowania Java. Wykład 2 (część 2)
Języki i metody programowania Java INF302W Wykład 2 (część 2) Autor Dr inż. Zofia Kruczkiewicz 1 Struktura wykładu 1. Identyfikacja danych reprezentowanych przez klasy podczas opracowania koncepcji prostego
XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery
http://xqtav.sourceforge.net XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery dr hab. Jerzy Tyszkiewicz dr Andrzej Kierzek mgr Jacek Sroka Grzegorz Kaczor praca mgr pod
Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.
Wielowątkowość Programowanie w środowisku rozproszonym. Wykład 1. Informacje organizacyjne Wymiar godzin: W-30, LAB-15 Zaliczenie wykonanie kilku programów i ich zaliczenie (w trakcie zajęć laboratoryjnych)
Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13
Klasy Klasa to grupa obiektów, które mają wspólne właściwości, a obiekt jest instancją klasy. Klasa w języku Java może zawierać: pola - reprezentują stan obiektu (odniesienie do pola z kropką), methods
Materiały do zajęć VII
Spis treści I. Klasy Materiały do zajęć VII II. III. Konstruktor Właściwości i indeksatory Klasy Programowanie obiektowe wiadomości wstępne Paradygmat programowania obiektowego Abstrakcja Hermetyzacja
Programowanie obiektowe
Programowanie obiektowe III. Refleksja Małgorzata Prolejko OBI JA16Z03 Plan Klasa Class. Analiza funkcjonalności klasy. Podstawy obsługi wyjątków. Zastosowanie refleksji do analizy obiektów. Wywoływanie
Pola i metody statyczne. Klasy zawierające pola i metody statyczne
Instrukcja laboratoryjna nr 1 Programowanie w języku C 2 (C++ poziom zaawansowany) Pola i metody statyczne. Klasy zawierające pola i metody statyczne dr inż. Kaczmarek Tomasz mgr inż. Lasota Maciej dr
Programowanie 2. Język C++. Wykład 3.
3.1 Programowanie zorientowane obiektowo... 1 3.2 Unie... 2 3.3 Struktury... 3 3.4 Klasy... 4 3.5 Elementy klasy... 5 3.6 Dostęp do elementów klasy... 7 3.7 Wskaźnik this... 10 3.1 Programowanie zorientowane
Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy wykład 2, część 1 1 Język JAVA podstawy Plan wykładu: 1. Rodzaje programów w Javie 2. Tworzenie aplikacji 3. Tworzenie apletów 4. Obsługa archiwów 5. Wyjątki 6. Klasa w klasie! 2 Język
Charakterystyka oprogramowania obiektowego
Charakterystyka oprogramowania obiektowego 1. Definicja systemu informatycznego 2. Model procesu wytwarzania oprogramowania - model cyklu Ŝycia oprogramowania 3. Wymagania 4. Problemy z podejściem nieobiektowym
Spis treści. 1 Java T M
Spis treści 1 Java T M 1 2 Co to jest Platforma Java T M 1 3 Przygotowanie komputera 2 4 Pierwszy program 2 5 Dokumentacja 3 6 Budowa aplikacji. Klasy. 3 7 Pola i metody 4 8 Konstruktory 5 9 Inne proste
Kompozycja i dziedziczenie klas
Związki między klasami: jest i zawiera Programowanie obiektowe Przkład: Pojazd Kompozycja i dziedziczenie klas Silnik Pojazd silnikowy Rower Wóz konny Paweł Rogaliński Instytut Informatyki, Automatyki
Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak
Java: otwórz okienko Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU klasy wewnętrzne, lokalne i anonimowe biblioteka AWT zestaw Swing JFrame JPanel komponenty obsługa zdarzeń
KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany
KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie
Definiowanie własnych klas
Abstrakcja Programowanie obiektowe Definiowanie własnych klas Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej Świat rzeczywisty jest bardzo złoŝony i nie jest moŝliwe
Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h
Programowanie II Lista 3 Modyfikatory dostępu plik TKLientBanku.h plik z funkcją main Przyjaźń Dziedziczenie Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące. Jest to
Java - tablice, konstruktory, dziedziczenie i hermetyzacja
Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja
Język JAVA podstawy. wykład 1, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy wykład 1, część 3 1 Język JAVA podstawy Plan wykładu: 1. Krótka historia Javy 2. Jak przygotować sobie środowisko programistyczne 3. Opis środowiska JDK 4. Tworzenie programu krok po
Java EE produkcja oprogramowania
Java EE produkcja oprogramowania PPJ PODSTAWY PROGRAMOWANIA W JAVIE PODSTAWY JĘZYKA JAVA 1 Warszawa, 2016Z 2 Ogólna charakterystyka języka Java 3 Java 1/2 Język programowania Java został opracowany przez
Zmienne, stałe i operatory
Zmienne, stałe i operatory Przemysław Gawroński D-10, p. 234 Wykład 2 4 marca 2019 (Wykład 2) Zmienne, stałe i operatory 4 marca 2019 1 / 21 Outline 1 Zmienne 2 Stałe 3 Operatory (Wykład 2) Zmienne, stałe
Język programowania. Andrzej Bobyk http://www.alfabeta.lublin.pl. www.alfabeta.lublin.pl/jp/
Język programowania Andrzej Bobyk http://www.alfabeta.lublin.pl www.alfabeta.lublin.pl/jp/ Literatura K. Reisdorph: Delphi 6 dla każdego. Helion, Gliwice 2001 A. Grażyński, Z. Zarzycki: Delphi 7 dla każdego.
Klasy cd. Struktury Interfejsy Wyjątki
Klasy cd. Struktury Interfejsy Wyjątki Struktury Struktura pozwala na zdefiniowanie typu danych, który nie charakteryzuje się zbyt złożoną funkcjonalnością (np. punkt, kolor, etc). Do definiowania struktury
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Język programowania prosty bezpieczny zorientowany obiektowo wielowątkowy rozproszony przenaszalny interpretowany dynamiczny wydajny Platforma
Programowanie obiektowe
Programowanie obiektowe Laboratorium 3 i 4 - przypomnienie wiadomości o OOP na przykładzie Javy mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 8 marca 2017 1 / 20 mgr inż. Krzysztof Szwarc
Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY
Różne właściwości Funkcje tak samo jak zmienne mają swoje miejsce w pamięci, gdzie są zapisane. Można więc uzyskać ich adres. Podobnie jak adres tablicy jest zwracany przez jej nazwę, podaną bez nawiasu
Współbieżność w środowisku Java
Współbieżność w środowisku Java Wątki i ich synchronizacja Zagadnienia Tworzenie wątków Stany wątków i ich zmiana Demony Synchronizacja wątków wzajemne wykluczanie oczekiwanie na zmiennych warunkowych
Podstawy Języka Java
Podstawy Języka Java Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania, w którym programy definiuje się za pomocą obiektów elementów łączących