Programowanie w języku Java WYKŁAD



Podobne dokumenty
Programowanie obiektowe

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Aplikacje w środowisku Java

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Dokumentacja do API Javy.

PHP 5 język obiektowy

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie obiektowe

Programowanie obiektowe - 1.

Programowanie obiektowe

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Modelowanie obiektowe

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Kurs WWW. Paweł Rajba.

Aplikacje w środowisku Java

Wzorce logiki dziedziny

Programowanie obiektowe

METODY PROGRAMOWANIA

Laboratorium 6 DIAGRAM KLAS (Class Diagram)

Java Język programowania

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop Spis treści

Programowanie obiektowe

Wzorce projektowe. dr inż. Marcin Pietroo

Dziedziczenie. dr Jarosław Skaruz

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Technologie i usługi internetowe cz. 2

Technologie obiektowe

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Programowanie obiektowe

Zaawansowane programowanie obiektowe - wykład 5

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Programowane refleksyjne i serializacja

Podstawy Programowania Obiektowego

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.


Języki i metody programowania Java. Wykład 2 (część 2)

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

Programowanie w języku Java WYKŁAD

Programowanie obiektowe

Programowanie obiektowe W1 Wprowadzenie. Dr hab. inż. Lucyna Leniowska, prof. UR Zakład Mechatroniki, Automatyki i Optoelektroniki

Interfejsy i klasy wewnętrzne

Dziedziczenie jednobazowe, poliformizm

Oracle PL/SQL. Paweł Rajba.

Programowanie obiektowe

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

KOTLIN. Język programowania dla Androida

Wywoływanie metod zdalnych

Programowanie obiektowe. Wprowadzenie

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

Wykład 1 Inżynieria Oprogramowania

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Multimedia JAVA. Historia

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Projektowanie Aplikacji Internetowych Jarosław Kuchta. Wzorce projektowe warstwy biznesowej

Scala - programowanie obiektowo-funkcyjne

Programowanie Obiektowe Ćwiczenie 4

Język programowania Scala / Grzegorz Balcerek. Wyd. 2. Poznań, cop Spis treści

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

Programowanie komponentowe 5

Wzorce dystrybucji i wspólbieżności autonomicznej

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Wykład 6: Dziedziczenie

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Zaawansowane programowanie w C++ (PCP)

Programowanie współbieżne i rozproszone

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Programowanie obiektowe

Technologia Programowania 2016/2017 Wykład 4

Klasy abstrakcyjne i interfejsy

TEMAT : KLASY DZIEDZICZENIE

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wzorce projektowe. dr inż. Marcin Pietroo

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Diagramy klas. dr Jarosław Skaruz

Analiza i projektowanie aplikacji Java

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Informatyka I stopień (I stopień / II stopień) Ogólnoakademicki (ogólno akademicki / praktyczny) stacjonarne (stacjonarne / niestacjonarne)

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

Przykładowa implementacja

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

.NET Klasy, obiekty. ciąg dalszy

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Transkrypt:

Programowanie w języku Java WYKŁAD dr inż. Piotr Zabawa Certyfikowany Konsultant IBM/Rational e-mail: pzabawa@pk.edu.pl www: http://www.pk.edu.pl/~pzabawa 26.05.2014

WYKŁAD 13 Refleksja Data Access Object (DAO)

Refleksja

Refleksja Zakład Inżynierii Oprogramowania Refleksja jest jedną z cech charakterystycznych języka Java. Jednak wsparcie ze strony tego języka dla refleksji jest dość ograniczone charakter tych ograniczeń zostanie przedstawiony na kolejnych slajdach na tle cech charakterystycznych refleksji.

Refleksja Zakład Inżynierii Oprogramowania Jest to pojęcie z dziedziny informatyki oznaczające proces, dzięki któremu program komputerowy może być modyfikowany w trakcie działania w sposób zależny od własnego kodu oraz od zachowania w trakcie wykonania. Paradygmat programowania ściśle związany z mechanizmem refleksji to programowanie refleksyjne. Refleksja jest więc cechą interfejsu programistycznego i techniką programistyczną posiadającą dwa aspekty: Możliwość dynamicznego uzyskania podczas wykonywania programu jego meta-danych, np. struktury klas, dostępnych metod w klasie, typów argumentów metod, informacji o nadklasach danego obiektu, interfejsów do obiektów Możliwość wykorzystania powyższych informacji w programie np. przez utworzenie w czasie wykonania stringu zawierającego kod do wykonania w tym samym programie w czasie tej samej sesji programu

Refleksja Zakład Inżynierii Oprogramowania Refleksja jest jednym z mechanizmów wykorzystywanych w dynamicznych językach programowania, takich jak np. Groovy Scala Ruby (w tym JRuby) Eiffel Erlang Lisp Perl Prolog Pyton (w tym Jyton) Smalltalk Clojure

Refleksja Zakład Inżynierii Oprogramowania W przypadku języka Java należy wziąć pod uwagę ograniczenie polegające na zjawisku zacierania typów (wspomniane na wykładzie o typach uogólnionych i o kontenerach). Zjawisko to osłabia mechanizm refleksji. Kolejne ograniczenie dotyczyło możliwości wstrzykiwania kodu do wersji Java 7. Ograniczenie to zostało jednak w znacznym stopniu zniesione za pomocą wyrażeń Lambda w Java 8. W ten sposób znacznie osłabiono problemy w Java związane z drugim aspektem refleksji. Jest to zarazem znaczący krok w stronę tzw. języków dynamicznych.

Refleksja Zakład Inżynierii Oprogramowania Mechanizm refleksji został zaimplementowany w bibliotekach standardowych Java w pakietach: java.lang.reflect java.lang

Refleksja dynamiczne ładowanie klas Wszystkie klasy Java dziedziczą z klasy Object. Dlatego właśnie możliwe było wprowadzenie mechanizmu refleksji. Każdy obiekt ma metodę getclass() zaimplementowaną w klasie Object. Zwraca ona informację o klasie danego obiektu. Informacja ta znajduje się w obiekcie java.lang.class, a wspomniana metoda zwraca referencję do tego obiektu. Po uzyskaniu referencji do tego obiektu można na nim wykonywać szereg operacji, np. getsuperclass() - zwracającą obiekt klasy Class oznaczający klasę bazową danej klasy, getinterfaces() - zawracającą tablicę obiektów, zawierającą interfejsy danej klasy, newinstance() - tworzącą nowy obiekt danej klasy. Zakład Inżynierii Oprogramowania

Refleksja dynamiczne ładowanie klas Warto zwrócić uwagę na metodę newinstance() jedyną, za pomocą której możemy tworzyć nowe obiekty w ramach mechanizmu refleksji. Nie możemy korzystać z operatora new().

Refleksja Zakład Inżynierii Oprogramowania Podstawową metodą umożliwiającą realizowanie wywołań metod w ramach mechanizmu refleksji jest invokemethod(), której argumentami są obiekt, na którym ma zostać wywołana metoda oraz argumenty wywoływanej metody. Przykład. Statyczne wywołanie: o.getdata(); Dynamiczne wywołanie: o.invokemethod("getdata");

Refleksja Zakład Inżynierii Oprogramowania Klasy pakietu java.lang.reflect Array Constructor uzyskiwanie informacji i dostęp do konstruktora danej klasy przydatne przy dynamicznym tworzeniu obiektu Field informacja i dostęp do wartości pola Method informacja o metodzie danej klasy i dynamiczne jej wywołanie na rzecz wskazanego obiektu Modifier infomacja o modyfikatorach składowej obiektu lub klasy

Refleksja Zakład Inżynierii Oprogramowania Przydatne metody klasy java.lang.class getclasses()/getdeclaredclasses() zwracają tablicę obiektów klasy Class, które są składowymi danej klasy getconstructors()/getdeclaredconstructors() zwracają tablicę obiektów klasy Constructor; są to konstruktory danej klasy getconstructor(class[])/getdeclaredconstructor(class[]) - zwracają obiekt konstruktor (obiekt klasy konstruktor), który ma podane typy argumentów getmethods()/getdeclaredmethods() - zwracają tablicę, zawierającą odnośniki do metod klasy. Metody są obiektami klasy Method. getmethod(string, Class[])/getDeclaredMethod(String, Class[]) - zwracają metodę o podanej nazwie i podanych argumentach jako obiekt klsy Method.

Refleksja Zakład Inżynierii Oprogramowania Uwaga: Metody z Declared zwracają wszystkie metody zadeklarowane w danej klasie (wraz z prywatnymi) ale bez dziedziczonych Metody bez Declared zwracają wszystkie metody publiczne wraz z publicznymi dziedziczonymi

Refleksja Zakład Inżynierii Oprogramowania Przykład zastosowania mechanizmu refleksji podany na stronie internetowej wykładu.

Dalej wykorzystano w znacznym stopniu: http://tutorials.jenkov.com/java-persistence/index.html oraz: http://www.eti.pg.gda.pl/katedry/kask/pracownicy/jarosl aw.kuchta/pai/laboratorium_nr_6.pdf

Jest to wzorzec architektoniczny wspierający operacje na warstwie danych. Wprowadza do oprogramowania dodatkową warstwę odpowiedzialną za dostęp do danych. Został wprowadzony najpierw do Java EE przez firmę Sun, jest jednak dostępny w większości technologii.

Wzorzec DAO służy do odseparowania informacji o danych aplikacji od sposobu, w jaki zapewniany jest dla nich mechanizm trwałości. Innymi słowy, aplikacja (jej warstwa logiki biznesowej) odwołuje się do danych w sposób niezależny od tego jak ani czy zapewniono ich trwałość. Zastosowanie takiego wzorca pozwala w konsekwencji na zmianę technologii zapewniania trwałości. W przypadku zastosowania technologii Hibernate wraz z DAO warstwa logiki biznesowej nie wie o fakcie zastosowania Hibernate do zapewnienia trwałości. Zmiana technologii trwałości dzięki użyciu DAO zawęża obszar zmian w kodzie do klas warstwy DAO i nie ma wpływu na warstwę logiki biznesowej. W praktyce zapewnienie aż tak daleko idącego uniezależnienia warstwy logiki biznesowej od mechanizmu trwałości może okazać się trudne do osiągnięcia. Dalej scharakteryzowano trudności.

Zakresy połączeń DAO (DAO connection scope) Jakie są możliwe relacje pomiędzy elementami DAO i połączeniami z bazą danych: Zakres metody każda metoda zarządza swoim połączeniem Zakres instancji każdy obiekt DAO zarządza swoim połączeniem Zakres wątku cała grupa obiektów DAO używanych przez dany wątek dla danej sesji z bazą danych zarządza swoim wątkiem

Zakres metody public class PersonDao{ protected DataSource datasource = null; public PersonDao(DataSource datasource){ this.datasource = datasource; public Person readperson(long personid){ Connection connection = this.datasource.getconnection(); try{ Person person =... return person; finally { connection.close();

Problemy: Wywołanie jednej metody DAO w drugiej marnowanie połączeń Jeśli dwie metody mają być wykonane w tej samej transakcji, to muszą używać tego samego połączenia jak to zapewnić w tym podjściu?

Zakres instancji public class PersonDao{ protected Connection connection = null; public PersonDao(Connection connection){ this.connection = connection; public Person readperson(long personid){ Person person =... return person;

Problemy: Warstwa DAO nie wie jak zarządzać otwieraniem/zamykaniem połączeń Warstwa logiki biznesowej nie powinna zajmować się otwieraniem/zamykaniem połączeń, ponieważ ma być od nich niezależna Możliwość zastosowania wzorca projektowego Metody Wytwórczej do otwierania połączeń, ale każdy obiekt DAO zamyka połączenie: PersonDao persondao = daofactory.createpersondao(); Person person = persondao.readperson(666);... persondao.close(); Co zrobić gdy musimy zapewnić wielu obiektom DAO skorzystanie z tego samego połączenia?

Zakres wątku daofactory.beginconnectionscope(); PersonDao persondao = daofactory.createpersondao(); VehicleDao vehicledao = daofactory.createvehicledao(); //... daofactory.endconnectionscope();

Transakcje w DAO Obsługę transakcji można w naturalny sposób wpasować w realizację DAO z zakresem wątku. daofactory.beginconnectionscope(); daofactory.begintransaction(); PersonDao persondao = daofactory.createpersondao(); VehicleDao vehicledao = daofactory.createvehicledao(); //... daofactory.endtransaction(); daofactory.endconnectionscope();

W ramach jednego połączenia można zrealizować wiele transakcji. Spośród przedstawiony powyżej rozwiązań zarówno zakres wątku jak i zakres transakcji pozwalają ukryć przed warstwą logiki biznesowej sposób realizacji warstwy trwałości. Jednak nadal pozostają nierozwiązane dwa problemy: Demarcation of the connection Zakresy transakcji Ich rozwiązanie zostanie przedstawione w ramach DAOManager.

Obsługa wyjątków DAO W rozwiązaniach podanych wyżej jako zakres wątku lub zakres transakcji zgłoszenie wyjątku w jednej z metod DAO powoduje nieprawidłowe zachowanie aplikacji. Prawidłowy sposób obsługi wyjątków podano na następnym slajdzie.

try{ daofactory.beginconnectionscope(); try{ daofactory.begintransaction(); PersonDao persondao = daofactory.createpersondao(); VehicleDao vehicledao = daofactory.createvehicledao(); daofactory.endtransaction(); catch(exception e){ daofactory.aborttransaction(e); finally { daofactory.endconnectionscope();

DAOManager Pozwala rozwiązać problemy nie rozwiązane wcześniej z wykorzystaniem fabryk.

public class DaoManager{ protected Connection connection = null; protected PersonDao persondao = null; public DaoManager(Connection connection){ this.connection = connection; public PersonDao getpersondao(){ if(this.persondao == null){ this.persondao = new PersonDao(this.connection); return this.persondao;

Zakres połączenia DAOManager Sposób użycia w warstwie logiki biznesowej: DaoManager daomanager = daofactory.createdaomanager(); Person person = daomanager.getpersondao().readperson(666); Jak widać nie wykonano operacji close(). Aby ją zaimplementować warto zastosować wzorzec projektowy Metoda szablonowa. Jego realizację przedstawiono dalej.

public class DaoManager{... public Object executeandclose(daocommand command){ try{ return command.execute(this); finally { this.connection.close();

public interface DaoCommand { public Object execute(daomanager daomanager); Sposób korzystania: DaoManager daomanager = daofactory.createdaomanager(); Person person = (Person) daomanager.executeandclose(new DaoCommand(){ public Object execute(daomanager manager){ return manager.getpersondao().readperson(666); );

Zakres transakcji DAOManager Podobnie jak dodano do DAOManager a metodę zarządzania połączeniami, można dodać metodę zarządzania transakcjami i ponownie wykorzystać tym razem dla transakcyjności wzorzec projektowy metoda szablonowa. Dodanie tej metody pokazano na następnym slajdzie, jednak z obsługą wyjątków bardzo uproszczoną i nie działającą poprawnie w niektórych sytuacjach.

public class DaoManager{... public Object transaction(daocommand command){ try{ this.connection.setautocommit(false); Object returnvalue = command.execute(this); this.connection.commit(); return returnvalue; catch(exception e){ this.connection.rollback(); throw e; //or wrap it before rethrowing it finally { this.connection.setautocommit(true);

Sposób wykorzystania tej metody: DaoManager daomanager = daofactory.createdaomanager(); daomanager.transaction(new DaoCommand(){ public Object execute(daomanager manager){ Person person = manager.getpersondao().readperson(666); ); person.setlastname("nick"); manager.getpersondao().updateperson(person);

Zamknięcie połączenia można zrealizować przez analogię do poprzedniego rozwiązania: public class DaoManager{ //... public Object transactionandclose(daocommand command){ executeandclose(new DaoCommand(){ public Object execute(daomanager manager){ ); manager.transaction(command);

Podsumowanie DaoManager daomanager = daofactory.createdaomanager(); daomanager.transaction(new DaoCommand(){ public Object execute(daomanager manager){ Person person = manager.getpersondao().readperson(666); person.setlastname("nick"); manager.getpersondao().updateperson(person); );

Problemy rozwiązane za pomocą DAOManager a: Zaznaczenie zakresu życia połączenia Zaznaczenia zakresu transakcji Automatyzacja otwierania/zamykania połaczenia Automatyzacja zatwierdzania/odrzucania transakcji Centralizacja obsługi wyjątków Centralizacja dostępu do DAO ułatwienie identyfikacji wszystkich DAO lub ułatwienie ich ponownego użycia

Wykorzystanie DAO we frameworkach Javy: Hibernate Spring http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/dao/su pport/daosupport.html Apache Hibernate Generic DAO: https://code.google.com/p/hibernate-generic-dao/

Generalizacje DAO. Wiele implementacji DAO opiera się na typach generycznych parametryzowanych klasą DAO. Podejście takie uważane jest za dobrą praktykę.

Wzorce danych

Wzorce danych Zakład Inżynierii Oprogramowania Istnieje wiele wzorców związanych ze współpracą warstwy logiki biznesowej z warstwą danych. Są to wzorce architektoniczne lub architektoniczne wzorce korporacyjne. Warto zwrócić uwagę na dużo mniejsze uporządkowanie i usystematyzowanie tych wzorców w porównania z wzorcami projektowymi.

Wzorce danych Zakład Inżynierii Oprogramowania Martin Fowler [http://martinfowler.com/eaacatalog/]: Data Transfer Object (DTO) http://martinfowler.com/eaacatalog/datatransferobject.html Active Record http://martinfowler.com/eaacatalog/activerecord.html Data Mapper http://martinfowler.com/eaacatalog/datamapper.html Table Data Gateway http://martinfowler.com/eaacatalog/tabledatagateway.html Row Data Gateway http://martinfowler.com/eaacatalog/rowdatagateway.html

Wzorce danych Zakład Inżynierii Oprogramowania Core J2EE patterns Data Access Objects (DAO) Transfer Object Value List Handler Domain Store http://www.corej2eepatterns.com/domainstore.htm Eneterprise Integration Patterns http://www.eaipatterns.com/

Koniec