OOP Beispiele Arthur Zaczek Nov 2014 OOP Beispiele 1 Software Engineering 1 2 Factory Pattern 2.1 Definition • Das Pattern beschreibt, wie ein Objekt durch Aufruf einer Methode anstatt durch direkten Aufruf eines Konstruktors erzeugt wird. • Der Pattern findet dann Anwendung, wenn eine Klasse die von ihr zu erzeugenden Objekte nicht kennen kann bzw. soll, oder wenn bestimmt werden soll, welche Objekte erzeugt werden. 2.2 Beispiel • Ohne: MemoryStore s = new MemoryStore(); • Mit: IStorage s = StorageFactory.Create(); 2.3 Aufbau Figure 1: 2.4 Source (Pseudocode) public interface IStorage { void SaveMessage(string msg); List<string> LoadMessage(); } 1 OOP Beispiele public class StorageFactory { public static IStorage Create() { // TODO: Add logic here return new MemoryStorage(); } } public class MemoryStorage : IStorage { public void SaveMessage(string msg) { } public List<string> LoadMessage() { } } public class DatabaseStorage : IStorage { public void SaveMessage(string msg) { } public List<string> LoadMessage() { } } 2.5 Übung? • Z.Z. werden alle Nachrichten im Hauptspeicher gespeichert • Mit diesem Pattern könnte es der Konfiguration überlassen werden, wo Daten gespeichert werden sollen • Stichwort: Unittests (nächstes Semester) 3 Abstrakte Klassen 3.1 Abstrakte Klassen • Ist eine Klasse, die man nicht instanziieren kann • Als Basisklassen in einer Klassenhierarchie können abstrakte Klassen grundlegende Eigenschaften ihrer Unterklassen festlegen, ohne diese bereits konkret zu implementieren. • Leitet eine Klasse von einer abstrakten Klasse ab, müssen alle vererbten abstrakten Methoden überschrieben und implementiert werden, damit die erbende Klasse selbst nicht abstrakt ist. 3.2 Beispiel public abstract class BasisFigur { double laenge; double hoehe; public BasisFigur(double laenge, double hoehe) { this.laenge = laenge; this.hoehe = hoehe; } public double getLaenge() { 2 OOP Beispiele return laenge; } public void setLaenge(double laenge) { this.laenge = laenge; } public double getHoehe() { return hoehe; } public void setHoehe(double hoehe) { this.hoehe = hoehe; } public abstract double berechneFlaeche(); } 3.3 Beispiel public class Rechteck extends BasisFigur { public Rechteck(double laenge, double hoehe) { super(laenge, hoehe); } @Override public double berechneFlaeche() { return getLaenge() * getHoehe(); } } 3.4 Beispiel public class RechtwinkligesDreieck extends BasisFigur { public RechtwinkligesDreieck(double laenge, double hoehe) { super(laenge, hoehe); } @Override public double berechneFlaeche() { return (getLaenge() * getHoehe()) / 2; } } 3.5 Abstrakte Klassen • In diesem Beispiel hat die abstrakte Klasse Basis-Funktionalität zu Verfügung gestellt • Sie hat aber auch die Implementierung einer Methode erzwungen 3 OOP Beispiele 3.6 Weitere Beispiele public abstract class BaseNotifyingObject : INotifyingObject { protected abstract void SetModified(); public event ChangedHandler Changed; public event ChangingHandler Changing; public virtual void NotifyChanging() { } public virtual void NotifyChanged() { } protected virtual void OnChanging() { } protected virtual void OnChanged() { } private List<string> notifications; public void RecordNotifications() { } public void PlaybackNotifications() { } } 3.7 • • • • 3.8 BaseNotifyingObject Objekt verlangt die Implementierung von SetModified() Bietet als Infrastruktur Benachrichtigungen Verspätetes benachrichtigen über Änderungen Weitere Beispiele public abstract class BasePersistenceObject : BaseNotifyingObject, IPersistenceObject, IDataErrorInfo { public abstract int ID { get; set; } public bool IsReadonly { get { } } public IContext Context { get; private set; } public abstract bool IsAttached { get; } public abstract DataObjectState ObjectState { get; } public abstract bool IsValid(); public virtual void AttachToContext(IContext ctx) { } public virtual void DetachFromContext(IContext ctx) { } public abstract InterfaceType GetInterfaceType(); protected abstract string GetPropertyError(string prop); } 4 OOP Beispiele 3.9 BasePersistenceObject • Bietet Infrastruktur für Objekte, welche in einer Datenbank gespeichert werden können • Verlangt die Implementierung einiger Methoden, die es selbst nicht bieten kann • Da die Objekte in unterschiedlichen Datenbanken gespeichert werden können 4 Interfaces 4.1 Java - Datenbank public interface Connection { Statement createStatement() throws SQLException; PreparedStatement prepareStatement(String sql) throws SQLException; CallableStatement prepareCall(String sql) throws SQLException; String nativeSQL(String sql) throws SQLException; void setAutoCommit(boolean autoCommit) throws SQLException; boolean getAutoCommit() throws SQLException; void commit() throws SQLException; void rollback() throws SQLException; void close() throws SQLException; boolean isClosed() throws SQLException; } 4.2 • • • • 4.3 • • • • • • • • 4.4 Java - Datenbank Java benutzt ein Treibermodel um Datenbanken anzusprechen Mit ein und denselben Interfaces kann mit jeder beliebigen Datenbank kommuniziert werden SQL Statements unterscheiden sich natürlich Stichwort: FactoryPattern java.util - Collections Collection The root interface in the collection hierarchy. Enumeration An object that implements the Enumeration interface generates a series of elements, one at a time. Iterator An iterator over a collection. List An ordered collection (also known as a sequence). java.util - Collections • ListIterator • An iterator for lists that allows the programmer to traverse the list in either direction and modify the list during iteration. • Map An • object that maps keys to values. • Map.Entry 5 OOP Beispiele • A map entry (key-value pair). • Set • A collection that contains no duplicate elements. 4.5 java.util - Collections • SortedMap • A map that further guarantees that it will be in ascending key order, sorted according to the natural ordering of its keys (see the Comparable interface), or by a comparator provided at sorted map creation time. • SortedSet • A set that further guarantees that its iterator will traverse the set in ascending element order, sorted according to the natural ordering of its elements (see Comparable), or by a Comparator provided at sorted set creation time. 4.6 java.util - Collections • Die eigentliche Implementierung kann von Fall zu Fall gewählt werden • Trotzdem können generische Hilfsmethoden geschrieben werden die mit Listen umgehen können (z.B. Sort) 4.7 java.lang.Comparable • int compareTo(object o) • int compareTo(T o) • Z.B.: • java.util.Collections • public static <T extends Comparable<? super T>> void sort(List list) 5 Kapselung 5.1 Graphen Bibliothek 5.2 Graphen Bibliothek • Jeder Graph hat Wertereihen • Diese können jedoch von • Unterschiedlichen Quellen • oder unterschiedliche Formate • oder unterschiedliche Darstellungsformen • haben • -> Kapselung der Datenquelle 6 OOP Beispiele Figure 2: 5.3 Graphen Bibliothek • • • • BasicArrayPointList public BasicArrayPointList( double[] x, double[] y ) FilteredPointList implementation that stores large datasets, and selectively filters the output data depending on the displayed range. • RollingPointPairList • A class that provides a rolling list of objects. • This is essentially a first-in-first-out (FIFO) queue with a fixed capacity which allows ‘rolling’ (or oscilloscope like) graphs to be be animated without having the overhead of an ever-growing ArrayList. 5.4 • • • • • • 5.5 Graphen Bibliothek Unterschiedliche Aufgaben Alle halten aber eine Menge von Daten Durch Kapselung und damit Delegation von Aufgaben wird der Code vereinfacht und damit Übersichtlicher Wartbarer Weniger Fehleranfällig Graphen Bibliothek var apl = new AdaptivePointList(batch, AdaptivePointListType.Reference); pointLists.Add(apl); ZedGraph.LineItem curve = graph.AddCurve("Reference", 7 OOP Beispiele new AdaptiveReferenceFilterPointList(apl, -1), Color.Black); 5.6 • • • • • • • 5.7 • • • • • 5.8 • • • • • • • • 5.9 • • • • • • • • Graphen Bibliothek AdaptivePointList Ist in der Lage die Datenbank „batch“ Je nach ausgewähltem Bereich passt sie die Datenbankabfrage an AdaptivePointList implementiert NICHT IPointList AdaptiveReferenceFilterPointList Implementiert IPointList Delegiert Datenabfragen an die zugrundeliegende AdaptivePointList Graphen Bibliothek Was nach außen (aus Sicht des benutzenden Entwicklers) sichtbar ist Nichts! Zum Zeitpunkt der Erstellung der Graphen ist der Datenbankzugriff uninteressant und störend Die Implementierung der AdaptivePointList ist unabhängig von der Erstellung der Graphen Und eine eigene Herausforderung Graphen Bibliothek Hintergrund Der Graph stellt Messwerte dar Diese werden alle 4 Sekunden übertragen Ein Lauf (=Batch) kann bis zu zwei Wochen dauern Es gibt bis zu 32 Kanäle (in der Regel 8) anz_Punkte = (3.60024/4)14*8 = 2.419.200 Messwerte Anz_Punkte_Kanal = (3.60024/4)14 = 302.400 Messwerte max. 1000 Pixel können bei 1280x800 von der Applikation dargestellt werden FuzzyDictionary Fuzzy Undeutlich Unscharf Verschwommen Ein Dictionary in dem mehrere Keys den selben Value zurück liefern können Weitere Ableitung: TimestampList Um an eine Value zu kommen genügt eine ungefähre Zeitangabe von +/- n ms 8 OOP Beispiele 5.10 • • • • • FuzzyDictionary FuzzyDictionary implementiert IDictionary Key/Value wird jedoch in einem FuzzyDictionaryEntry gespeichert Eine sortierte Liste hält alle Tkey/ FuzzyDictionaryEntry Ein Delegate (=Event) implementiert den Vergleichsoperator Dieser bestimmt dann, ob der gegebene Key ungefähr dem gespeicherten Key entspricht 5.11 FuzzyDictionary • TimestampList leitet von FuzzyDictionary ab um Zeitstempel +/- 1 sec. Für gleich zu erklären • Hintergrund: Daten können von mehreren Empfängern, jeder mit eigener Uhr ausgestattet, kommen 5.12 FuzzyDictionary public class TimestampList<T> : FuzzyDictionary<int, ReceiverStatus<T>> where T : ReceiverObject { public TimestampList(int channel) : base(delegate(int a, int b, int w) { return (a - w < b && a + w > b); }, 1000) { this.channel = channel; } public void Enqueue(T obj, int receiver) { if (obj == null) throw new ArgumentNullException("obj"); ReceiverStatus<T> rStatus = null; if (!this.TryGetValue(obj.timestamp, out rStatus)) { rStatus = new ReceiverStatus<T>(channel, obj.timestamp); this.Add(obj.timestamp, rStatus); } rStatus.Enqueue(obj, receiver); 9 OOP Beispiele } ... } Timestamp kann +/- 1 sec unterschied haben 5.13 Beispiel Messdatenerfassung • Messdaten werden von mehreren TCP/IP Sockets erfasst, zusammengefasst, gefiltert und an- schließend in einer Datenbank gespeichert 5.14 • • • • • • 5.15 • • • • • • • • • • Beispiel Messdatenerfassung MySocket Implementiert die Kommunikation zu den Messdaten Erfassungseinheiten (Empfänger/Funk) Reicht die empfangenen Daten mittels Event an den DataLogger DataLogger steuert das Erfassen der Daten DiversityFilter führt die Ergebnisse mehrere Empfänger zu einem Ergebnis zusammen Mehrere Empfänger können ein und den selben Messwert empfangen Beispiel Messdatenerfassung ChannelList, TimestampList, ReceiverList, ReceiverStatus Diese Klassen stellen die Hierarchie der Messwerte dar Filter Bewertet die Messergebnisse und verwirft sie ggf. Speichert diese in eine Datenbank DataService WindowsService + Service Fassade nach außen CalibrationStateMachine Dieses System kann die Messfühler auch Kalibrieren Die Steuerung dieser Aufgabe übernimmt die CalibrationStateMachine 10 OOP Beispiele 5.16 • • • • Beispiel Messdatenerfassung Auch das Erfassen von Messdaten kann komplex sein Ohne Kapselung wäre der SourceCode nicht zu beherrschen und fehleranfällig Die Aufteilung der Klassen ergibt sich aus ihren Aufgaben Ohne der Kapselung der Kommunikation (MySocket) wäre ein gleichzeitiges Abfragen von 2-n Empfängereinheiten nicht möglich 11