Software Engineering. 8. Prinzipien objektorientierten Designs. Franz-Josef Elmer, Universität Basel, HS 2010
|
|
- Jakob Kohler
- vor 8 Jahren
- Abrufe
Transkript
1 Software Engineering 8. Prinzipien objektorientierten Designs Franz-Josef Elmer, Universität Basel, HS 2010
2 Software Engineering: 8. Prinzipien objektorientierten Designs 2 Warum Prinzipien? Geben Hinweise, wie man das Design anpacken soll. Helfen typische Fehler zu vermeiden. Aus Prinzipien wurden Handlungsrichtlinien abgeleitet. Vorgaben für Qualitätsbeurteilung. Aus Prinzipien wurden Metriken abgeleitet, um die Qualität messbar zu machen. Prinzipien sind Erfahrungswissen. Abstrahiert aus langjährigen Erfahrungen. Von anderen übernommen, bestätigt und weiterverbreitet. Aber: Nur wenige empirische Untersuchungen über Wirksamkeit und Relevanz von Designprinzipien.
3 Software Engineering: 8. Prinzipien objektorientierten Designs 3 Ziele des Designs Design ist unsichtbar. Software, die alle funktionalen Anforderungen genügt, kann trotzdem schlecht entworfen sein. Design ist gut wenn es die Komplexität der Software in handhabbare und einfache Probleme herunterbricht die Entwicklung zügig verläuft die Software wartbar ist die Software leicht geändert und erweitert werden kann die Software stabil ist Bugs schnell behebbar sind die Software in anderen Softwareprojekten wiederverwendbar ist der Code verständlich ist
4 Software Engineering: 8. Prinzipien objektorientierten Designs 4 Symptome verfaultem (eng. rotten) Designs Never-touch-running-code Syndrom: Entwickler haben Angst undurchschaubaren Code zu ändern. Es wird Code darum herum entwickelt (workaround). So entsteht toter Code, d.h. Code der (wahrscheinlich) nie ausgeführt wird. Änderungen haben unbekannte und unerkannte Seiteneffekte: Z.B. Bugfixing produziert weitere Bugs, die erst viel später (sprich: beim Kunden!) gefunden werden. Eine kleine Änderung in den Anforderungen führt zu grossen Änderungen im Code: Z.B. sollen alle Datumsanzeigen von zweistellige auf vierstellige Jahreszahlen umgestellt werden (Y2K Problem). Copy-Paste Sünde: Wiederverwendung durch Codeduplikation (mit oder ohne kleine Änderungen). Entwickler jagen den Stellen hinterher die geändert werden müssen, falls sich die Logik geändert hat.
5 Software Engineering: 8. Prinzipien objektorientierten Designs 5 Allgemeine Designprinzipien KISS: Keep It Simple, Stupid DRY: Don't Repeat Yourself Separation of Concerns Design by Contract Geheimnisprinzip (Information Hiding)
6 Software Engineering: 8. Prinzipien objektorientierten Designs 6 KISS (Keep It Simple, Stupid) Prinzip Immer nach der einfachsten und klarsten Lösung suchen. Keine Optimierung der Performanz auf Kosten der Verständlichkeit und Modularität. Erhöht die Verständlichkeit des Codes. Vermeidet never-touchrunning-code Syndrom. Aber: KISS quick and dirty Verwandt mit dem YAGNI Prinzip (You Aren't Gonna Need It) aus extreme Programming, d.h. nur soviel Funktionalität wie nötig entwerfen und implementieren. So einfach wie möglich, aber nicht einfacher! Nicht in eine Richtung verallgemeinern, die später nie gebraucht wird. Beispiel: Braucht ein Interface neben einer add() Methode auch eine remove() Methode? Aber: Design offen halten für nicht erwartete Erweiterungen. Erst mittels Profiling die Engpässe aufspüren und nur diese beheben.
7 Software Engineering: 8. Prinzipien objektorientierten Designs 7 DRY (Don't Repeat Yourself) Prinzip Jedes Wissen, jede Information (Daten, Metadaten, Logik, Funktionalität, Algorithmus, etc.) wird nur an einer massgebenden Stelle im System kodiert bzw. repräsentiert. Vermeidung von Problemquellen wie: Ausnahmen: Copy-Paste Sünde Codeduplikation Automatische Synchronisation (z.b. Codegenerator) Automatische Detektion von Asynchronität (z.b. durch den Compiler) Grosse technologische Hindernisse Performanzprobleme In Stein gemeisselte Wissensschnipsel (z.b. Kreisfläche) aber nicht Berechnung der Mehrwertsteuer (kann sich ändern) Fläche eines beliebigen Polygons (komplexer Algorithmus)
8 Software Engineering: 8. Prinzipien objektorientierten Designs 8 Separation of Concerns Aufteilung der verschiedenen Anliegen: Sachanliegen (aus den Anforderungen) technische Anliegen (z.b. Datenpersistenz, Datenverarbeitung, Datenpräsentation) Führt zur Zerlegung der Software in Schichten Module Komponenten Objekte Konsequenz: Schnittstellen zwischen den Teilen
9 Software Engineering: 8. Prinzipien objektorientierten Designs 9 CRC Karten CRC = Class-Responsibility-Collaborators Designtechnik um Separation of Concerns umzusetzen Eine Karte pro Klasse (Interface, Komponente, Schicht, etc.) mit 3 Sektoren: Das Design-Meeting beginnt mit leeren Karten. Durch Diskussion und Rollenspiel wird versucht aus den Anforderungen bzw. Spezifikationen herauszufinden: Class Resp. Klassenname Coll. Verantwortlichkeiten der Klasse Andere Klassen mit denen diese Klasse zusammenarbeitet Welche Klassen es braucht. Wie sie heissen sollen. Für was welche Klasse zuständig ist. Wie die Klassen untereinander kommunizieren. All das wird auf den Karten notiert, durchgestrichen, geändert etc.
10 Software Engineering: 8. Prinzipien objektorientierten Designs 10 Schnittstelle Teil A Teil B Datenfluss Typen von Schnittstellen: Schnittstelle Eine Schnittstelle repräsentiert den öffentlichen Aspekt eines Teils des Systems. Sie trennt Absicht von Realisierung Abstraktion von Implementierung (Geheimnisprinzip) Client von Service Benutzer von Autor Funktionen die in C Header Dateien als API deklariert sind. Öffentliche (public) Attribute und Operationen einer Klasse Das Sprachkonstrukt Interface in Sprachen wie Java, C#, etc.
11 Software Engineering: 8. Prinzipien objektorientierten Designs 11 Design by Contract Konzept von Bertrand Meyer zum Entwurf von Schnittstellen. Idee: Eine Schnittstelle ist ein Vertrag (eng. contract) zwischen Client und Service (Realisierung der Schnittstelle). Im Vertrag steht für jede Operation die Vorbedingung (eng. precondition), die erfüllt sein muss bevor die Operation aufgerufen wird, die Nachbedingung (eng. postcondition), die der Service garantiert. Vorbedingung und Nachbedingung sind Zusicherungen (eng. assertions). Das sind Boolesche Ausdrücke, die wahr sind, wenn der Vertrag eingehalten wird. Ausnahmen (eng. exceptions) werden geworfen wenn die Voraussetzungen nicht erfüllt wurden oder der Service die Nachbedingung nicht einhalten kann.
12 Software Engineering: 8. Prinzipien objektorientierten Designs 12 Geheimnisprinzip (Information Hiding) Unterscheidung zwischen dem was ein Teil des Systems (Module, Komponente oder Klasse) macht und dem wie es seine Aufgabe erfüllt. WAS: Schnittstelle. Diese ist offen und bekannt. WIE: Implementierung. Diese ist versteckt. Kommunikation zwischen den Teilen via Schnittstellen Verhindert unerwünschte Kopplungen zwischen Teilen des Systems. Reduziert die Komplexität. Erlaubt unabhängige Entwicklung von Modulen, Komponenten, bzw. Klassen. Voraussetzung: Schnittstelle ist stabil und gut dokumentiert. Erlaubt Testbarkeit einzelner Module, Komponenten, bzw. Klassen. Dummies und Mocks der Schnittstellen ersetzen den Rest des Systems.
13 Software Engineering: 8. Prinzipien objektorientierten Designs 13 Geheimnisprinzip und Kapselung Geheimnisprinzip Kapselungsprinzip der OOP Beispiel: Kapselung fasst Daten und Methoden zusammen (Objekte). Die Kapsel kann transparent oder undurchsichtig sein. Kapselung: Daten (Attribute) nicht direkt sichtbar. public class NoInformationHidingNorEncapsulation { public ArrayList points = new ArrayList(); public class NoInformationHidingButEncapsulation { private ArrayList points = new ArrayList(); public ArrayList getpoints(){ return points; ArrayList List public class InformationHidingAndEncapsulation{ private ArrayList points = new ArrayList(); public List getpoints(){ return points; public class InformationHidingWithoutEncapsulation { public List points = new ArrayList(); Quelle:
14 Software Engineering: 8. Prinzipien objektorientierten Designs 14 Objektorientierte Designprinzipien Open-Closed Prinzip Liskovsche Substitutionsprinzip Komposition vor Vererbung Prinzip der minimalen Kopplung Prinzip der maximalen Kohäsion Prinzip der Umkehrung von Abhängigkeiten Prinzip der azyklischen Abhängigkeit
15 Software Engineering: 8. Prinzipien objektorientierten Designs 15 Open-Closed Prinzip Eine wiederverwendbare Klasse sollte offen sein für Erweiterungen, aber geschlossen für Änderungen. (Bertrand Meyer, 1988) D.h. der Code der Klasse muss nicht geändert werden, um dem System ein neues Feature hinzuzufügen. Mögliche Umsetzungen dieses Prinzips: Subklasse bilden und Methode überschreiben. Bestehende Klassen durch Delegation wiederverwenden. Frameworks sind Beispiele für die Anwendung dieses Prinzips: Um Frameworks benutzen zu können, müssen Basisklassen erweitert, Interfaces implementiert werden. Frameworks sind i.r. 3 th -party Software und als solche nicht änderbar (ausser bei Open Source).
16 Software Engineering: 8. Prinzipien objektorientierten Designs 16 Open-Closed Prinzip: Beispiel Folgendes Codefragment verletzt dieses Prinzip: public void draw(form form) { if (form.type == CIRCLE) { drawcircle(form); else if (form.type == SQUARE) { drawsquare(form); Die Methode draw() soll eine geometrisch Form zeichnen. Falls das Programm um eine neue Form (z.b. Dreieck) erweitert wird, muss diese Methode angepasst werden. Lösung durch Polymorphismus: «Interface» Form draw() public void draw(form form) { form.draw(); Circle Square Triangle
17 Software Engineering: 8. Prinzipien objektorientierten Designs 17 Liskovsche Substitutionsprinzip Instanzen von einer Klassen können durch Instanzen ihrer Subklasse ersetzt werden. (Barbara Liskov, 1988) Beispiel: Client Base Derived D.h. statt mit einem Objekt der Klasse Base arbeitet Client genauso gut mit einem Objekt der Subklasse Derived. Das ist nicht selbstverständlich, da sich die abgeleitete Klasse anders verhalten kann als die Basisklasse.
18 Software Engineering: 8. Prinzipien objektorientierten Designs 18 Liskovsche Substitutionsprinzip: Beispiel Klasse: Subklasse: public class Ellipse { private Point focus1; private Point focus2; public void setfoci(point f1, Point f2) { focus1 = f1; focus2 = f2; public Point getfocus1() { return focus1; public Point getfocus2() { return focus2; public class Circle extends Ellipse { public void setfoci(point f1, Point f2) { focus1 = f1; focus2 = f1; Folgender Clientcode wirft ein AssertionError: public void test(ellipse e) { Point p1 = new Point(1, 0); Point p2 = new Point(-1, 0); e.setfoci(p1, p2); assert e.getfocus2().equals(p2);
19 Software Engineering: 8. Prinzipien objektorientierten Designs 19 Liskovsche Substitutionsprinzip: Regel Die Verletzung des Liskovschen Substitutionsprinzips zeigt sich erst zur Laufzeit. Folgende Regeln garantieren die Einhaltung das Liskovschen Substitutionsprinzips: 1.Die Vorbedingungen an die überschriebenen Methoden sind nicht strenger als die für die Basisklasse. Aussagelogisch: precondition class precondition subclass 1.Die Nachbedingung an die überschriebenen Methoden sind nicht schwächer als die für die Basisklasse. Aussagelogisch: postcondition subclass postcondition class
20 Software Engineering: 8. Prinzipien objektorientierten Designs 20 Komposition vor Vererbung Vererbung: A work() B work() Überschreibt Methode der Superklasse Komposition: Delegiert an a: a.work() B work() a 1 A work() Vererbung problematisch: Liskovsche Substitutionsprinzip kann verletzt werden. Starke Abhängigkeit zwischen Subklasse und Basisklasse Verletzung des Geheimnisprinzips möglich: Verhalten der Subklasse kann von Implementierungsdetails der Superklasse abhängen.
21 Software Engineering: 8. Prinzipien objektorientierten Designs 21 Problematische Vererbung: Beispiel Subklasse von HashSet: Zähl wie oft versucht wurde ein Objekt hinzuzufügen. import java.util.*; public class MonitoredSet extends HashSet { private int addcounter; public int getaddcounter() { return addcounter; public boolean add(object object) { addcounter++; return super.add(object); public boolean addall(collection collection) { addcounter += collection.size(); return super.addall(collection); Dies führt in folgendem Codefragment zu einem AssertionError: MonitoredSet set = new MonitoredSet(); set.addall(arrays.aslist(new String[] { a, b, c ); assert set.getaddcounter() == 3; «Interface» Set HashSet MonitoredSet
22 Software Engineering: 8. Prinzipien objektorientierten Designs 22 Problematische Vererbung: Komposition Lösung: MonitoredSet delegiert an HashSet: import java.util.*; public class MonitoredSet implements Set{ private Set set = new HashSet(); private int addcounter; public int getaddcounter() { return addcounter; public boolean add(object object) { addcounter++; return set.add(object); public boolean addall(collection collection) { addcounter += collection.size(); return set.addall(collection);... «Interface» Set MonitoredSet 1 HashSet
23 Software Engineering: 8. Prinzipien objektorientierten Designs 23 Regeln für Vererbung Vererbung (B ist Subklasse von A) ist unproblematisch wenn: Objekt vom Typ B ist eine spezielle Art von A und nicht ist eine Rolle von A. B erweitert A. Es wird keine Operation überschrieben. B überschreibt Operationen von A, die ausdrücklich überschrieben werden dürfen (z.b. die Methode init() der Klasse java.applet.applet). A ist Teil einer schlecht entworfenen 3 th -party API. Im Zweifelsfall: Komposition statt Vererbung
24 Software Engineering: 8. Prinzipien objektorientierten Designs 24 Prinzip der minimalen Kopplung Keine Kopplung zwischen Klassen, die nicht eine gemeinsame Aufgabe erfüllen. Kopplung zwischen Modulen bzw. Komponenten nur über Schnittstellen. Interface Klasse Abhängigkeit
25 Software Engineering: 8. Prinzipien objektorientierten Designs 25 Prinzip der maximalen Kohäsion Starke Kopplung zwischen Klassen, die eine gemeinsame Aufgabe erfüllen. Klassen, die eine gemeinsame Aufgabe erfüllen, gehören zusammen in ein Paket. Klassen, die nur schwach gekoppelt sind, gehören in verschiedene Pakete (Separation of Concerns auf Paketebene).
26 Software Engineering: 8. Prinzipien objektorientierten Designs 26 Prinzip der Umkehrung von Abhängigkeiten Abstraktionen sollen nicht von Details abhängen, sondern umgekehrt. (Robert C. Martin, 1995) Typische Abhängigkeiten in prozeduralen Systeme: Hauptprogramm Funktion 1 Funktion 2 Funktion A Funktion B Funktion C Umkehrung der Abhängigkeiten: Main «Interface» I1 «Interface» I2 Implementation1 Implementation2
27 Software Engineering: 8. Prinzipien objektorientierten Designs 27 Prinzip der azyklischen Abhängigkeit Der Graph der Abhängigkeiten zwischen Modulen bzw. Paketen sollte azyklisch sein. (John Lakos, 1996, Robert C. Martin, 1996) Zyklische Abhängigkeiten sind problematisch weil grösserer Aufwand in der Wartung, bezüglich Erweiterungen, beim Testen. Zyklische Abhängigkeiten zwischen Klassen sind vertretbar wenn alle Klassen im selben Paket, nur eine handvoll Klassen involviert sind.
28 Software Engineering: 8. Prinzipien objektorientierten Designs 28 Zyklische Abhängigkeiten auflösen Zwischen Klassen: Interface einführen A A «Interface» IB C B C B Ursache zyklischer Abhängigkeiten von Paketen: Klassenzyklus mit Klassen in verschiedenen Paketen. Auflösung: Siehe oben Klasse(n) in falschem Paket Auflösung: Klasse(n) verschieben p Paketname r p r A B q D A q B D C C UML Paket Notation
29 Software Engineering: 8. Prinzipien objektorientierten Designs 29 Links Wiki zu OO Design (und andere IT Themen): Martin Fowler's Web Site:
SEP 114. Design by Contract
Design by Contract SEP 114 Design by Contract Teile das zu entwickelnde Programm in kleine Einheiten (Klassen, Methoden), die unabhängig voneinander entwickelt und überprüft werden können. Einheiten mit
MehrClient-Server-Beziehungen
Client-Server-Beziehungen Server bietet Dienste an, Client nutzt Dienste Objekt ist gleichzeitig Client und Server Vertrag zwischen Client und Server: Client erfüllt Vorbedingungen eines Dienstes Server
MehrProgrammieren in Java
Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können
MehrSoftware Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015
Software Engineering Zur Architektur der Applikation Data Repository Franz-Josef Elmer, Universität Basel, HS 2015 Software Engineering: Mit acht bewährten Praktiken zu gutem Code 2 Schichtarchitektur
MehrObjektorientierte Programmierung
Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum
MehrVerhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...
PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 31 Schlüsselwort: final Verhindert, dass eine Methode überschrieben wird public final int holekontostand() {... Erben von einer Klasse verbieten:
MehrEinführung in die Programmierung
Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In
MehrPrinzipien Objektorientierter Programmierung
Prinzipien Objektorientierter Programmierung Valerian Wintner Inhaltsverzeichnis 1 Vorwort 1 2 Kapselung 1 3 Polymorphie 2 3.1 Dynamische Polymorphie...................... 2 3.2 Statische Polymorphie........................
Mehr16 Architekturentwurf Einführung und Überblick
Teil III: Software-Architekturentwurf 16 Architekturentwurf Einführung und Überblick 16.1 Software entwerfen Warum? Beim Arbeiten im Kleinen nicht oder nur ansatzweise (Detailentwurf) Größere Software
MehrObjektorientierte Programmierung. Kapitel 12: Interfaces
12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/
MehrKlassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java
Objektorientierte Programmierung mit Java Eine praxisnahe Einführung mit BlueJ Klassenentwurf Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? 1.0 Zentrale Konzepte
MehrObjektorientierte Programmierung OOP
Objektorientierte Programmierung OOP Objektorientierte Programmierung OOP Ronja Düffel WS2012/13 08. Oktober 2013 Objektorientierte Programmierung OOP Objektorientierte Programmierung Objektorientierte
MehrSoftware Engineering Klassendiagramme Assoziationen
Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen
MehrObjektorientiertes JavaScript
Objektorientiertes JavaScript Christoph Fabritz dm121506@fhstp.ac.at http://goo.gl/jzqxnw Inhalt JavaScript Objektorientierung OO in JavaScript Literatur JavaScript Interpretiert / gescriptet Dynamische
MehrFassade. Objektbasiertes Strukturmuster. C. Restorff & M. Rohlfing
Fassade Objektbasiertes Strukturmuster C. Restorff & M. Rohlfing Übersicht Motivation Anwendbarkeit Struktur Teilnehmer Interaktion Konsequenz Implementierung Beispiel Bekannte Verwendung Verwandte Muster
MehrCode wiederverwenden: Objektorientierte Programmierung (OOP) sinnvoll nutzen Roland Wagner Automatisierungstreff IT & Automation 2015
Code wiederverwenden: Objektorientierte Programmierung (OOP) sinnvoll nutzen Roland Wagner Automatisierungstreff IT & Automation 2015 CODESYS a trademark of 3S-Smart Software Solutions GmbH Agenda 1 Warum
MehrAssoziation und Aggregation
Assoziation und Aggregation Martin Wirsing in Zusammenarbeit mit Matthias Hölzl, Nora Koch 05/03 2 Ziele Verstehen der Begriffe Assoziation und Aggregation Implementierung von Assoziationen in Java schreiben
Mehr2015-06-11 Tagesprogramm
1 2015-06-11 Tagesprogramm Design-by-Contract 2 Vertragspartner Anbieter (Server) bietet Leistungen (Services) an Kunde (Client) nimmt von Anbietern angebotene Leistungen in Anspruch Details der Inanspruchnahme
MehrDaniel Warneke warneke@upb.de 08.05.2006. Ein Vortrag im Rahmen des Proseminars Software Pioneers
Design Patterns Daniel Warneke warneke@upb.de 08.05.2006 Ein Vortrag im Rahmen des Proseminars Software Pioneers Design Patterns 1/23 Übersicht Einleitung / Motivation Design Patterns Beispiele Rolle des
MehrNathan Burgener. Design by Contract. Modul SWE
NathanBurgener DesignbyContract ModulSWE NathanBurgener Inhaltsverzeichnis 1 WasistDesignbyContract...3 1.1 Überblick...3 1.2 DesignbyContractmitMethoden...4 1.3 DesignbyContractmitKlassen...5 1.4 Vererbung...6
MehrGrundlagen von Python
Einführung in Python Grundlagen von Python Felix Döring, Felix Wittwer November 17, 2015 Scriptcharakter Programmierparadigmen Imperatives Programmieren Das Scoping Problem Objektorientiertes Programmieren
MehrObjektorientierte Programmierung
Universität der Bundeswehr Fakultät für Informatik Institut 2 Priv.-Doz. Dr. Lothar Schmitz FT 2006 Zusatzaufgaben Lösungsvorschlag Objektorientierte Programmierung Lösung 22 (Java und UML-Klassendiagramm)
MehrJava Einführung Packages
Java Einführung Packages Inhalt dieser Einheit Packages (= Klassenbibliotheken) Packages erstellen Packages importieren Packages verwenden Standard Packages 2 Code-Reuse Einbinden von bereits (selbst-/fremd)
MehrAlbert HAYR Linux, IT and Open Source Expert and Solution Architect. Open Source professionell einsetzen
Open Source professionell einsetzen 1 Mein Background Ich bin überzeugt von Open Source. Ich verwende fast nur Open Source privat und beruflich. Ich arbeite seit mehr als 10 Jahren mit Linux und Open Source.
MehrSoftwaretechnik (Allgemeine Informatik) Überblick
Softwaretechnik (Allgemeine Informatik) Überblick 1 Einführung und Überblick 2 Abstraktion 3 Objektorientiertes Vorgehensmodell 4 Methoden der Anforderungs- und Problembereichsanalyse 5 UML-Diagramme 6
MehrFachdidaktik der Informatik 18.12.08 Jörg Depner, Kathrin Gaißer
Fachdidaktik der Informatik 18.12.08 Jörg Depner, Kathrin Gaißer Klassendiagramme Ein Klassendiagramm dient in der objektorientierten Softwareentwicklung zur Darstellung von Klassen und den Beziehungen,
MehrJava Kurs für Anfänger Einheit 4 Klassen und Objekte
Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse
MehrJava Einführung Collections
Java Einführung Collections Inhalt dieser Einheit Behälterklassen, die in der Java API bereitgestellt werden Wiederholung Array Collections (Vector, List, Set) Map 2 Wiederholung Array a[0] a[1] a[2] a[3]...
MehrJava: Vererbung. Teil 3: super() www.informatikzentrale.de
Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und
MehrObjektbasierte Entwicklung
Embedded Software Objektbasierte Entwicklung Objektorientierung in C? Prof. Dr. Nikolaus Wulff Objektbasiert entwickeln Ohne C++ wird meist C im alten Stil programmiert. => Ein endlose while-schleife mit
MehrProgrammierkurs Java
Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen
MehrDesign by Contract with JML
Thema: Design by Contract with JML Proseminar: Assertions Verfasser: Literatur: Betreuer: Natalya Moriz Gary T.Leavens and Yoonsik Cheon: Design by Contract with JML Prof. Dr. Heike Wehrheim 1 Inhalt DBC
MehrJava Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7
Java Einführung Umsetzung von Beziehungen zwischen Klassen Kapitel 7 Inhalt Wiederholung: Klassendiagramm in UML Java-Umsetzung von Generalisierung Komposition Assoziationen 2 Das Klassendiagramm Zweck
MehrWintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 22
Kapitel 19 Vererbung, UML Seite 1 von 22 Vererbung - Neben der Datenabstraktion und der Datenkapselung ist die Vererbung ein weiteres Merkmal der OOP. - Durch Vererbung werden die Methoden und die Eigenschaften
MehrDesign Patterns 2. Model-View-Controller in der Praxis
Design Patterns 2 Model-View-Controller in der Praxis Design Patterns Oft Schablonen für eine Klassenstruktur... aber nicht immer! Dahinterliegende Konzepte wichtiger als wörtliche Umsetzung Pattern werden
MehrTesten mit JUnit. Motivation
Test First Design for Test in Eclipse (eigentlich: ) zu einer Klasse Beispiel zur Demonstration Ergänzungen Test First "Immer dann, wenn Du in Versuchung kommst, etwas wie eine print- Anweisung oder einen
MehrProzessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements. von Stephanie Wilke am 14.08.08
Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements von Stephanie Wilke am 14.08.08 Überblick Einleitung Was ist ITIL? Gegenüberstellung der Prozesse Neuer
MehrSDD System Design Document
SDD Software Konstruktion WS01/02 Gruppe 4 1. Einleitung Das vorliegende Dokument richtet sich vor allem an die Entwickler, aber auch an den Kunden, der das enstehende System verwenden wird. Es soll einen
MehrGroße Übung Praktische Informatik 1
Große Übung Praktische Informatik 1 2005-12-08 fuessler@informatik.uni-mannheim.de http://www.informatik.uni-mannheim.de/pi4/people/fuessler 1: Announcements / Orga Weihnachtsklausur zählt als Übungsblatt,
MehrJava Einführung Abstrakte Klassen und Interfaces
Java Einführung Abstrakte Klassen und Interfaces Interface Interface bieten in Java ist die Möglichkeit, einheitliche Schnittstelle für Klassen zu definieren, die später oder/und durch andere Programmierer
MehrObjektorientierter Software-Entwurf Grundlagen 1 1. Analyse Design Implementierung. Frühe Phasen durch Informationssystemanalyse abgedeckt
Objektorientierter Software-Entwurf Grundlagen 1 1 Einordnung der Veranstaltung Analyse Design Implementierung Slide 1 Informationssystemanalyse Objektorientierter Software-Entwurf Frühe Phasen durch Informationssystemanalyse
MehrKlassendiagramm. Kurzer Überblick über UML - Stand 2006. BlaBla
BlaBla Diese Kennzeichnungen sind nur Erläuterungen und nicht Bestandteil des Diagramms Quelle: P.Grässle, H.Baumann, P.Baumann, UML projektorientiert, Galileo Verlag, 2003 21 Primäre Begriffe Kapselung
MehrBIF/SWE - Übungsbeispiel
BIF/SWE - Übungsbeispiel Arthur Zaczek Feb 2015 1 Allgemein 1.1 Ziele Ziele dieses Übungsbeispieles ist es: GUI: Implementierung einer grafischen Oberfläche mit JavaFX oder WPF UI-Komponente: Implementierung
MehrZeichen bei Zahlen entschlüsseln
Zeichen bei Zahlen entschlüsseln In diesem Kapitel... Verwendung des Zahlenstrahls Absolut richtige Bestimmung von absoluten Werten Operationen bei Zahlen mit Vorzeichen: Addieren, Subtrahieren, Multiplizieren
MehrKlausur zur Einführung in die objektorientierte Programmierung mit Java
Klausur zur Einführung in die objektorientierte Programmierung mit Java im Studiengang Informationswissenschaft Prof. Dr. Christian Wolff Professur für Medieninformatik Institut für Medien-, Informations-
Mehr3 Objektorientierte Konzepte in Java
3 Objektorientierte Konzepte in Java 3.1 Klassendeklarationen Fragen an die Klassendeklaration: Wie heißt die Klasse? Wer darf auf die Klasse und ihre Attribute/Methoden zugreifen? Ist die Klasse eine
MehrÜbungsklausur vom 7. Dez. 2007
Übungsklausur vom 7. Dez. 2007 Ein Lösungsmuster Teilbereiche der Softwaretechnik Software Anforderungen Software Entwurf Software Konstruktion Software Test Software Wartung Software Konfigurationsmanagement
MehrProgrammieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek
Programmieren I Dr. Klaus Höppner Hochschule Darmstadt Wintersemester 2008/2009 1 / 22 2 / 22 Strategie zum Entwurf von Klassen Beispiele Objektorientierte Sichtweise: Mit welchen Objekten habe ich es
MehrInteraktionen zwischen Objekten durch Senden von Nachrichten und Reagieren auf empfangene Nachrichten
Objekt Objekt kapselt Variablen und Routinen Interaktionen zwischen Objekten durch Senden von Nachrichten und Reagieren auf empfangene Nachrichten Eigenschaften jedes Objekts: Identität (identisch = mehrere
MehrEinführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005
Einführung in die objektorientierte Programmierung mit Java Klausur am 19. Oktober 2005 Matrikelnummer: Nachname: Vorname: Semesteranzahl: Die Klausur besteht aus drei Frageblöcken zu den Inhalten der
Mehr5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:
5. Abstrakte Klassen Beispiel 5. Abstrakte Klassen 5. Abstrakte Klassen Beispiel Beispiel (3) Angenommen, wir wollen die folgende Klassenhierarchie implementieren: Probleme des Implementierungsvorschlags:
Mehr7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure
7. Objektorientierte Softwareentwicklung/3 Informatik II für Verkehrsingenieure Überblick FOLGENDE BEGRIFFE/PRINZIPIEN SOLLTEN BEKANNT SEIN Objekte Klasse Attribute Fähigkeiten ZIEL DER HEUTIGEN LEHRVERANSTALTUNG
MehrDas Pflichtenheft. Dipl.- Ing. Dipl.-Informatiker Dieter Klapproth Ains A-Systemhaus GmbH Berlin
Fragestellungen: Warum reicht das Lastenheft nicht aus? Was kann ich mit dem Lastenheft machen? Was unterscheidet das Pflichtenheft vom Lastenheft? Was gehört zum Auftragsumfang einer Individualsoftware?
MehrDiplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008
Konzeption und Implementierung einer automatisierten Testumgebung, 10. Dezember 2008 1 Gliederung Einleitung Softwaretests Beispiel Konzeption Zusammenfassung 2 Einleitung Komplexität von Softwaresystemen
MehrVorkurs C++ Programmierung
Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:
MehrÜbungen zur Softwaretechnik
Technische Universität München Fakultät für Informatik Lehrstuhl IV: Software & Systems Engineering Markus Pister, Dr. Bernhard Rumpe WS 2002/2003 Lösungsblatt 9 17. Dezember 2002 www4.in.tum.de/~rumpe/se
MehrPHP Aufbaukurs. Tag 3. PHP5 & Klassen
PHP Aufbaukurs Tag 3. PHP5 & Klassen Organisatorisches 2 Igor Olkhovskiy Dr. Dipl.- Ing. Kontakt: olkhovskiy@rrzn.uni-hannover.de PHP Aufbaukurs 19.09.2006 Folie 2 PHP. OOP. Geschichte 3 PHP/FI ( PHP 1
MehrVererbung & Schnittstellen in C#
Vererbung & Schnittstellen in C# Inhaltsübersicht - Vorüberlegung - Vererbung - Schnittstellenklassen - Zusammenfassung 1 Vorüberlegung Wozu benötigt man Vererbung überhaubt? 1.Um Zeit zu sparen! Verwendung
MehrKapitel 6. Vererbung
Kapitel 6 Vererbung Vererbung 1 Ziele Das Vererbungsprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen
MehrFactory Method (Virtual Constructor)
Factory Method (Virtual Constructor) Zweck: Definition einer Schnittstelle für Objekterzeugung Anwendungsgebiete: Klasse neuer Objekte bei Objekterzeugung unbekannt Unterklassen sollen Klasse neuer Objekte
MehrFachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6
Gudrun Fischer Sascha Kriewel programmierung@is.informatik.uni-duisburg.de Anmeldung zur Klausur! Übungsblatt Nr. 6 Um an der Klausur teilzunehmen, müssen sich Studierende der angewandten Informatik in
MehrTest-Driven Design: Ein einfaches Beispiel
Test-Driven Design: Ein einfaches Beispiel Martin Wirsing in Zusammenarbeit mit Moritz Hammer und Axel Rauschmayer SS 06 2 Ziele Veranschaulichung der Technik des Test-Driven Design am Beispiel eines Programms
MehrSoftware Entwicklung II (SS12)
Prof. Dr. P. Liggesmeyer Dipl.-Inf. K. Bizik M.Sc. K. Nehring TU Kaiserslautern Fachbereich Informatik AG Software Engineering: Dependability Software Entwicklung II (SS12) Übung 5 Ausgabe: 04.06.2012
Mehram Beispiel von JUnit
Aufbau eines Testwerkzeugs am Beispiel von JUnit Üblicher Ansatz für Tests und Fehlersuche: Print-Befehle, Debugger-Ausdrücke, Test-Skripte möglichst über globale Variable debug steuerbar Command Pattern
MehrProbeklausur. Lenz Belzner. January 26, 2015. Lenz Belzner Probeklausur January 26, 2015 1 / 16
Probeklausur Lenz Belzner January 26, 2015 Lenz Belzner Probeklausur January 26, 2015 1 / 16 Definieren Sie Software Engineering in Abgrenzung zu Individual Programming. Ingenieursdisziplin professionelle
MehrKapitel 9. Inner Classes. 9.1 Wiederholung: Iteratoren. Ausführen einer Operation auf allen Elementen einer Containerklasse
Kapitel 9 Inner Classes 9.1 Wiederholung: Iteratoren Ausführen einer Operation auf allen Elementen einer Containerklasse (zb Liste, Baum,...) vgl. map/f old in der funktionalen Programmierung. Aber: higher-order
Mehr5. Abstrakte Klassen
5. Abstrakte Klassen Beispiel 5. Abstrakte Klassen Angenommen, wir wollen die folgende Klassenhierarchie implementieren: Vogel Amsel Drossel Fink Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg,
Mehr6 Architektur-Mittel (WOMIT)
6 Architektur-Mittel (WOMIT) Abb. 6-1: Positionierung des Kapitels im Ordnungsrahmen. Dieses Kapitel befasst sich mit der WOMIT-Dimension des architektonischen Ordnungsrahmens, indem es grundlegende Konzepte
MehrFortgeschrittenes Programmieren mit Java. Test Driven Development
Fortgeschrittenes Programmieren mit Java Test Driven Development Test getriebene Programmierung Benedikt Boeck Hochschule für Angewandte Wissenschaften Hamburg 6. November 2009 B. Boeck (HAW Hamburg) Test
MehrInformatik für Schüler, Foliensatz 21 Objektorientierte Programmierung
rof. G. Kemnitz Institut für Informatik, Technische Universität Clausthal 23. April 2009 1/14 Informatik für Schüler, Foliensatz 21 Objektorientierte Programmierung Prof. G. Kemnitz Institut für Informatik,
MehrHow to do? Projekte - Zeiterfassung
How to do? Projekte - Zeiterfassung Stand: Version 4.0.1, 18.03.2009 1. EINLEITUNG...3 2. PROJEKTE UND STAMMDATEN...4 2.1 Projekte... 4 2.2 Projektmitarbeiter... 5 2.3 Tätigkeiten... 6 2.4 Unterprojekte...
MehrSoftware Engineering. Sommersemester 2012, Dr. Andreas Metzger
Software Engineering (Übungsblatt 2) Sommersemester 2012, Dr. Andreas Metzger Übungsblatt-Themen: Prinzip, Technik, Methode und Werkzeug; Arten von Wartung; Modularität (Kohäsion/ Kopplung); Inkrementelle
MehrU08 Entwurfsmuster (II)
U08 Entwurfsmuster (II) Inhalt der Übung Diskussion und Implementierung von Entwurfsmustern Übungsaufgaben Aufgabe 1 (Queue) Gegeben ist das folgende Analysemodell einer Warteschlange (Queue): Eine Warteschlange
MehrSEMINAR Modifikation für die Nutzung des Community Builders
20.04.2010 SEMINAR Modifikation für die Nutzung des Community Builders Step by Step Anleitung ecktion SEMINAR Modifikation für die Nutzung des Community Builders Step by Step Anleitung Bevor Sie loslegen
MehrDaten-Synchronisation zwischen Mozilla Thunderbird (Lightning) / Mozilla Sunbird und dem ZDV Webmailer
Daten-Synchronisation zwischen Mozilla Thunderbird (Lightning) / Mozilla Sunbird und dem ZDV Webmailer Zentrum für Datenverarbeitung der Universität Tübingen Inhaltsverzeichnis 1.Synchronisation...aber
MehrVgl. Kapitel 5 aus Systematisches Requirements Engineering, Christoph Ebert https://www.sws.bfh.ch/studium/cas/swe-fs13/protected/re/re_buch.
Vgl. Kapitel 5 aus Systematisches Requirements Engineering, Christoph Ebert https://www.sws.bfh.ch/studium/cas/swe-fs13/protected/re/re_buch.pdf 2 Nach derbefragung aller Stakeholder und der Dokumentation
MehrDer lokale und verteilte Fall
Lokale Beans Der lokale und verteilte Fall RemoteClient Lokaler Client (JSP) RemoteSession/Entity-Bean Lokale Session/Entity-Bean 2 Lokale Beans Die bisher vorgestellten EJBswaren immer in der Lage auf
MehrDer Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben.
Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.
Mehr1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:
Zählen und Zahlbereiche Übungsblatt 1 1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage: Für alle m, n N gilt m + n = n + m. in den Satz umschreiben:
MehrWillkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java
Willkommen zur Vorlesung Objektorientierte Programmierung Vertiefung - Java Zum Dozenten Mein Name: Andreas Berndt Diplom-Informatiker (TU Darmstadt) Derzeit Software-Entwickler für Web- Applikationen
Mehrteischl.com Software Design & Services e.u. office@teischl.com www.teischl.com/booknkeep www.facebook.com/booknkeep
teischl.com Software Design & Services e.u. office@teischl.com www.teischl.com/booknkeep www.facebook.com/booknkeep 1. Erstellen Sie ein neues Rechnungsformular Mit book n keep können Sie nun Ihre eigenen
Mehr3. Konzepte der objektorientierten Programmierung
3. Konzepte der objektorientierten Programmierung 3.1 Basiskonzepte 3.2 Generalisierung / Spezialisierung 3.3 Aggregation 3.4 Assoziation 3.5 Nachrichten 3.6 Polymorphismus 3. Konzepte der Objektorientierung
MehrKapitel 6. Vererbung
1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben
MehrSome Software Engineering Principles
David L. Parnas: Some Software Engineering Principles Marco Oppel 30.06.2004 Seminar Software-Architektur Institut für Informatik Humboldt Universität zu Berlin 1 Problemstellung Software Engineering Multi-Personen
MehrProbeklausur Softwareengineering SS 15
Probeklausur Softwareengineering SS 15 Hinweis: Die Bearbeitungsdauer entspricht dem Punktewert. Aufgabe 1 (10 min) Beschreiben Sie das Vorgehensmodell Test-Driven-Development (TDD) a) Erläutern Sie das
MehrSelbststudium OOP4 Auftrag
Selbststudium OOP4 Auftrag Kapitel 3.6 1. Wie deklarieren Sie eine Referenzvariable? Mit new z.b. Student studenta = new Stundent( Meier ); 2. Zeichnen Sie das Objektdiagramm zum BlueJ Picture Projekt
MehrStuPro-Seminar Dokumentation in der Software-Wartung. StuPro-Seminar Probleme und Schwierigkeiten in der Software-Wartung.
StuPro-Seminar Dokumentation in der Software-Wartung StuPro-Seminar Probleme und Schwierigkeiten in der Software-Wartung Folie 1/xx Software-Wartung: theoretisch Ausgangslage eigentlich simpel: fertige
MehrInformationssystemanalyse Problemstellung 2 1. Trotz aller Methoden, Techniken usw. zeigen Untersuchungen sehr negative Ergebnisse:
Informationssystemanalyse Problemstellung 2 1 Problemstellung Trotz aller Methoden, Techniken usw. zeigen Untersuchungen sehr negative Ergebnisse: große Software-Systeme werden im Schnitt ein Jahr zu spät
MehrIAWWeb PDFManager. - Kurzanleitung -
IAWWeb PDFManager - Kurzanleitung - 1. Einleitung Dieses Dokument beschreibt kurz die grundlegenden Funktionen des PDFManager. Der PDF Manager dient zur Pflege des Dokumentenbestandes. Er kann über die
MehrWorkshop 6. Einführung in die objektorientierte Programmierung. Teil: Java mit BlueJ
IBBB 2010 Workshop 6 Einführung in die objektorientierte Programmierung Dozenten: J. Penon, J. Frank, A. Schindler Teil: Java mit BlueJ Dozent: A. Schindler Einf. i. d. OOP - Java u. BlueJ / A. Schindler
MehrWas meinen die Leute eigentlich mit: Grexit?
Was meinen die Leute eigentlich mit: Grexit? Grexit sind eigentlich 2 Wörter. 1. Griechenland 2. Exit Exit ist ein englisches Wort. Es bedeutet: Ausgang. Aber was haben diese 2 Sachen mit-einander zu tun?
MehrSoftwareentwicklungsprozess im Praktikum. 23. April 2015
Softwareentwicklungsprozess im Praktikum 23. April 2015 Agile Softwareentwicklung Eine agile Methodik stellt die beteiligten Menschen in den Mittelpunkt und versucht die Kommunikation und Zusammenarbeit
MehrBehindert ist, wer behindert wird
Behindert ist, wer behindert wird Alle Menschen müssen lernen, dass Menschen mit Behinderungen gleichberechtigt sind Auf der ganzen Welt leben sehr viele Menschen mit Behinderungen: über 1 Milliarde Menschen
MehrOO Softwareentwicklung
OO Softwareentwicklung Objektorientierung Prof. Dr. Bernhard Schiefer 1 OO als Ansatz zur Verbesserung der Software-Qualität Modellierung der Welt als selbständig agierende Objekte. Gemeinsame Beschreibung
MehrEinführung und Motivation
Einführung und Motivation iks-thementag: Requirements Engineering 16.11.2010 Autor Carsten Schädel Motto Definiere oder Du wirst definiert. Seite 3 / 51 These Im Privatleben definiert jeder (seine) Anforderungen.
MehrEinführung in die Java- Programmierung
Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113
MehrGrundlagen der Theoretischen Informatik, SoSe 2008
1. Aufgabenblatt zur Vorlesung Grundlagen der Theoretischen Informatik, SoSe 2008 (Dr. Frank Hoffmann) Lösung von Manuel Jain und Benjamin Bortfeldt Aufgabe 2 Zustandsdiagramme (6 Punkte, wird korrigiert)
MehrDesign Pattern - Strukturmuster. CAS SWE - OOAD Marco Hunziker Klaus Imfeld Frédéric Bächler Marcel Lüthi
Design Pattern - Strukturmuster CAS SWE - OOAD Marco Hunziker Klaus Imfeld Frédéric Bächler Marcel Lüthi Agenda Einleitung Strukturmuster Fassade Model View Controller Vergleich 2 Einleitung Strukturmuster
MehrAgile Vorgehensmodelle in der Softwareentwicklung: Scrum
C A R L V O N O S S I E T Z K Y Agile Vorgehensmodelle in der Softwareentwicklung: Scrum Johannes Diemke Vortrag im Rahmen der Projektgruppe Oldenburger Robot Soccer Team im Wintersemester 2009/2010 Was
MehrDieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.
Übersicht Struts Forms Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen. Allgemeines Autor: Sascha Wolski http://www.laliluna.de/tutorials.html
Mehr