Patterns and Frameworks
Total Page:16
File Type:pdf, Size:1020Kb
Patterns und Frameworks für die Entwicklung paralleler und verteilter Anwendungen in Java Verfasser: Prof. Dr. Jens Ehlers, Technische Hochschule Lübeck Webseite: https://oncampus.pages.th-luebeck.de/patterns-and-frameworks GitLab: https://git.mylab.th-luebeck.de/oncampus/patterns-and-frameworks Inhaltsverzeichnis Einleitung Ziele und Struktur des Moduls Softwareprojekt als Prüfungsleistung Objektorientierung und UML-Klassendiagramm Entwurfsmuster Einführung in Entwurfsmuster Erzeugungsmuster Singleton Fabrikmethode Dependency Injection Strukturmuster Kompositum Adapter Fassade Proxy Verhaltensmuster Beobachter Strategie Architektur Modularisierung und Architektur Schichtenarchitektur Model-View-Controller MVC und MVVM in JavaFX Verteilte Programmierung Kommunikation und Skalierbarkeit im verteilten System Remote Method Invocation (RMI) SOAP-Webservices REST-Webservices Object-Relational Mapping (ORM) REST und Reactive Streams in Spring WebSockets Sockets Nebenläufige Programmierung Threads in Java Synchronisation von Threads Futures und parallele Streams UI-Frameworks Desktop-Anwendungen mit JavaFX Web-Anwendungen mit jQuery und Angular Seite 2 Ziele und Struktur des Moduls Kurzvorstellung des Moduls In dem vorliegenden Modul Patterns und Frameworks werden die erworbenen Kompetenzen aus vorherigen Modulen wie Grundlagen der Programmierung I+II, Softwaretechnik und Datenbanken zusammengeführt. Die Prüfungsleistung ist ein Softwareprojekt, dass die Studierenden i.d.R. in einem kleinen Team bearbeiten. Die Studierenden lernen bewährte Entwurfs- und Architekturmuster sowie aktuelle Frameworks aus dem Java-Umfeld kennen. Diese sollen im Projekt selbstständig eingesetzt werden. Im Mittelpunkt des Projekts stehen die Entwurfs- und die Implementierungsphase. Die Studierenden lernen während des Projekts verschiedene Ansätze zur Parallelverarbeitung und zur Kommunikation in verteilten Java-Anwendungen anzuwenden. Vorausgesetzte Kenntnisse und Fähigkeiten Objektorientiertes Programmieren in Java (bekannt aus Grundlagen der Programmierung I+II) Modellierung in UML (bekannt aus Softwaretechnik) Konfigurationsmanagement in Softwareprojekten, insb. Versionsverwaltung mit Git und Buildmanagement mit Maven (bekannt aus Softwaretechnik) Grundlagen relationaler Datenbanksysteme und SQL (bekannt aus Datenbanken) Lernergebnisse des Moduls Softwareprojekt in Java: Die Studierenden können ein Softwareprojekt mit vorgegebenen Anforderungen in der Programmiersprache Java selbstständig implementieren. Anwendung von Entwurfsmustern: Die Studierenden können die vorgestellten Entwurfsmuster in der Anwendungsentwicklung erkennen und selbst bewusst einsetzen. Auswahl von Architekturmustern und Frameworks: Die Studierenden können eine adäquate Softwarearchitektur unter Berücksichtigung der vorgestellten Architekturmuster und Frameworks entwerfen. Sie können die vorgestellten Frameworks in einem Projekt gezielt einsetzen. Verteilte Kommunikation: Die Studierenden können synchrone und asynchrone Kommunikation jeweils mittels verschiedener Ansätze (RMI, Webservices, Sockets, WebSockets) in einer verteilten Java-Anwendung umsetzen und diesbezüglich Vor- und Nachteile erörtern. Parallelverarbeitung: Die Studierenden können komplexe Verarbeitungsprozesse in Java aufteilen, effizient parallelisieren und synchronisieren. Sie können diesbezüglich Vor- und Nachteile unterschiedlicher Ansätze erörtern. Seite 3 Literatur Auf die folgenden Einträge des Literaturverzeichnisses wird an den entsprechenden Stellen im Modul über die hier definierten Kürzel verwiesen. [Bal11] Helmut Balzert: Lehrbuch der Softwaretechnik - Entwurf, Implementierung, Installation und Betrieb, Spektrum, 3. Aufl., 2011. [BC87] Kent Beck, Ward Cunningham: Using Pattern Languages for Object-Oriented Programs, in Conference on Object- Oriented Programming, Systems, Languages, and Applications (OOPSLA), 1987. [Ben05] Mordechai Ben-Ari: Principles of Concurrent and Distributed Programming, 2. Aufl., Addison-Wesley, 2005. [Blo17] Joshua Bloch: Effective Java, Addison-Wesley, 3. Aufl., 2017. [Fow02] Martin Fowler: Patterns of Enterprise Application Architecture, Addison-Wesley, 2002. [Fow04] Martin Fowler: Inversion of Control Containers and the Dependency Injection pattern, https://martinfowler.com/articles/injection.html, 2004. [FRS+15] Eric Freeman, Elisabeth Robson, Kathy Sierra, Bert Bates: Entwurfsmuster von Kopf bis Fuß, O'Reilly, 2. Aufl. 2015. [Gei15] Matthias Geirhos: Entwurfsmuster - Das umfassende Handbuch, Rheinwerk Computing, 2015. [GHJ+10] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Entwurfsmuster - Elemente wiederverwendbarer objektorientierter Software, Addison-Wesley, 6. Aufl., 2010. [GJM03] Carlo Ghezzi, Mehdi Jazayeri, Dino Mandrioli: Fundamentals of Software Engineering, Prentice Hall, 2nd ed., 2003. [Ind16] Michael Inden: Der Java-Profi - Persistenzlösungen und REST-Services, dpunkt, 2016. [Ind17] Michael Inden: Der Weg zum Java-Profi - Konzepte und Techniken für die professionelle Java-Entwicklung, dpunkt, 4. Aufl., 2017. [KB18] Veikko Krypczyk, Olena Bochkor: Handbuch für Software-Entwickler, Rheinwerk Computing, 2018. [Kle17] Martin Kleppmann: Designing Data-Intensive Applications - The Big Ideas Behind Reliable, Scalable, and Maintainable Systems, O'Reilly, 2017. [KSH17] Christoph Kecher, Alexander Salvanos, Ralf Hoffmann-Elbern: UML 2.5 - Das umfassende Handbuch, Rheinwerk Computing, 6. Aufl., 2017. [LRS18] Bernhard Lahres, Gregor Rayman, Stefan Strich: Objektorientierte Programmierung - Das umfassende Handbuch. Prinzipien guter Objektorientierung auf den Punkt erklärt, Rheinwerk Computing, 4. Aufl., 2018. [LW07] Kung-Kiu Lau, Zheng Wang: Software Component Models, IEEE Transactions on Software Engineering 33(10), 2007. [Mar09] Robert Martin: Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code, mitp, 2009. [Mar18] Robert Martin: Clean Architecture - Gute Softwarearchitekturen - Das Praxis-Handbuch für professionelles Softwaredesign - Regeln und Paradigmen für effiziente Softwarestrukturierung, mitp, 2018. [OS13] Bernd Oestereich, Axel Scheithauer: Analyse und Design mit der UML 2.5 - Objektorientierte Softwareentwicklung, De Gruyter Oldenbourg, 11. Aufl., 2013. [RQ12] Chris Rupp, Stefan Queins: UML 2 glasklar - Praxiswissen für die UML-Modellierung, Hanser, 4. Auflage, 2012. [SGM02] Clemens Szyperski, Dominik Gruntz, Stephan Murer: Component Software - Beyond Object-Oriented Programming, Addison Wesley, 2nd ed., 2002. [Spi19] Kai Spichale: API-Design: Praxishandbuch für Java- und Webservice-Entwickler, dpunkt, 2. Aufl., 2019. [SW01] Connie Smith, Lloyd Williams: Performance Solutions - A Practical Guide to Creating Responsive, Scalable Software, Addison-Wesley, 2001. [TvS16] Andrew Tanenbaum, Maarten van Steen: Distributed Systems - Principles and Paradigms, CreateSpace, 2nd ed., 2016. Seite 4 Softwareprojekt als Prüfungsleistung Anforderungen an das Softwareprojekt Im Fokus des Moduls steht das Kennenlernen und praktische Erproben von bewährten Entwurfsmustern und Frameworks, die auch in professionellen Sofwareprojekten (im Java-Umfeld) eingesetzt werden. Es soll als Prüfungsleistung daher eine Anwendung konstruiert werden, die mind. in Client- und Server-Komponente unterteilt ist. Das Projekt kann im Team von 2-4 Studierenden bearbeitet werden. Funktionale Anforderungen: Es soll ein einfaches Multiplayer-Spiel für mind. 2 Spieler realisiert werden. Als Projektidee wird die Implementierung eines bekannten Arcade-Klassikers vorgeschlagen, z.B. Tetris, Tank, Snake, Pac-Man, Dig Dug oder Blobby Volley. Es kann auch ein Brettspiel oder ein Quizspiel umgesetzt werden. Die Spielregeln des Spiels können gerne individuell angepasst werden. Bezüglich der angestrebten Funktionalität der Anwendung wird dementsprechend Freiraum für kreative Ideen gelassen, die mit dem jeweiligen Modulbetreuer abzustimmen sind. Tatsächlich ist Java keine besonders übliche Sprache für die Implementierung eines Spiels, aber gerade dadurch entsteht Raum für Kreativität im Entwurf. Es darf mit Freude über verschiedene Lösungsansätze diskutiert werden. Zusätzlich kann der Humor, der i.d.R. mit der Entwicklung eines Spiels verbunden ist, die Motivation steigern. Unabhängig von der gewählten Projektidee sollten folgende Anforderungen berücksichtigt werden: Ein Anwender soll sich registrieren, einloggen und ausloggen können. Für jeden Anwender wird eine Historie seiner gespielten Spiele erfasst und mittels einfacher Auswertungen dargestellt (gewonnene und verlorene Spiele, mittlere Punktzahl, usw.). Es sollen an mind. einer sinnvollen Stelle auch Bilder über die API angefragt und im Client dargestellt werden (z.B. die Profilbilder der Anwender). Server-Komponente (Programmiersprache Java): Die registrierten Anwender und ihre Spielhistorie soll zentral in einer relationalen Datenbank gespeichert werden. Es soll dazu ein Framework für das objekt-relationale Mapping eingesetzt werden. Es soll eine API für den Datenaustausch mit dem Client angeboten werden, über die Daten im JSON- oder XML-Format ausgetauscht werden. Die API soll JSON Web Tokens (JWT) zur Authentifizierung von Anwendern unterstützen. Client-Komponente: Der Client soll ein grafisches UI umfassen und die obigen funktionalen Anforderungen abbilden. Bei ≥ 3 Studierenden im Team sind 2 Clients in unterschiedlichen Frameworks zu erstellen, die sich eine serverseitige API teilen. Wenn nur ein Client implementiert wird (d.h. das Team besteht aus max. 2 Studierenden), ist für diesen Client per Default JavaFX zu nutzen