Wzorce logiki dziedziny



Podobne dokumenty
Wzorce dystrybucji i wspólbieżności autonomicznej

METODY PROGRAMOWANIA

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

Programowanie obiektowe

Usługa TimerService

Enterprise JavaBeans

Stanowe komponenty sesyjne

Przykładowa implementacja

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Java: interfejsy i klasy wewnętrzne

"Biznesowe" wzorce projektowe

Podejście obiektowe do relacyjnych baz danych Hibernate.

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

JAX-RS czyli REST w Javie. Adam Kędziora

JAVA W SUPER EXPRESOWEJ PIGUŁCE

JAVA I BAZY DANYCH. MATERIAŁY:

Metody dostępu do danych

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Projektowanie Aplikacji Internetowych. Wzorce projektowe warstwy usług

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

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

Projektowanie Aplikacji Rozproszonych Jarosław Kuchta. Wzorce projektowe warstwy danych

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Metody dostępu do danych

Programowanie w języku Java. Bazy danych SQLite w Javie

Aplikacje RMI Lab4

Programowanie komponentowe 5

Wzorce prezentacji internetowych

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Wykład 7: Pakiety i Interfejsy

Komponenty sterowane komunikatami

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Plik pobrano z Tytuł: Wzorce projektowe, cz. 2 Strategy Ostatnia aktualizacja:

Bazy danych tworzenie aplikacji bazodanowych ORM / JPA

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

MVC w praktyce tworzymy system artykułów. cz. 1

Aplikacje RMI

Analiza i projektowanie obiektowe 2016/2017. Wykład 11: Zaawansowane wzorce projektowe (1)

Java i bazy danych. 1. JDBC podstawy, transakcje. 2. Mapowanie relacyjno obiektowe. Hibernate, przykład.

Programowanie obiektowe

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Diagram stanów Laboratorium 9

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

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


Laboratorium 8 Diagramy aktywności

SYSTEM MONITORINGU PARAMETRÓW WĘZŁÓW PRZECHOWYWANIA DANYCH DLA PROJEKTU KRAJOWY MAGAZYN DANYCH PODRĘCZNIK DEWELOPERA

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

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

Programowanie i projektowanie obiektowe

Kurs programowania aplikacji bazodanowych

Fragmenty są wspierane od Androida 1.6

Współbieżność w środowisku Java

Wykład 12. Programowanie serwera MS SQL 2005 w C#

przygotował: Bazy danych Paweł Kasprowski Wersja 2006Z

Wywoływanie metod zdalnych

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie w języku Java WYKŁAD

Klasy abstrakcyjne, interfejsy i polimorfizm

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Programowanie obiektowe

EJB 2.x oraz zmiany w standardzie dla EJB 3.0. Michał Stanek

Diagramy stanów tworzenie modeli analizy i projektowania Na podstawie UML 2.0 Tutorial

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Dokumentacja do API Javy.

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie Obiektowe Ćwiczenie 4

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Programowanie obiektowe

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Zagadnienia projektowania aplikacji J2EE

public interface TravelAgent { public void makereservation(int cruiseid, int cabinid, int customerid, double price); }

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Wstęp. Ale po co? Implementacja

Programowanie zorientowane obiektowo. Mateusz Kołecki

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

Programowanie wielowarstwowe i komponentowe

Platformy Programistyczne Podstawy języka Java

Aplikacje w środowisku Java

1. Podstawowe usługi bezpieczeństwa. 2. Użytkownicy i role. przydzielanie uprawnie ń metodom, role komponentów, korzystanie i konfiguracja

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

NHibernate Hibernate dla platformy.net. Hibernate posiada także dużą społeczność, zatem nietrudno uzyskać jakieś wsparcie w przypadku problemów.

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Jakarta POI. POIFS obsługa dokumentów OLE 2, HSSF dokumenty w formacie Excel'a, HWPF proste dokumenty w formacie Word 97,

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

Wywoływanie metod zdalnych

Wprowadzenie do Enterprise JavaBeans 2.0

Wprowadzenie do programowania aplikacji mobilnych

Zaawansowane aplikacje WWW - laboratorium

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Transkrypt:

Wzorce logiki dziedziny 1. Wzorce logiki dziedziny skrypt transakcji (Transaction Script), brama tabeli (Table Data Gateway), model dziedziny (Domain model), strategia (Strategy), moduł tabeli (Table Module), zbiór rekordów (Record Set). 4. Warstwa usług Domain Facade, Operation Scripts, Layer Supertype, Session Facade. 1

Transaction Script Pojedyncza interakcja pomiędzy programem klienckim a aplikacja biznesową zwykle powoduje (zgodnie z logiką aplikacji) wykonanie szeregu operacji transakcji. Wzorzec Transaction Script implementuje je w pojedynczej procedurze. Przykład: Procedura rezerwacji kabiny: - utworzenie nowej rezerwacji w systemie, - obciążenie karty kredytowej, - wydrukowanie biletu. 2

Przykład Sprzedaż ratalna: Product type 1 N 1 N Contract signed total Installment amount date Z każdą umową związany jest jeden rodzaj produktów. Każda wpłata dotyczy określonej umowy. Chcemy: - znaleźć przychód na dany dzień wynikający z określonej umowy, - tworzyć harmonogramy spłat. 3

Table Data Gateway class InstallmentGateway... public ResultSet finfinstallmentfor(long cid, date d){ PreparedStatement stmt = db.preparestatement( "SELECT amount FROM installment WHERE" + " con_id =? AND date <=?"); stmt.setlong(1, cid); stmt.setdate(2, d); return stmt.executequery(); Wzorzec Gateway służy do oddzielenia kodu SQL od reszty aplikacji. Zwykle dla jednej tabeli tworzona jest jedna klasa typu Gateway. 4

Transaction Script class InstallmentService... public Money getincome(long cid, Date d){ Money m = new Money(0.0); try{ ResultSet rs = db.findinstallmentfor(cid, d) while(rs.next()){ m.add(new Money(rs.getBigDecimal("amount"))) return m; catch(sqlexception ex){ throw new ApplicationException(ex); Skrypt sumuje dane przekazane przez bramę zawiera logikę biznesową. 5

Transaction Script Analogicznie realizujemy tworzenie harmonogramy spłat: class InstallmentService... public void calculateinstallments(long cid){ try{ ResultSet rs = db.findcontract(cid); rs.next(); Date d = rs.getdate("signed"); Money total = rs.getbigdecimal("total"); String type = rs.getstring("type"); if (type.equals("a")){ Money inst = total.allocate(3); db.insertintallment(cid, inst[0], d); db.insertintallment(cid, inst[1], d.addmonth(1)); db.insertintallment(cid, inst[2], d.addmonth(2)); else if (type.equals("b")){ Money inst = total.allocate(2); db.insertintallment(cid, inst[0], d.addmonth(6)); db.insertintallment(cid, inst[1], d.addmonth(12));... catch(sqlexception ex){... 6

Transaction Script InstallmentService getincome(long, Date): Money calculateinstallments(long): void Zalety: - prostota w przypadku niewielkich aplikacji, - efektywność Wady: - powtórzenia kodu, 7

Domain Model Przychód na dany dzień wynikający z określonej umowy jest obliczany w klasie Contract.... class Contract... private List<Installment> installments;... public Money getincome(date d){ Money m = new Money(0.0); for (Iterator<Installment> it = installments.iterator(); it.hasnext(); ){ Installment inst = it.next(); if (inst.getdate().before(d)){ m.add(inst.getamount()); return m; 8

Domain Model Tworzenie odpowiednich obiektów Installment jest realizowane przy współpracy kilku klas. class Contract... private Product product; private Money total; private Date signed;... public Contract(Product p, Modey m, Date d){ this.product = p; this.total = m; this.signed = d; 9

Domain Model class Product... private InstallmentStrategy strategy;... public Product(..., InstallmentStrategy s){... this.strategy = s; public static Product newtypea(...){ return new Product(..., new TypeAStrategy()); public static Product newtypeb(...){ return new Product(..., new TypeBStrategy()); Dodatkowo wykorzystamy wzorzec Strategii (Strategy).. 10

Domain Model class InstallmentStrategy{ abstract void calculateinstallments(contract c); class TypeAStrategy{ void calculateinstallments(contract c){ Money inst = c.gettotal.allocate(3); Date d = c.getsigned(); c.addinstallment(inst[0], d); c.addinstallment(inst[1], d.addmonth(1)); c.addinstallment(inst[2], d.addmonth(2)); class TypeBStrategy{ void calculateinstallments(contract c){ Money inst = c.gettotal.allocate(2); Date d = c.getsigned(); c.addinstallment(inst[0], d.addmonth(6)); c.addinstallment(inst[1], d.addmonth(12)); Strategie umożliwiają łatwą rozbudowę aplikacji o nowe reguły biznesowe. 11

Domain Model class Product... public void calculateinstallments(contract c){ this.strategy.calculateinstallments(); class Contract... public void calculateinstallments(){ this.product.calculateinstallments(this) ; Przekazujemy zlecenie do obiektu, który jest najbardziej kompetentny do obsługi. Watro zwrócić uwagę na brak instrukcji warunkowych. Logika aplikacji jest wpisana w strukturę obiektów. 12

Domain Model Contract... getincome(date): Money calculateinstallments(): void * 1 Product calculateinstallments(contact): void * 1 InstallmentStrategy calculateinstallments(contract): void TypeAStrategy calculateinstallments(contract): void TypeBStrategy calculateinstallments(contract): void 13

Table Module Problemem Domain Model jest implementacja interfejsu relacyjnej bazy danych. We wzorcu Table Module logika dziedziny jest umieszczona w klasach odpowiadających poszczególnym tabelom w bazie danych. Podstawowa różnica względem Domain Model polega na tym, że obsługa wielu rekordów w bazie danych (egzemplarzy) jest realizowana przez jeden obiekt. 14

Table Module Contract... getincome(date) gettype(id) Product Installment insert(id, amount, date) 15

FilteredRowSet W Javie najodpowiedniejszym narzędziem umożliwiającym dostęp do danych we wzorcu TableModule jest interfejs javax.sql.rowset.filteredrowset: FilteredRowSet frs = new FilteredRowSetImpl(); frs.populate(rs); Range name = new Range("From", "To", "column"); frs.setfilter(name); frs.next() // to co zostanie zwrócone zależy od implementacji klasy Range() Filtr jest tworzony w oparciu o implementacje interfejsu javax.sql.rowset.predicate. 16

Predicate public class Range implements Predicate { private Object form, to; private String column; public Range(Object f, Object t, String s) { this.from = f; this.to = t; this.column = s; public boolean evaluate(rowset rs) { boolean b1, b2; if ((rs.getobject(this.column) >= this.from) && (rs.getobject(this.column) <= this.to)){ return true; // spelnia warunki filtra else { return false; 17

Table Module Klasa Contract zarządza wszystkimi operacjami wykonywanymi na wszystkich kontraktach. class Contract... private Rowset rows; public Contract(RowSet rs){ this.rows = rs; public ResultSet findcontract(int cid){ FilteredRowSet frs = new FilteredRowSetImpl(); frs.populate(rs); RSFilter filter = new RSFilter(cid, "con_id"); frs.setfilter(name); return frs; 18

Table Module Implementacja poszczególnych operacji jest bardzo podobna do tej ze wzorca TransactionScript. public void calculateinstallments(long cid){ try{ ResultSet rs = this.findcontract(cid); rs.next(); Date d = rs.getdate("signed"); Money total = rs.getbigdecimal("total"); String type = rs.getstring("type"); if (type.equals("a")){... catch(sqlexception ex){ throw new ApplicationException(ex); 19

Porównanie wzorców logiki dziedziny Transaction Script Table Module nakład pracy Domain Model złożoność 20

Service Layer Zwykle logikę biznesową dzieli się na dwa rodzaje: logikę dziedziny operacje wyłącznie na dziedzinie problemu (np. obliczanie rat), logikę aplikacji (pracy) funkcje aplikacji (logowanie, przesyłanie wiadomości o zmianach w dziedzinie itp.). W przypadku Domain Model obie funkcje są realizowane przez klasy obiektów dziedziny. Powoduje to brak możliwości użycia tych obiektów w innych aplikacjach (z inną logiką aplikacji) oraz problemy przy ewentualnych zmianach logiki aplikacji. Z tego powodu warto rozdzielić oba rodzaje logiki biznesowej i umieścić je w nowej warstwie warstwie usług. 21

Service Layer interfejsy użytkownika bramy integracyjne import danych warstwa usług model dziedziny warstwa źródła danych 22

Service Layer Sposoby implementacji: fasada dziedziny (domain facade) logika biznesowa w całości pozostaje w modelu dziedziny. Warstwa usług wyznacza zbiór operacji, które mogą być używane przez warstwy klienckie. skrypty operacji (operation scripts) zbiór klas bezpośrednio implementujących logikę aplikacji. Logika dziedziny jest realizowana przez hermetyczne klasy obiektów dziedziny. Zbiór klas skryptów operacji zwykle korzysta ze wzorca Layer Supertype okreslającego zakres funkcji oraz wspólne zachowania. 23

Layer supertype Wzorzec polega na wprowadzeniu klasy bazowej dla wszystkich klas danej warstwy. class DomainObject { private long id;... public long getid(){ return this.id; public void setid(long l){ this.id = l; 24

Service Layer a Java Najczęściej rolę warstwy Service Layer pełnią bezstanowe komponenty sesysjne wyposażone w interfejs lokalny. Podobnym wzorcem dla środowiska JEE jest wzorzec Session Facade, jednak jego podstawową funkcją jest poprawa wydajności poprzez osłonięcie komponentów encyjnych przed nadmierną ilością wywołań (EJB 2.0). Service Layer dzieli implementację aby zredukować powtórzenia kodu i umożliwić powtórne użycie obiektów dziedziny. 25

Podsumowanie Podstawowe wzorce logiki dziedziny to Transaction Script i Domain Model. Wzorzec Table Module można stosować, gdy język programowania w naturalny sposób dostarcza implementacji wzorca Record Set. Aby nie umieszczać logiki aplikacji w implementacji dziedziny wprowadzamy dodatkową warstwę - stosujemy wzorzec Service Layer. 26