Artykuł jest pierwszym z serii tekstów mających
|
|
- Szczepan Sowiński
- 9 lat temu
- Przeglądów:
Transkrypt
1 Sławomir Sobótka Domain Driven Design krok po kroku Część I: Podstawowe Building Blocks DDD W niniejszym artykule zostaną przedstawione podstawowe Building Blocks DDD wraz z przykładami ich implementacji w Javie z wykorzystaniem Spring i JPA. Domain Driven Design jest zestawem technik i koncepcji służących do projektowania złożonych modeli biznesowych i ich dosłownej implementacji. Niektórzy tak jak Martin Fowler preferują stosowanie DDD również w prostszych przypadkach z uwagi na jego elegancję i implikacje techniczne w aspektach testowalności i rozszerzalności. Techniki DDD zyskały swą popularność w roku 2003, wraz z publikacją książki Erica Evansa. Mimo upływu lat koncepcja DDD jest wciąż żywo rozwijana i wzbogacana o nowe techniki do których sięgniemy w kolejnych odsłonach serii. Artykuł jest pierwszym z serii tekstów mających na celu szczegółowe przedstawienie kompletnego zestawu technik modelowania oraz nakreślenie kompletnej architektury aplikacji wspierającej DDD. Przed dalszą lekturą zachęcam do zapoznania się z artykułem stanowiącym wstęp do DDD Domain Driven Design Sposób na projektowanie złożonych modeli biznesowych link do tekstu znajduje się w ramce w sieci. Tekst ten zawiera opis kluczowych koncepcji DDD, których poznanie jest krytyczne dla zrozumienia intencji rozwiązań technicznych oraz podejść, które będą prezentowane w naszej serii krok po kroku. W kolejnych częściach będziemy poznawać techniki pokrywające większość kluczowych artefaktów i aktywności procesu wytwórczego, pozwalające na przeprowadzenie kompletnego projektu opartego o DDD: Część 2: Zaawansowane modelowanie DDD, konteksty i architektura zdarzeniowa; Część 3: Szczegóły implementacji aplikacji wykorzystującej DDD na platformie Java (dwa podejścia: Spring i EJB 3.1 oraz JPA); Część 4: Skalowalne systemu w kontekście DDD - architektura CqRS; Część 5: Kompleksowe testowanie aplikacji opartej o DDD; Część 6: Behavior Driven Development - Agile 2.0. PROJEKT REFERENCYJNY Wszystkich tych czytelników, którzy chcieliby zapoznać się z kolejnymi zagadnieniami serii, zapraszam do strony projektu DDD&CqRS Laven, której adres znajduje się w ramce w sieci. Znajdziecie tam kompletną implementację projektu, zawierającą przykłady rozwiązań zawarte w niniejszym tekście, jak i kolejnych częściach serii. Motto projektu brzmi: Więcej niż jedynie przykład, ale zdecydowanie nie jest to kolejny frameowork... zaczyn coś, z czego robi się dobry chleb. Laven to autorska koncepcja projektu, który zawiera rozwiązania niemal gotowe do stosowania w systemach produkcyjnych, jednak nie hermetyzuje ich w klasycznej formie frameworka. Z założenia wszelkie kastomizacje mogą być dokonywane na żywym kodzie, zamiast zmagania się z konfiguracją sztywnych struktur frameworka. Założenia projektu referencyjnego: Prezentacja wszystkich Building Blocks DDD w niestrywializowany sposób; Prezentacja technik DDD (np. Bounded Context); Prezentacja rzeczywistych technik implementacji, gotowych do wdrożenia w kodzie produkcyjnym; Prezentacja pragmatycznego podejścia do implementacji CqRS; Dostarczenie rzetelnie wykonanego, wzorcowego kodu źródłowego; Przyjęto nieinwazyjną filozofię - ograniczenie wpływu technologii na kształt projektu; Opracowany styl architektoniczny jest przenośny na inne frameworki i platformy; Przykłady podejścia do testowania jednostkowego i akceptacyjnego - z wykorzystaniem Behavior Driven Development (JBehave, Selenium, model Agentów); Projekt jest całkowicie darmowy zarówno kod, jak i dokumentacja. Tłem technicznym projektu jest Java. Wszystkie techniki zostały zilustrowane na dwóch stosach technologii. Pierwszym z nich jest Spring (w tym Spring MVC) i JPA. Drugi to Java EE 6 (w tym JSF 2, EJB 3.1, JPA). W tekstach artykułów będziemy posługiwać się pierwszym stosem. Warto podkreślić, że na poziomie koncepcyjnym będziemy niezależni od technologii. Duża część przykładów kodu jest niezależna od specyfiki platformy i powinna być zrozumiała dla każdego, kto posiada podstawową umiejętność czytania kodu w językach wywodzących się z C / /
2 DOMAIN DRIVEN DESIGN KROK PO KROKU OPIS DOMENY Przykłady zostały osadzone w ramach bardzo uproszczonego systemu klasy ERP. Wybraliśmy kilka stosunkowo dobrze (w rozumieniu: intuicyjnie) znanych domen ERP i zaimplementowaliśmy ich namiastki. Każdy z nas posiada pewną intuicję odnośnie klientów, zamówień, produktów itp., tak więc nie będziemy tracić czasu na ich szczegółowe wyjaśnianie. Bounded Context Techniką Bounded Context zajmiemy się szczegółowo w drugiej części naszej serii, natomiast na tym etapie zakładamy, że istnieją trzy moduły: Sprzedaż - obsługuje zamawianie produktów, obliczania rabatów, fakturowanie, analizę trendów sprzedaży. CRM - obsługuje zarządzanie relacjami z klientem. Klient w tym module jest modelowany jako inny artefakt (innego ograniczonego kontekstu) niż w module Sprzedaż. Magazyn obsługuje przechowywanie, pakowanie i wysyłkę zamówień. Zakładamy, że wiedza domenowa odnośnie wymagań dla każdego z modułów znajduje się w umyśle innego Eksperta Domenowego. Eksperci ci niekoniecznie rozumieją się nawzajem, mimo używania słów, które brzmią tak samo, mają na myśli inne pojęcia. Zastrzegamy, że przedstawiony model jest mocno uproszczony na potrzeby edukacyjne. Jeżeli są Państwo zainteresowani tematyką modelowania omawianych domen, to odsyłamy do zasobów modeli i archetypów analitycznych. MODYFIKACJA WARSTWOWEJ ARCHI- TEKTURY APLIKACJI Każdy z modułów naszego systemu będzie zaprojektowany wg tego samego stylu architektonicznego w rozumieniu architektury aplikacji. W najprostszym ujęciu architektury warstwowej wyróżniamy 3 warstwy: prezentacji, logiki i dostępu do danych. Na marginesie: pamiętajmy, że warstwy (Layers) służą do porządkowania kodu i nie są tym co Poziomy (Tiers) porządkujące infrastrukturę techniczną (klienty, serwery, bazy danych). Co prawda DDD abstrahuje od prezentacji i persystencji, jednak my zajmiemy się tymi zagadnieniami w kolejnych częściach serii z uwagi na wpływ, jaki wywierają na wydajność i skalowanie. Modyfikacja wprowadzona przez DDD polega na rozwarstwieniu warstwy logiki na dwie wyspecjalizowane warstwy: logikę aplikacji oraz logikę biznesową. Logika aplikacji Logika aplikacji jest cienką warstwą serwisów (rzadziej obiektów stanowych) odpowiadających między innymi za szczegóły techniczne takie jak bezpieczeństwo i transakcje. Najważniejszą odpowiedzialnością tej warstwy jest jednak modelowanie kroków Use Case lub User Story. Scenariusz kroku polega na orkiestracji obiektów domenowych z niższej warstwy. Serwisy aplikacyjne stanowią niejako API serwera, uruchamiane z klientów webowych, mobilnych lub publikowane jako WebServisy. Serwisy z tej warstwy są nazywane również Operation Script (w odróżnieniu od proceduralnego Transaction Script). Klasy z tej warstwy zwykle testujemy w podejściu end- -to-end, ponieważ mnogość możliwych scenariuszy przejścia praktycznie uniemożliwia wysokie pokrycie testami jednostkowymi stosunek włożonej pracy do poziomu redukcji ryzyka jest zwykle niekorzystny. Dodatkowym kosztem testów jednostkowych w tej warstwie jest konieczność zaślepiania (fake/stub/mock) dużej ilości zależności. Zagadnieniem testowania lub specyfikowania tej warstwy zajmiemy się w części 5 i 6. Logika domenowa Warstwa logiki domenowej modeluje zachowania i reguły obiektów biznesowych. DDD skupia większość technik i uwagi na modelowaniu tej właśnie warstwy. Odpowiedzialność warstwy logiki biznesowej skupia się jedynie wokół modelu biznesu i nie powinna zawierać technikaliów zależnych platformy, serwera lub frameworka. Z technicznego punktu widzenia czyni to ją przenośną oraz, co ważne testowalną poza ciężkim środowiskiem serwerowym. Natomiast z analitycznego punktu widzenia kod warstwy logiki domenowej może mieć dosłowne przełożenia na model analityczny czyli zachowujemy podstawowe założenie DDD: Ubiquitous Language. Klasy z tej warstwy testujemy jednostkowo. Jest to relatywnie tanie podejście z uwagi na mniejszą ilość zależności. Dążymy do wysokiego pokrycia testami kodu z tej warstwy z uwagi na to, że modeluje on złożone odpowiedzialności biznesowe. BUILDING BLOCKS DLA WARSTWY LO- GIKI DOMENOWEJ Naszą podróż po krainie DDD odbędziemy w stylu Bottom-Up, rozpoczynając od strony technicznej, tak aby w pierwszej kolejności poznać standardowe klocki służące do modelowania domeny. Na bazie tej wiedzy, w części drugiej przejdziemy do zagadnień strategicznego modelowania. Czytelników wywodzących się ze świata Java EE czeka na wstępie mały szok poznawczy, który może przerodzić się w Dysonans Kognitywny. Buildng Blocks służące do modelowania Domeny to nie tylko Encje do tego nie będą to encje anemiczne, czyli struktury danych. Building Blocks DDD są swego rodzaju językiem wzorców, które stanowią rusztowanie mentalne dla modelarza. Każdy ze standardowych klocków ma za zadanie uwypuklenie pewnej koncepcji, zgodnie z główną zasadą DDD: make explicit what is implicit. Czyli modelujmy jawnie i wprost złożone reguły i koncepcje biznesowe. / / 39
3 Przykład = public class Order extends BaseAggregateRoot { public enum OrderStatus { DRAFT, SUBMITTED, private Client client; Sample of Value Object private Money totalcost; Sample of encapsulation - this structure is = CascadeType.ALL, fetch = FetchType.EAGER) private List<OrderLine> items; private Timestamp private OrderStatus status; Sample of Policy usage (Strategy Design Pattern)<br> Policy is injected by Factory/Repo but can be also changed in business method // To be injected by private RebatePolicy rebatepolicy; Sample business method that: <ul> <li>hides internal state - OrderLine <li>can veto - if order is not in DRAFT status <li>not only modifies structure (list) but also performs logic - calculates total cost </ul> public void addproduct(product product, int quantity) { checkifdraft(); OrderLine line = find(product); if (line == null) { items.add(new OrderLine(product, quantity, rebatepolicy)); else { line.increasequantity(quantity, rebatepolicy); recalculate(); Sample business method. Fires Domain Event public void submit() { checkifdraft(); status = OrderStatus.SUBMITTED; submitdate = new Timestamp(System. currenttimemillis()); eventpublisher.publish(new OrderSubmittedEvent(getEntityId())); protected Order() { Meant to be used by factory<br> Notice that Policy is set via setter because Policy need to be initialised also in Repository Order(Client client, Money initialcost, OrderStatus initialstatus) { this.client = client; totalcost = initialcost; status = initialstatus; items = new ArrayList<OrderLine>(); public void archive() { status = OrderStatus.ARCHIVED; private void checkifdraft() { if (status!= OrderStatus.DRAFT) throw new OrderOperationException("Operation allowed only in DRAFT status", client.getentityid(), getentityid()); private void recalculate() { totalcost = Money.ZERO; for (OrderLine line : items) { line.recalculate(rebatepolicy); totalcost = totalcost.add(line. geteffectivecost()); 40 / /
4 DOMAIN DRIVEN DESIGN KROK PO KROKU private OrderLine find(product product) { for (OrderLine line : items) { if (product.equals(line.getproduct())) return line; return null; Sample encapsulation of unstable internal implementation - assumption: this impl may vary in time. So we use projection of the internal state of this Aggregate<br> <br> Projection hides internal structure using Value Objects. Projection is also public List<OrderedProduct> getorderedproducts() { List<OrderedProduct> result = new ArrayList<OrderedProduct>(items.size()); for (OrderLine line : items) { result.add(new OrderedProduct(line. getproduct().getentityid(), line. getproduct().getname(), line.getquantity(), line.geteffectivecost(), line. getregularcost())); return Collections. unmodifiablelist(result); Sample access to the internal state (immutable Value Object) - <b>remember to allow such access only if makes sense</b>, don't do that by default!<br> <br> Notice that there is no public Money gettotalcost() { return totalcost; Reguły i koncepcje, które w klasycznym podejściu znikają głęboko w tysiącach linii kodu gigantycznych serwisów projektowanych zgodnie z najlepszym anty-wzorcem, czyli Boską klasą. Agregaty Agregaty są główną jednostką modelowania w DDD. Technicznie jest to graf obiektów, natomiast koncepcyjnie spójna jednostka pracy/zmiany. Implementując agregaty, zwracamy uwagę na ich hermetyczność jeden z głównych wyznaczników kodu obiektowego. Najważniejszym zagadnieniem podczas projektowania Agregatu jest określenie jego granicy. Modelowanie zbyt dużych agregatów jest główną przyczyną niepowodzeń modeli opartych o DDD. Dodatkowo zbyt duże agregaty powodują implikacje wydajnościowe na poziomie Mapera Relacyjno-obiektowego oraz problemy związane z równoległym dostępem do danych. Strategiami określania granicy agregatu zajmiemy się w kolejnej części naszej serii. Zweryfikujemy wówczas nasz model, poddając pod dyskusję wielkość Agregatu Order (listing obok). Listing klasy Order ilustruje szereg opisanych poniżej technik DDD, które zostały zastosowane w celu literalnego oddania wiedzy Eksperta Domenowego, utrzymana Ubiquitous Language oraz przygotowania modelu na rozbudowę przy minimalnym impakcie na kod innych klas. Enkapsulacja Agregatu Warto zwrócić uwagę na fakt, iż Agregat nie pozwala na modyfikację wszystkich swych pól przez settery. Tego typu modyfikacje mogą mieć owszem sens, ale tylko w niewielu przypadkach. Stan Agregatu zmieniany jest za pomocą metod biznesowych oddających słownictwo Eksperta Domenowego. Niektóre metody biznesowe mogą nie być dozwolone w pewnym stanie Agregatu (np. Order.submit ()) - dlatego rzucają wyjątki (błędy) domenowe. Poza tym nie wszystkie gettery mają sens część pól jest szczegółem implementacyjnym. Zauważmy, że metoda naszego Aggregate: addproduct przyjmuje jako parametr encję Product i ukrywa istnienie lasy OrderLine, która jest szczegółem wewnętrznej implementacji. W tym konkretnym przykładzie zakładamy, że model Zamówienia jest niestabilny - oczekujemy zmian w najbliższej przyszłości. Załóżmy, że Ekspert domenowy nie jest pewien modelu pozycji na zamówieniu. Dlatego chcemy zmniejszyć obszar katastrofy wynikającej ze zmian Agregatu do niego samego. Dlatego nie ujawniamy poza Agregat Order modelu zawartego w klasie OrdelLine. Wprowadzamy ValueObject o nazwie OrderedProduct jako adapter, który niejako rzutuje wewnętrzny model Agregatu na świat zewnętrzny. Zauważmy, że metoda Order.getOrderedProducts dokonuje transformacji wewnętrznego (z założenia niestabilnego) modelu pozycji do zewnętrznego interfejsu OrderedProduct. Metoda zwraca niemodyfikowalną listę, ponieważ operacje na kolekcji będącej projekcją nie mają żadnego sensu. Inne odpowiedzialności Agregatów W kolejnych częściach naszej serii zapoznamy się z zaawansowanymi odpowiedzialnościami Agregatów takimi jak generowanie Zdarzeń Biznesowych. Pociągnie to za sobą konieczność wstrzykiwania zależności do wnętrza Agregatów. / / 41
5 Przykład Value public class Money implements Serializable { public static final Currency DEFAULT_ CURRENCY = Currency.getInstance("EUR"); public static final Money ZERO = new Money(BigDecimal.ZERO, DEFAULT_CURRENCY); private BigDecimal value; private String currencycode; public Money(double value, Currency currency) { this(new BigDecimal(value), currency. public boolean equals(object obj) { if (obj instanceof Money) { Money money = (Money) obj; return compatiblecurrency(money) && value.equals(money.value); return false; public Money multiplyby(double multiplier) { return multiplyby(new BigDecimal(multiplier)); public Money add(money money) { if (!compatiblecurrency(money)) { throw new IllegalArgumentException("Currency mismatch"); return new Money(value.add(money.value), determinecurrencycode(money)); public String getcurrencycode() { return currencycode; public boolean greaterthan(money other) { return value.compareto(other.value) > public String tostring() { return String.format("%0$.2f %s", value, getcurrency().getsymbol()); Agregat jako Maszyna Stanów Możemy rozszerzyć model Agregatu o wprowadzenie Wzorca Projektowego State Machine. Jest to silna technika służąca do modelowania problemów o następującej charakterystyce: obiekt może być w wielu stanach (w systemach biznesowych są zwykle związane z pewnymi statusami domeny); obiekt wykonuje operacje, których sposób wykonania zależy od aktualnego stanu; oczekujemy wprowadzenia w przyszłości nowych stanów - otwieramy nasz projekt na rozbudowę; nie spodziewamy się, wprowadzając wielu nowych operacji - ponieważ utrzymanie stanu może być kłopotliwe. Przykład uzasadnionego wprowadzenia Maszyny Stanów: w module Magazynowym mamy Agregat modelujący Paczkę. Paczka zawiera szereg metod biznesowych związanych z dodawaniem do niej zawartości, wysyłką i odbiorem. Zakładamy, że zakres odpowiedzialności tegoż Agregatu jest raczej stabilny i nie spodziewamy się wielu nowych metod. Paczka może istnieć w wielu stanach (zlecona, pakowana, wysłana, odebrana,...) i spodziewamy się, że zbiór możliwych stanów jest różny, w zależności od wdrożenia systemu u klientów. Value Objects Value Objects są zwykle niedocenianym elementem modelu domenowego. Warto z nich korzystać, ponieważ mimo prostoty wnoszą dużą wartość do modelu mianowicie zwiększają siłę wyrazu Ubiquotus Language, pomagając w enkapsulacji detali (listing obok). Listing klasy Money przedstawia przykłady Value Object, którego zadaniem jest opakowanie typów technicznych i nadanie im znaczenia (metod) biznesowego. Przykładowo bez stosowania VO technicznie możliwe jest pomnożenie 5zł przez 2zł, ale w wyniku otrzymamy bezsensowną wartość 10zł w kwadracie. Zwróćmy uwagę, że klasa Money pozwala dodać Money, ale mnożenie jest możliwe przez wartość bezwymiarową. Jak rozumieć zwiększenie kwoty pieniędzy w przypadku wartości ujemnych? Decyduje o tym Ekspert Domenowy, a model oddaje te reguły w swych metodach. VO dodatkowo dokonują walidacji wartości, które są przez nie opakowywane. Przykładowo wartość prawdopodobieństwa spoza zakresu <0, 1> nie ma sensu. VO z technicznego punktu widzenia są immutable. Dlatego mogą być bezpiecznie zwracane z wnętrza agregatów jako wartości do odczytu. Na listingu klasy Order mieliśmy do czynienia z przykładem wykorzystania VO OrderedProduct jako nośnika danych z wnętrza Agregatu. Z punktu widzenia implementacji VO są pomocne w redukcji code smell o nazwie primitive obsession. Smell ten polega na posługiwaniu się zbyt niskim poziomem abstrakcji (typami technicznymi), co prowadzi do pojawiania się 42 / /
6 DOMAIN DRIVEN DESIGN KROK PO KROKU długich list parametrów i tak zwanych Data clumps. Przykładowo dodanie do siebie dwóch kwot, w dwóch walutach po kursach obowiązujących w danym przedziale dat może wyglądać w następujący sposób: add(bigdecimal, String, Date, Date, BigDecimal, String, Date, Date). Fabryki Fabryki odgrywają w DDD rolę obiektów domenowych, ponieważ spoczywa na nich część logiki biznesowej. Ich zadaniem jest budowanie Agregatów na podstawie półproduktów. Fabryki dokonują również walidacji półproduktów, dzięki czemu zakładamy, że istniejące w pamięci Agregaty są w poprawnym stanie (listing poniżej). Przykład public class OrderFactory { private RebatePolicyFactory rebatepolicyfactory; private InjectorHelper injector; public Order crateorder(client client) throws OrderCreationException { checkifclientcanperformpurchase(client); Order order = new Order(client, Money. ZERO, OrderStatus.DRAFT); injector.injectdependencies(order); RebatePolicy rebatepolicy = rebatepolicyfactory.createrebatepolicy(); order.setrebatepolicy(rebatepolicy); addgratis(order, client); return order; private void checkifclientcanper formpurchase(client client) throws OrderCreationException { if (client.getentitystatus()!= EntityStatus.ACTIVE) throw new OrderCreationException("Can not perform purchase, because of the Client status: " + client.getentitystatus(), client. getentityid()); Listing klasy OrderFactory przedstawia przykładową Fabrykę, która tworzy zamówienie dla Klienta, sprawdzając uprzednio, czy klient ten może dokonywać zakupów. Fabryka bierze na siebie również odpowiedzialność wstrzykiwania zależności do Agregatu. W naszym przykładzie Agregat potrzebuje do pracy Polityki Rabatowania. Fabryka wylicza konkretny typ Polityki na podstawie reguł biznesowych biorących pod uwagę historię zamówień klienta. Dzięki takiemu podejście zmniejszamy co- upling Agregatu Order. Klasa Order posiada jedynie zależności do domenowych obiektów współpracujących i nie musi być zależna od obiektów technicznych. Zależności techniczne przechodzą na klasę Fabryki. W teorii couplingu mamy 3 poziomy zależności: create, contain, call. Fabryka bierze na siebie (odciążając Agregat) najbardziej szkodliwą zależność: create oraz w niektórych przypadkach contain. W rezultacie znacznie zwiększamy testability klasy Order. Zagadnienia zwiększania testowalności Agregatów przez wprowadzanie ich fabryk zostaną szerzej poruszone w jednej z kolejnych części poświęconej testowaniu automatycznemu, natomiast zagadnienia wstrzykiwania poruszmy w części poświęconej architekturze aplikacji. Repozytoria Repozytoria są abstrakcją persystencji dla Agregatów. Repozytorium odpowiada za pobranie i utrwalenie konkretnego Agregatu. Repozytoria, w odróżnieniu od DAO, nie są obarczone dziesiątkami metod wyszukujących, tworzonych na potrzeby ekranów. Repozytorium może zawierać metody wyszukujące (OrderRepository.findUncorfirmed), ale tworzone jedynie na potrzeby logiki biznesowej. Natomiast wyszukiwania na potrzeby ekranów należą do dedykowanych serwisów wyszukujących, którymi zajmiemy się w części poświęconej architekturze public interface OrderRepository { public Order save(order order); public Order load(long orderid); public List<Order>findUncorfirmed(Client client) Listing interfejsu OrderRepository ilustruje przykładowy kontrakt Repozytorium. Przykładową implementację z wykorzystaniem JPA oraz opartą o idiom Generic Repository i klasę Bazowego Agregatu przedstawimy w części poświęconej szczegółom implementacji na platformie Java EE. Warto dodać, że w systemach budowanych jako wartość dodana ponad istniejącymi systemami może dojść do sytuacji, w której Repozytorium danego Agregatu pobiera jego części z kilku DAO (kilka systemów, baz, web serwisów) i dokonuje ich złożenia w nowy koncept biznesowy. Serwisy Domenowe Paradygmat obiektowy nie jest adekwatny do każdego modelu. Zwykle część modelu domenowego to procedury mające na celu np. transformację jednych Agregatów w inne. Z tego powodu w DDD istnieje Building Block modelujący tego typu operacje są to Serwisy Domenowe. W odróżnieniu od Serwisów Aplikacyjnych (o których za chwilę) Serwisy Domenowe operują na poziomie logiki biznesowej. / / 43
7 Przykład Serwisu public class InvoicingService { private ProductRepository productrepository; public Invoice issuance(order order, TaxPolicy taxpolicy){ //TODO refactor to InvoiceFactory Invoice invoice = new Invoice(order. getclient()); for (OrderedProduct orderedproduct : order.getorderedproducts()){ Product product = productrepository. load(orderedproduct.getproductid()); Money net = orderedproduct. geteffectivecost(); Tax tax = taxpolicy.calculatetax(product. gettype(), net); Polityki Z technicznego puntu widzenia polityki są implementowane jako Strategy Design Pattern, wnosząc pierwiastek funkcyjności do języków obiektowych. Koncepcyjnie Polityki są domknięciem lub dostrojeniem modelu. Pozwalają na rozbudowę modelu bez modyfikacji corowych Agregatów. W dotychczasowych przykładach spotkaliśmy się z Polityką Rabatowania (RebatePolicy) używaną przez Agregat Order oraz Polityką Obliczania Podatku (TaxPolicy) używaną przez księgowego public interface TaxPolicy { calculates tax per product type based on net value public Tax calculatetax(producttype product- Type, Money net); Listing interfejsu TaxPolicy ilustruje kontrakt, jaki jest zawierany pomiędzy księgowym (InvoicingService) a implementacjami obliczania podatku dla różnych krajów. Z punktu widzenia modelarza Polityka jest kolejnym Building Blockiem, który wspiera mantrę make explicit what is implicit. Obliczanie podatku jest co prawda czynnością, ale tak istotną z puntu widzenia modelu, że znajduje w nim swoje miejsce jako first class citizen. InvoiceLine invoiceline = new InvoiceLine(product, orderedproduct. getquantity(), net, tax); invoice.additem(invoiceline); return invoice; Listing klasy InvoicingService jest modelem księgowego w domenie zamówień. Jego zadaniem jest wygenerowanie Faktury na podstawie Zamówienia, biorąc pod uwagę Politykę Podatkową. Zwróćmy uwagę na fakt, iż nasz księgowy nie jest obiektem persystentnym. Mimo tego traktujemy go jako obiekt domenowy. Księgowy enkapsuluje reguły związane z fakturowaniem; część z reguł jest specyficzna dla wdrożenia w danym kraju, dlatego została wyniesiona do Polityk Podatkowych. Warto zwrócić uwagę na decyzję projektową polegającą na stworzeniu komponentu Księgowego. Bardzo złym pomysłem byłoby obarczanie Agregatu Order metodą issueinvoice() i podobnymi, ponieważ z czasem zamówienie stałoby się Boską klasą. Księgowy operuje na projekcji z wnętrza Agregatu Order, czyli na VO OrderedProduct, dzięki czemu nie jest wrażliwy na zmiany w implementacji Agregatu. 44 / / Pozostałe Building Blocks W kolejnych częściach naszej serii omówimy zastosowanie zaawansowanych klocków DDD takich jak: Zdarzenia Domenowe, Sagi i Specyfikacje. MODELOWANIE SCENARIUSZY Po zapoznaniu się z Building Blocks warstwy logiki domenowej przejdziemy o jedno piętro wyżej, do warstwy logiki aplikacji. Jak już wspomniano we wstępie, warstwa ta modeluje kroki Use Case lub User Story. W niniejszym artykule przyjrzymy się implementacji Serwisu Aplikacyjnego w sposób poglądowy. Natomiast w kolejnych częściach serii skupimy się na implementacji (transakcje, bezpieczeństwo), testowaniu end-to-end (również BDD i JBehave) oraz podejdziemy nieco inaczej do implementacji tej warstwy (CommandHandlers i architektura CqRS). Listing klasy PurchaseApplicationService (obok) przedstawia typowy model kroków Use Case/User Story operujący na modelu domenowym: stworzenie zamówienia, dodanie produktu do zamówienia, zatwierdzenie zamówienia. Serwis Aplikacyjny: integruje wiele zależności (repozytoria, fabryki, serwisy pomocnicze); zapewnia transakcyjność i bezpieczeństwo (w tym wypadku poprzez adnotacje i AOP); integruje komponenty aplikacyjne (w tym wypadu pracujący w sesji, zalogowany użytkownik); orkiestruje obiekty domenowe. Przykładem orkiestracji wszystkich obiektów domenowych jest metoda approveorder(id), która kolejno: pobiera Agregat Zamówienia z Repozytorium;
8 DOMAIN DRIVEN DESIGN KROK PO KROKU Przykład Serwisu public class PurchaseApplicationService { private OrderRepository orderrepository; private OrderFactory orderfactory; private ProductRepository productrepository; private InvoiceRepository invoicerepository; private InvoicingService invoicingservice; private SystemUser systemuser; private ApplicationEventPublisher eventpublisher; Sample usage of factory and OrderCreationException public void createneworder() throws OrderCreationException { Client client = loadclient(systemuser. getuserid()); Order order = orderfactory. crateorder(client); orderrepository.persist(order); Sample call of the domain logic<br> Sample publishing Application (not Domain) Event public void addproducttoorder(long productid, Long orderid, int quantity) { Order order = orderrepository. load(orderid); Product product = productrepository. load(productid); // Domain logic order.addproduct(product, quantity); orderrepository.save(order); // if we want to Spy Clients:) eventpublisher.publish(new ProductAddedToOrderEvent(product. getentityid(), systemuser.getuserid(), quantity)); Sample of the separation of domain logic in aggregate and domain logic in domain orderid public void approveorder(long orderid) { Order order = orderrepository. load(orderid); Specification<Order> orderspecification = generatespecification(systemuser); if (!orderspecification. issatisfiedby(order)) throw new OrderOperationException("Order does not meet specification", order.getentityid()); // Domain logic order.submit(); // Domain service Invoice invoice = invoicingservice.issuance(order, generatetaxpolicy(systemuser)); invoicerepository.save(invoice); orderrepository.save(order); Assembling Spec contains Business Logic, therefore it may be moved to domain Building Block - systemuser private Specification<Order> generatespecific ation(systemuser systemuser) { Specification<Order> specification = new Co njunctionspecification<order>(// new DestinationSpecification(Locale. CHINA).not(),// do not send to China new ItemsCountSpecification(100),// max 100 items new DebtorSpecification()// not debts or max 1000 => debtors can // buy for max 1000.or(new TotalCostSpecification(new Money(1000.0)))); // vip can buy some nice stuff if (!isvip(systemuser)) { specification = specification.and(new RestrictedProductsSpecification()); return specification; / / 45
9 DDD Building Blocks Entity identyfikowalne obiekty zawierające odpowiedzialność biznesową; Aggregate hermetyczne grafy obiektów, z jedną encją będącą korzeniem agregatu, która stanowi API całości. Agregat jest główną jednostką logiki domenowej w DDD; Value Object wrapper dla typów prostych, nadający im znaczenie biznesowe oraz wygodny interfejs; Service specyficzne operacje, które nie pasują do żądnego agregatu; Policy model wariacji operacji biznesowych, Strategy Design Pattern; Specification model złożonych warunków biznesowych, wywodzi się z Composite Design pattern; Event model wydarzeń biznesowych, może służyć do przetwarzania równoległego lub komunikacji pomiędzy Bounded Context; Saga model złożonego procesu, który stan jest trwały oraz zależy od wielu zdarzeń; Factory tworzy nowe instancje złożonych Agregatów, dbając o ich poprawność. Zwiększa testowalność, biorąc niejako na siebie operatory new; Repository zarządza trwałością Agregatu/Encji. W sieci oficjalna strona DDD wstępny artykuł poświęcony DDD przykładowy projekt weryfikuje go przy pomocy Specyfikacji Domenowej; wykonuje za Zamówieniu operację biznesową submit(); zapisuje Agregat Zamówienia do Repozytorium; generuje Fakturę przy pomocy Księgowego, decydując o użytej przez niego Polityce Podatkowej na podstawie danych o Zalogowanym Użytkowniku; zapisuje Fakturę do Repozytorium. Uogólniając, mamy do czynienia ze stworzeniem/pobraniem aktorów biznesowych, wykonaniem przez nich (pomiędzy nimi) scenariusza, utrwaleniem stanu aktorów. PODSUMOWANIE Niniejszy artykuł miał na celu zapoznanie czytelników z podstawowymi Building Blocks DDD oraz podstawowymi koncepcjami stojącymi za technikami modelowania DDD. Doświadczeni czytelnicy zapewne zauważyli, iż wszystkie wymienione techniki należą do dobrych praktyk projektowania obiektowego (SOLID, GRASP, RDD). Przykładowy model został zaprojektowany w nieco defensywnym, hermetycznym stylu, tak aby przyszłe modyfikacje nie naruszały zbyt drastycznie całej struktury, a miały jedynie lokalny impakt. W kolejnych częściach wprowadzimy zaawansowane Building Blocks oraz zaawansowane techniki strategicznego modelowania, co skłoni nas do modyfikacji aktualnego kształtu modelu. Sławomir Sobótka slawomir.sobotka@bottega.com.pl Programujący architekt aplikacji specjalizujący się w technologiach Java i efektywnym wykorzystaniu zdobyczy inżynierii oprogramowania. Trener i doradca w firmie Bottega IT Solutions. Do jego zainteresowań należy szeroko pojęta inżynieria oprogramowania, modelowanie, wzorce, zwinne procesy wytwórcze. Hobbystycznie interesuje się psychologią i kognitywistyką. W wolnych chwilach działa w community jako: prezes Stowarzyszenia Software Engineering Professionals Polska ( publicysta w prasie branżowej i blogger ( 46 / /
Pod dwóch wprowadzających w koncepcję DDD częściach,
INŻYNIERIA OPROGRAMOWANIA Sławomir Sobótka Domain Driven Design krok po kroku Część III: Szczegóły implementacji aplikacji wykorzystującej DDD na platformie Java Spring Framework i Hibernate Artykuł ma
Program szkolenia: Wprowadzenie do Domain Driven Design dla biznesu (część 0)
Program szkolenia: Wprowadzenie do Domain Driven Design dla biznesu (część 0) Informacje: Nazwa: Wprowadzenie do Domain Driven Design dla biznesu (część 0) Kod: Kategoria: Grupa docelowa: Czas trwania:
Spring Framework - wprowadzenie i zagadnienia zaawansowane
Program szkolenia: Spring Framework - wprowadzenie i zagadnienia zaawansowane Informacje ogólne Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Spring Framework - wprowadzenie i zagadnienia
Całościowe podejście do testowania automatycznego dla programistów. (TDD, BDD, Spec. by Example, wzorce, narzędzia)
Program szkolenia: Całościowe podejście do testowania automatycznego dla programistów Ruby (TDD, BDD, Spec. by Example, wzorce, narzędzia) Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania:
Testowanie aplikacji mobilnych na platformie Android - architektura, wzorce, praktyki i narzędzia
Program szkolenia: Testowanie aplikacji mobilnych na platformie Android - architektura, wzorce, Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Testowanie aplikacji mobilnych na
Receptury - niezbędnik projektanta i architekta
Program szkolenia: Receptury - niezbędnik projektanta i architekta Informacje ogólne Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Receptury - niezbędnik projektanta i architekta Craft-Receptury
Java Persistence API - zagadnienia zaawansowane
Program szkolenia: Java Persistence API - zagadnienia zaawansowane Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Java Persistence API - zagadnienia zaawansowane Java-EE-jpa-pro
Program szkolenia: Wzorce projektowe i ich implementacja w C# oraz testowanie automatyczne
Program szkolenia: Wzorce projektowe i ich implementacja w C# oraz testowanie automatyczne Informacje ogólne Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Wzorce projektowe i ich implementacja
Zwinna współpraca programistów i testerów z wykorzystaniem BDD i. by Example (JBehave/Spock/SpecFlow)
Program szkolenia: Zwinna współpraca programistów i testerów z wykorzystaniem BDD i Spec Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Zwinna współpraca programistów i testerów
Szkolenie wycofane z oferty. Program szkolenia: Enterprise Java Beans 3.0/3.1
Szkolenie wycofane z oferty Program szkolenia: Enterprise Java Beans 3.0/3.1 Informacje: Nazwa: Enterprise Java Beans 3.0/3.1 Kod: Java-EE-EJB Kategoria: Java EE Grupa docelowa: developerzy Czas trwania:
Program szkolenia: Architektura aplikacji i systemów - Wzorce architektoniczne dla projektantów
Program szkolenia: Architektura aplikacji i systemów - Wzorce architektoniczne dla Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Architektura aplikacji i systemów - Wzorce architektoniczne
Całościowe podejście do testowania automatycznego dla programistów. /C#/PHP (TDD, BDD, Spec. by Example, wzorce, narzędzia)
Program szkolenia: Całościowe podejście do testowania automatycznego dla programistów Java /C#/PHP (TDD, BDD, Spec. by Example, wzorce, narzędzia) Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas
Implementacja Domain Driven Design - wzorce architektoniczne (część
Program szkolenia: Implementacja Domain Driven Design - wzorce architektoniczne (część 2) Informacje ogólne Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Implementacja Domain Driven Design
Domain Driven Design - projektowanie modeli złożonych domen (część
Program szkolenia: Domain Driven Design - projektowanie modeli złożonych domen (część 1) Informacje ogólne Nazwa: Kod: Kategoria: Grupa docelowa: Domain Driven Design - projektowanie modeli złożonych domen
Domain Driven Design - projektowanie modeli złożonych domen (część
Program szkolenia: Domain Driven Design - projektowanie modeli złożonych domen (część 1) Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Domain Driven Design - projektowanie modeli
Program szkolenia: Receptury testowania automatycznego - problemy, strategie, taktyki, techniki, narzędzia
Program szkolenia: Receptury testowania automatycznego - problemy, strategie, taktyki, techniki, narzędzia Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Receptury testowania automatycznego
Projektowanie Zorientowane na Dziedzinę. ang. Domain Driven Design
Projektowanie Zorientowane na Dziedzinę ang. Domain Driven Design 2 Projektowanie Stan posiadania Przypadki użycia Model dziedziny Operacje systemowe Kontrakty dla operacji systemowych Problemy do rozwiązania
Wzorce projektowe i architektura dla platformy Java EE
Program szkolenia: Wzorce projektowe i architektura dla platformy Java EE Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Wzorce projektowe i architektura dla platformy Java EE
Wzorce logiki dziedziny
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),
Programowanie obiektowe
Programowanie obiektowe Laboratorium 11 - przegląd wybranych wzorców mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 24 maja 2017 1 / 38 mgr inż. Krzysztof Szwarc Programowanie obiektowe Wzorce
Domain Driven Design krok po kroku
Sławomir Sobótka Domain Driven Design krok po kroku Część IVa: Skalowalne systemy w kontekście DDD - architektura Command-query Responsibility Segregation (stos Write) Czy możliwe jest stworzenie systemu,
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017 1 Wzorce podstawowe 1.1 Interface vs Abstract class class InterfaceAbstractClass
Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie http://docs.oracle.com/javaee/6/tutorial/doc/
Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie http://docs.oracle.com/javaee/6/tutorial/doc/ Aplikacja internetowa tworzona na podstawie bazy danych. Programowanie komponentowe 2, Zofia
Szkolenie wycofane z oferty
Szkolenie wycofane z oferty Program szkolenia: Java Server Faces 2 Informacje: Nazwa: Java Server Faces 2 Kod: Java-EE-JSF 2 Kategoria: Java EE Grupa docelowa: developerzy Czas trwania: 3 dni Forma: 50%
Wprowadzenie do Domain Driven Design w Javie
Wprowadzenie do Sposób na projektowanie złożonych modeli biznesowych Czy zastanawiałeś się co jest przyczyną rozkładu średnich i dużych systemów? Czy jest on nieunikniony i jest jedynie kwestią czasu?
Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)
MAS dr. Inż. Mariusz Trzaska Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1) Zagadnienia o Podstawy o Kontrolowanie sterowania o Klasy o Interfejsy o Obsługa błędów o Pojemniki o System
Wprowadzenie do Behaviordriven
Wprowadzenie do Behaviordriven development Jakub Kosiński Email: ja@ghandal.net Czym jest BDD? praktyka, powstała na podstawie TDD, wykorzystywana w zwinnych metodykach stworzona przez Dana Northa w 2003
Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i
Program szkolenia: Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Produktywne tworzenie aplikacji webowych z
Domain Driven Design krok po kroku
INŻYNIERIA OPROGRAMOWANIA Sławomir Sobótka Domain Driven Design krok po kroku Część II: Zaawansowane modelowanie DDD techniki strategiczne: konteksty i architektura zdarzeniowa Modele nietrywialnych domen
Domain Driven Design. Sposób na projektowanie złożonych modeli biznesowych
inżynieria oprogramowania Domain Driven Design Sposób na projektowanie złożonych modeli biznesowych Czy zastanawiałeś się co jest przyczyną rozkładu średnich i dużych systemów? Czy jest on nieunikniony
Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2016
Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2016 Repository dodatkowa warstwa abstrakcji na obiektową warstwę dostępu do danych.
Program szkolenia: Wzorce projektowe w C++
Program szkolenia: Wzorce projektowe w C++ Informacje: Nazwa: Wzorce projektowe w C++ Kod: CCPP-craft-C++ Patterns Kategoria: Craftsmanship dla programistów C i C ++ Grupa docelowa: developerzy Czas trwania:
Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.
Warstwa integracji wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe. 1. Ukrycie logiki dostępu do danych w osobnej warstwie 2. Oddzielenie mechanizmów trwałości od modelu obiektowego Pięciowarstwowy
Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie http://docs.oracle.com/javaee/6/tutorial/doc/
Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie http://docs.oracle.com/javaee/6/tutorial/doc/ Aplikacja internetowa tworzona na podstawie bazy danych. Programowanie komponentowe 2, Zofia
Optimizing Programs with Intended Semantics
Interaktywna optymalizacja programów 26 kwietnia 2010 Spis treści Spis treści Wstęp Omówienie zaproponowanego algorytmu na przykładzie Wewnętrzna reprezentacja reguł dotyczących optymalizacji Wybrane szczegóły
BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska
BEAN VALIDATION Waldemar Korłub Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska Bean Validation Uniwersalny mechanizm walidacji danych we wszystkich warstwach aplikacji Warstwa interfejsu,
Programowanie obiektowe
Programowanie obiektowe Wykład 2: Wstęp do języka Java 3/4/2013 S.Deniziak: Programowanie obiektowe - Java 1 Cechy języka Java Wszystko jest obiektem Nie ma zmiennych globalnych Nie ma funkcji globalnych
Techniki efektywnego testowania kodu dla programistów Java (Spock
Program szkolenia: Techniki efektywnego testowania kodu dla programistów Java (Spock/JUnit) Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Techniki efektywnego testowania kodu
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ół
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
Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz
Budowa prostej aplikacji wielowarstwowej Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz Konfigurowanie edytora programu za pomocą Tools/Options/Editor Konfigurowanie edytora programu za pomocą
Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton
Dzisiejszy wykład Wzorce projektowe Visitor Client-Server Factory Singleton 1 Wzorzec projektowy Wzorzec nazwana generalizacja opisująca elementy i relacje rozwiązania powszechnie występującego problemu
1 Wprowadzenie do J2EE
Wprowadzenie do J2EE 1 Plan prezentacji 2 Wprowadzenie do Java 2 Enterprise Edition Aplikacje J2EE Serwer aplikacji J2EE Główne cele V Szkoły PLOUG - nowe podejścia do konstrukcji aplikacji J2EE Java 2
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
Receptury projektowe niezbędnik początkującego architekta
Receptury projektowe niezbędnik początkującego architekta Część III: Zarządzenie złożonością przez trójpodział logiki Open/closed principle w praktyce W modelu złożonego problemu zwykle możemy wydzielić
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015
Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015 1 Wzorce podstawowe 1.1 Interface vs Abstract class class InterfaceAbstractClass
Projektowanie architektury systemu rozproszonego. Jarosław Kuchta Projektowanie Aplikacji Internetowych
Projektowanie architektury systemu rozproszonego Jarosław Kuchta Zagadnienia Typy architektury systemu Rozproszone przetwarzanie obiektowe Problemy globalizacji Problemy ochrony Projektowanie architektury
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.
Projektowanie, tworzenie aplikacji mobilnych na platformie Android
Program szkolenia: Projektowanie, tworzenie aplikacji mobilnych na platformie Android Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Projektowanie, tworzenie aplikacji mobilnych
Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2017
Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2017 Repository dodatkowa warstwa abstrakcji na obiektową warstwę dostępu do danych.
Programowanie obiektowe
Programowanie obiektowe Wykład 5 Marcin Młotkowski 23 marca 2017 Plan wykładu 1 2 3 4 5 Marcin Młotkowski Programowanie obiektowe 2 / 50 Historia Początkowe założenia Projekt OAK Sterowanie urządzeniami
Program szkolenia: Wzorce projektowe i architektoniczne oraz efektywne techniki Object Oriented Design dla projektantów systemów
Program szkolenia: Wzorce projektowe i architektoniczne oraz efektywne techniki Object Oriented Design dla projektantów systemów Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma:
Behavior Driven Development (BDD)
Wydział Informatyki i Zarządzania Wrocław, 12 marca 2010 Agenda Wprowadzenie 1 Wprowadzenie 2 3 4 BDD w Javie 5 6 Cele prezentacji Wprowadzenie Cele prezentacji Prawda o projektach przedstawienie podejścia
Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7
Instrukcja 7 Laboratoria 9, 10 Opracowanie diagramów sekwencji dla wybranych przypadków użycia reprezentujących usługi oprogramowania wynikających również z wykonanych diagramów czynności; definicja operacji
Aplikacje RMI https://docs.oracle.com/javase/tutorial/rmi/overview.html
Aplikacje RMI https://docs.oracle.com/javase/tutorial/rmi/overview.html Dr inż. Zofia Kruczkiewicz wykład 4 Programowanie aplikacji internetowych, wykład 4 1 1. Zadania aplikacji rozproszonych obiektów
Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca 2009. Norbert Potocki db4o
Wprowadzenie - podstawy - technikalia Przydatne wiadomości Wprowadzenie 1 czerwca 2009 Wprowadzenie - podstawy - technikalia Przydatne wiadomości Wprowadzenie = bjects = database for objects w pełni obiektowa
Programowanie komponentowe 5
Budowa warstwy klienta w architekturze typu klient-serwer zbudowanych z komponentów typu EE - klient desktopowy i internetowy. Zastosowanie komponentów opartych na technologii EJB 3.2. na podstawie https://docs.oracle.com/javaee/7/jeett.pdf
Rysunkowy tutorial Możesz swobodnie dystrybuować ten plik jeśli pozostawisz go w nietkniętym stanie. Możesz także cytować jego fragmenty umieszczając w tekście odnośnik http://mbartyzel.blogspot.com Jak
Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016
Wykład 9 28 kwiecień 2016 Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa
Domain Driven Design krok po kroku
Domain Driven Design krok po kroku Część VI: Modeling Whirlpool iteracyjny proces modelowania Modeling Whirlpool jest oficjalną metodyką DDD służącą iteracyjnemu odkrywaniu modelu domenowego.
Projektowanie obiektowe Wzorce projektowe
Projektowanie obiektowe Wzorce projektowe Gang of Four Kreacyjne wzorce projektowe (wzorce konstrukcyjne) 1 Roadmap Memento Factory Method Abstract Factory Prototype Builder 2 Wzorce konstrukcyjne wzorce
Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin
Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin Czym jest Spring Boot? Spring Boot jest szkieletem aplikacji, opiera się o Spring Framework czyli Framework szeroko
Szczegółowy harmonogram rzeczowy realizacji prac systemu B2B
Szczegółowy harmonogram rzeczowy realizacji prac systemu B2B NAZWA ZADANIA ZADANIE CZĄSTKOWE TECHNOLOGIA ILOŚĆ OSÓB ILOŚĆ GODZIN TERMIN REALIZACJI 1 2 4 5 6 7 Zadanie 1 - wersji alfa 1 systemu B2B 3 723
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
Program szkolenia: Architektura aplikacji i systemów - Wzorce architektoniczne dla projektantów
Program szkolenia: Architektura aplikacji i systemów - Wzorce architektoniczne dla projektantów Informacje ogólne Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Architektura aplikacji i systemów
Wywoływanie metod zdalnych
Wywoływanie metod zdalnych model systemu Wywoływanie metod zdalnych aplikacja kliencka interfejs obiekt serwer Podejście obiektowe do budowy systemów rozproszonych proxy szkielet sieć Istota podejścia
Projektowanie obiektowe oprogramowania Testowanie oprogramowania Wykład 13 Wiktor Zychla 2014
Projektowanie obiektowe oprogramowania Testowanie oprogramowania Wykład 13 Wiktor Zychla 2014 1 Wprowadzenie State-of-the-art współczesnego warsztatu narzędzi testujących obejmuje nie tylko metodologie
Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas
Analiza i projektowanie obiektowe 2016/2017 Wykład 10: Tworzenie projektowego diagramu klas Jacek Marciniak Wydział Matematyki i Informatyki Uniwersytet im. Adama Mickiewicza 1 Plan wykładu 1. Projektowy
Wywoływanie metod zdalnych
Wywoływanie metod zdalnych Podejście obiektowe do budowy systemów rozproszonych Wywoływanie metod zdalnych model systemu obiekt aplikacja kliencka interfejs serwer proxy szkielet sieć Istota podejścia
Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak
Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego
Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania
Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania Opis biznesowy świata rzeczywistego Wymagania funkcjonalne i niefunkcjonalne aplikacji Diagram przypadków życia Diagramy klas i sekwencji:
Abstract Factory (fabryka abstrakcyjna)
1/9 Abstract Factory (fabryka abstrakcyjna) Cel: Zapewnienie interfejsu do tworzenia rodzin powiązanych obiektów bez specyfikacji konkretnej klasy. Przykład: Aplikacja do ustawiania mebli: osobne rodziny
Projektowanie Aplikacji Internetowych. Wzorce projektowe warstwy usług
Wzorce projektowe warstwy usług Wzorce projektowe warstwy usług Service Locator Ułatwia wyszukanie komponentów usługowych Service Activator Umożliwia asynchroniczne przesyłanie żądań do komponentów biznesowych
Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.
Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r. Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to
Plik pobrano z Tytuł: Wzorce projektowe, cz. 2 Strategy Ostatnia aktualizacja:
Wzorce projektowe, cz. 2 Strategy Druga część z serii wpisów o wzorcach projektowych. Dziś omówię wzorzec Strategii (Strategy). Wstęp Strategia jest wzorcem projektowym, który definiuje rodzinę wymiennych
Java: interfejsy i klasy wewnętrzne
Java: interfejsy i klasy wewnętrzne Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 INTERFEJSY Interfejs to opis co klasa implementująca dany interfejs powinna robić, ale bez określania
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
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
Programowanie w języku Java WYKŁAD
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
Maciej Oleksy Zenon Matuszyk
Maciej Oleksy Zenon Matuszyk Jest to proces związany z wytwarzaniem oprogramowania. Jest on jednym z procesów kontroli jakości oprogramowania. Weryfikacja oprogramowania - testowanie zgodności systemu
Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016
Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016 1 Wzorce strukturalne 1.1 Facade Motto: uproszczony interfejs dla podsystemu z wieloma interfejsami class SmtpFacade
Projektowanie Aplikacji Internetowych Jarosław Kuchta. Wzorce projektowe warstwy biznesowej
Jarosław Kuchta Wzorce projektowe warstwy biznesowej Wzorce projektowe dotyczące danych, obiektów i logiki biznesowej Transfer Object Assembler Łączy dane pochodzące z różnych komponentów biznesowych Composite
Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016
Wykład 1 3 marca 2016 Słowa kluczowe języka Java abstract, break, case, catch, class, const, continue, default, do, else, enum, extends, final, finally, for, goto, if, implements, import, instanceof, interface,
Projektowanie obiektowe Wzorce projektowe. Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów)
Projektowanie obiektowe Wzorce projektowe Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów) 1 Roadmap Adapter Bridge Composite Facade 2 Pojęcia obiekt interfejs typ klasa 3 Co to jest delegacja?
Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java
Aplikacje Internetowe Podstawy języka Java Najprostsza aplikacja class Hello { public static void main(string[] args) { System.out.println("Hello World!"); Komponenty Javy JRE Java Runtime Environment
Modelowanie diagramów klas w języku UML. Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014
Modelowanie diagramów klas w języku UML Łukasz Gorzel 244631@stud.umk.pl 7 marca 2014 Czym jest UML - Unified Modeling Language - Rodzina języków modelowania graficznego - Powstanie na przełomie lat 80
Diagramy czynności Na podstawie UML 2.0 Tutorial
Diagramy czynności Na podstawie UML 2.0 Tutorial http://sparxsystems.com.au/resources/uml2_tutorial/ Zofia Kruczkiewicz 1 Diagramy czynności 1. Diagramy czyności UML http://sparxsystems.com.au/resources/uml2_tutorial/
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
Programowanie obiektowe Podstawowe cechy i możliwości języka Scala mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 2017 1 / 32 mgr inż. Krzysztof Szwarc Programowanie obiektowe Informacje
Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017
Wykład 13 14 czerwiec 2017 Java vs cpp - podobieństwa Podobny sposób definiowania klas. Występowanie typów podstawowych: boolean, char, byte, short, int, long, float, double. Podobna zasada definiowania
Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6
Instrukcja 6 Laboratorium 8 Opracowanie diagramów sekwencji dla wybranych przypadków użycia reprezentujących usługi oprogramowania wynikających również z wykonanych diagramów czynności; definicja operacji
Projektowanie oprogramowania. Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz
Projektowanie oprogramowania Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz 1 Wykonanie czterowarstwowej aplikacji EE z dostępem do bazy danych,
EJB 2.x oraz zmiany w standardzie dla EJB 3.0. Michał Stanek
Enterprise JavaBean EJB 2.x oraz zmiany w standardzie dla EJB 3.0 Michał Stanek Plan prezentacji Czym jest EJB Architektura aplikacji J2EE oraz kontener EJB Typy komponentów JavaBean EJB 1.0, EJB 2.x Wady
EJB 3.0 (Enterprise JavaBeans 3.0)
EJB 3.0 (Enterprise JavaBeans 3.0) Adrian Dudek Wirtualne Przedsiębiorstwo 2 Wrocław, 1 czerwca 2010 Plan prezentacji 1 Wprowadzenie Cel prezentacji Czym jest EJB 3.0? Historia 2 3 Cel prezentacji Wprowadzenie
Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych
PAŃSTWOWA WYŻSZA SZKOŁA ZAWODOWA W ELBLĄGU INSTYTUT INFORMATYKI STOSOWANEJ Sprawozdanie z Seminarium Dyplomowego Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych
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,
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
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej. Wstęp. Programowanie w Javie 2. mgr inż.
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Wstęp Programowanie w Javie 2 mgr inż. Michał Misiak Agenda Założenia do wykładu Zasady zaliczeń Ramowy program wykładu