Mariusz Trzaska PJATK (public)
Publiczna strona poświęcona mojej działalności w PJATK

Książka MAS 2.0 (aktualności)

Mariusz Aktualności

Miło jest mi poinformować, że dostępna jest całkiem nowa wersja mojej książki Modelowanie i implementacja systemów informatycznych 2.0.

Książka może służyć jako rozszerzenie materiału z zakresu przedmiotu MAS.

Aktualnie jest dostępna jako eBook w formacie PDF. Pracuję również nad wersją ePUB, która powinna być wkrótce osiągalna.

Streszczenie Książka poświęcona jest problematyce wytwarzania oprogramowania z wykorzystaniem podejścia obiektowego i notacji UML. Szczególny nacisk położono na przełożenie teoretycznych pojęć obiektowości na praktyczne odpowiedniki implementacyjne. Na konkretnym, biznesowym przykładzie (biblioteka) opisano poszczególne fazy wytwarzania oprogramowania. Wyjaśnienia zilustrowano wieloma diagramami UML, m. in. klas, przypadków użycia, aktywności oraz stanów. Opisy poparto praktyczną implementacją wielu omawianych konstrukcji (ekstensja, asocjacje, ograniczenia, dziedziczenia), często w kilku wariantach. Jako ilustrację możliwości frameworku Spring dla język Java (Data REST, kontrolery Spring, MVC z Thymeleaf), stworzono fragmenty systemu nawiązującego do ww. wymagań użytkownika. Pokazano również jak w praktyce można zrealizować testy integracyjne oraz E2E.

Niniejsza publikacja to nowa wersja książki z roku 2008. Została gruntowanie przebudowana, m. in. zastosowano bardziej współczesne wymagania użytkownika, nową wersję jezyka Java, implementację webową z użyciem frameworku Spring oraz przykłady testów integracyjnych i E2E.

Wprowadzenie Długo się zastanawiałem, czy i w jakiej formie tworzyć nową wersję oryginalnego wydania tej książki z roku 2008. Od tego czasu minęło sporo lat, wiele rzeczy się zmieniło, włączając w to rynek książek i skłonność do ich czytania. Zachęcające były pytania potencjalnych czytelników o nową wersję i zgłaszane problemy z dostępnością tej oryginalnej. Rozważałem różne scenariusze, począwszy od napisania wszystkiego od nowa, poprzez modyfikacje istniejącej wersji, a kończąc na wariancie w którym w ogóle nic nie piszę.
Ostatecznie założyłem optymistycznie, że znajdą się jacyś zainteresowani i zaczynam prace. Uznałem, że większość zasadniczych pomysłów z oryginalnej książki wytrzymała próbę czasu i nie ma potrzeby ich wymyślać całkiem od nowa. Oczywiście trzeba było je zaktualizować - choćby o nowsze rozwiązanie programistyczne. W efekcie wyszło całkiem sporo zmian, które sprawiają, że rezultat moich prac jest bardziej zbliżony do nowej publikacji niż tylko kolejnego wydania.
Zmieniłem też tematykę wymagań użytkownika, wokół których jest budowana duża część niniejszej książki (analiza, projektowanie, implementacja). Oryginalnie była to wypożyczalnia wideo, o której niektórzy z potencjalnych czytelników może nigdy nie słyszeli. Zamiast tego mamy również wypożyczalnię, ale książek, czyli bibliotekę. Nie była to tylko prosta zamiana nazw, ponieważ w trakcie prac okazało się, że pewne koncepcje nie mają bezpośrednich odpowiedników.
Oprócz aktualizacji wszystkich diagramów, kodów programów, dodałem również całkiem nowe rozdziały/sekcje, których w ogóle nie było pierwotnie, m.in.:

  • implementacja różnych rodzajów aplikacji we frameworku Spring (Data REST, kontrolery Spring, MVC z Thymeleaf),
  • testy integracyjne we frameworku Spring,
  • testy E2E we frameworku Spring,
  • konserwacja oprogramowania.

Sporych aktualizacji doczekał się też rozdział o maperze obiektowo-relacyjnym Hibernate.

O skali zmian może też świadczyć fakt, iż niniejsza edycja książki ma ponad 200 stron więcej niż ta z roku 2008.

Znacząco zaktualizowana i rozbudowana została też bibliografia - teraz ma ponad 100 pozycji. Starałem się znaleźć nowe, interesujące publikacje dotyczące omawianych zagadnień. W niektórych przypadkach (szczególnie tych bardziej teoretycznych jak, np. modelowanie UML, czy dobre praktyki programistyczne) okazało się, że nadal popularne są wydania książek sprzed wielu lat. Z tego powodu niektóre z nich pozostawiłem. Być może są aż tak dobre i/lub w teorii zmiany następują zdecydowanie wolniej, a szybsze są w konkretnych technologiach.

Spis rozdziałów

  • 1 Wprowadzenie (aktualne) str. 9
  • 2 Analiza str. 13
    • 2.1 Wymagania klienta str. 15
    • 2.2 Wymagania dla biblioteki str. 16
    • 2.3 Przypadki użycia str. 18
      • 2.3.1 Ogólny diagram przypadków użycia dla Biblioteki str. 20
      • 2.3.2 Szczegółowy diagram przypadków użycia str. 24
    • 2.4 Diagram klas str. 27
      • 2.4.1 Obiekt str. 29
      • 2.4.2 Klasa str. 29
      • 2.4.3 Metody str. 35
      • 2.4.4 Asocjacje str. 37
      • 2.4.5 Dziedziczenie str. 49
      • 2.4.6 Ograniczenia str. 58
      • 2.4.7 Ograniczenie {subset} str. 59
      • 2.4.8 Ograniczenie {ordered} str. 59
      • 2.4.9 Ograniczenie {bag} oraz {history} str. 60
      • 2.4.10 Ograniczenie {xor} str. 61
      • 2.4.11 Diagram klas dla biblioteki str. 61
    • 2.5 Diagram aktywności str. 92
    • 2.6 Diagram stanów str. 95
  • 3 Projektowanie str. 99
    • 3.1 Uwagi o programowaniu str. 101
      • 3.1.1 Język w programowaniu str. 101
      • 3.1.2 Nazewnictwo str. 102
      • 3.1.3 Samodokumentujący się kod str. 103
      • 3.1.4 Struktura kodu str. 104
    • 3.2 Klasy str. 106
      • 3.2.1 Obiekt str. 106
      • 3.2.2 Klasa str. 106
      • 3.2.3 Ekstensja klasy str. 107
    • 3.3 Atrybuty str. 116
      • 3.3.1 Atrybuty proste str. 116
      • 3.3.2 Atrybuty złożone str. 117
      • 3.3.3 Atrybuty wymagane oraz opcjonalne str. 118
      • 3.3.4 Atrybuty pojedyncze str. 119
      • 3.3.5 Atrybuty powtarzalne str. 119
      • 3.3.6 Atrybuty obiektu str. 120
      • 3.3.7 Atrybuty klasowe str. 120
      • 3.3.8 Atrybuty pochodne (wyliczalne) str. 120
    • 3.4 Metody str. 121
      • 3.4.1 Metoda obiektu str. 121
      • 3.4.2 Metoda klasowa str. 122
      • 3.4.3 Przeciążenie metody str. 123
      • 3.4.4 Przesłonięcie metody str. 124
    • 3.5 Trwałość ekstensji str. 124
      • 3.5.1 Ręczna implementacja trwałości danych str. 125
      • 3.5.2 Implementacja trwałości danych w oparciu o serializację str. 132
      • 3.5.3 Inne sposoby uzyskiwania trwałości danych str. 136
    • 3.6 Klasa ObjectPlus str. 138
    • 3.7 Asocjacje str. 146
      • 3.7.1 Implementacja asocjacji za pomocą identyfikatorów str. 146
      • 3.7.2 Implementacja asocjacji za pomocą natywnych referencji str. 153
      • 3.7.3 Implementacja różnych rodzajów asocjacji str. 160
      • 3.7.4 Implementacja asocjacji skierowanej str. 160
      • 3.7.5 Implementacja asocjacji rekurencyjnej str. 161
      • 3.7.6 Implementacja asocjacji z atrybutem str. 163
      • 3.7.7 Implementacja asocjacji kwalifikowanej str. 164
      • 3.7.8 Implementacja asocjacji n-arnej str. 168
      • 3.7.9 Implementacja agregacji str. 169
      • 3.7.10 Implementacja kompozycji str. 170
    • 3.8 Klasa ObjectPlusPlus str. 178
    • 3.9 Dziedziczenie str. 192
    • 3.10 Dziedziczenie rozłączne str. 193
    • 3.11 Polimorficzne wołanie metod str. 193
    • 3.12 Dziedziczenie typu overlapping str. 198
      • 3.12.1 Obejście dziedziczenia overlapping za pomocą grupowania str. 198
      • 3.12.2 Obejście dziedziczenia overlapping za pomocą agregacji lub kompozycji str. 201
      • 3.12.3 Polimorfizm w dziedziczeniu overlapping str. 206
    • 3.13 Dziedziczenie kompletne oraz niekompletne str. 207
    • 3.14 Dziedziczenie wielokrotne (wielodziedziczenie) str. 208
    • 3.15 Dziedziczenie wieloaspektowe str. 214
    • 3.16 Dziedziczenie dynamiczne str. 216
    • 3.17 Dziedziczenie a ekstensja klasy str. 222
    • 3.18 Podsumowanie implementacji dziedziczenia str. 225
    • 3.19 Ograniczenia i inne konstrukcje str. 225
      • 3.19.1 Implementacja ograniczeń dotyczących atrybutów str. 226
      • 3.19.2 Implementacja ograniczenia {subset} str. 229
      • 3.19.3 Implementacja ograniczenia {ordered} str. 233
      • 3.19.4 Implementacja ograniczenia {bag} oraz {history} str. 233
      • 3.19.5 Implementacja ograniczenia {XOR} str. 234
      • 3.19.6 Implementacja innych ograniczeń str. 236
  • 4 Model relacyjny str. 239
    • 4.1 Mapowanie klas str. 241
    • 4.2 Mapowanie asocjacji str. 245
    • 4.3 Mapowanie dziedziczenia str. 251
    • 4.4 Relacyjne bazy danych w językach obiektowych str. 253
    • 4.5 Wykorzystanie JDBC str. 255
    • 4.6 Mapery obiektowo-relacyjne (Hibernate) str. 258
      • 4.6.1 Przygotowanie Hibernate str. 261
      • 4.6.2 Klasy i atrybuty w Hibernate str. 264
      • 4.6.3 Praca z Hibernate str. 276
      • 4.6.4 Asocjacje w Hibernate str. 283
      • 4.6.5 Dziedziczenie w Hibernate str. 289
      • 4.6.6 Podsumowanie mapera Hibernate str. 300
  • 5 Projekt dla biblioteki str. 301
    • 5.1 Projektowy diagram klas dla biblioteki str. 301
      • 5.1.1 Hierarchia dziedziczenia klas Klient, Osoba i Postać str. 302
      • 5.1.2 Hierarchia dziedziczenia klasy Publikacja str. 305
      • 5.1.3 Informacje o wypożyczeniach str. 306
      • 5.1.4 Postacie w publikacjach str. 308
      • 5.1.5 Raporty w bibliotece str. 309
      • 5.1.6 Kompletny projektowy diagram klas dla biblioteki str. 310
    • 5.2 Projekt działania systemu dla biblioteki str. 313
    • 5.3 Projekt interfejsu użytkownika str. 315
  • 6 Użyteczność graficznych interfejsów użytkownika str. 319
    • 6.1 Co to jest użyteczność? str. 320
    • 6.2 Kształtowanie użyteczności str. 321
    • 6.3 Testowanie użyteczności str. 322
    • 6.4 Użyteczność niestety kosztuje str. 323
    • 6.5 Zalecenia dotyczące Graficznego Interfejsu Użytkownika str. 325
      • 6.5.1 Wymagania dotyczące funkcjonalności str. 327
      • 6.5.2 Wymagania związane z wykorzystywaną platformą str. 327
      • 6.5.3 Wymagania dotyczące okien str. 328
      • 6.5.4 Wymagania dotyczące zarządzania oknami dialogowymi str. 328
      • 6.5.5 Wymagania dotyczące kontrolek str. 329
      • 6.5.6 Wymagania dotyczące list str. 330
      • 6.5.7 Wymagania dotyczące podpisów str. 331
      • 6.5.8 Wymagania dotyczące pracy z klawiaturą str. 332
    • 6.6 Jakość interfejsu graficznego str. 332
  • 7 Implementacja str. 335
    • 7.1 Wprowadzenie do implementacji str. 335
      • 7.1.1 Zintegrowane środowisko programistyczne (IDE) str. 336
      • 7.1.2 Wykorzystanie narzędzi CASE str. 337
      • 7.1.3 Użyteczne biblioteki pomocnicze str. 339
    • 7.2 Zarządzanie danymi str. 344
    • 7.3 Framework Spring str. 345
      • 7.3.1 Wykorzystanie Spring Data REST str. 348
      • 7.3.2 Użycie kontrolerów Spring str. 364
      • 7.3.3 Zastosowanie Spring MVC z Thymeleaf str. 389
      • 7.3.4 Prosty widok Thymeleaf str. 390
      • 7.3.5 Przykładowa aplikacja Thymeleaf str. 398
      • 7.3.6 Podsumowanie frameworku Spring str. 436
  • 8 Testowanie i pielęgnacja oprogramowania str. 437
    • 8.1 Testowanie oprogramowania str. 437
      • 8.1.1 Testy białej i czarnej skrzynki str. 439
      • 8.1.2 Testy jednostkowe str. 440
      • 8.1.3 Testy integracyjne str. 440
      • 8.1.4 Testy End-to-end (E2E) str. 449
      • 8.1.5 Inne rodzaje testów str. 455
      • 8.1.6 Debugger str. 456
    • 8.2 Pielęgnacja oprogramowania str. 457
  • 9 Uwagi końcowe str. 463
  • Bibliografia str. 465
  • Spis listingów str. 473
  • Spis rysunków str. 478