OOP Beispiele - inf-swe

Werbung
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
Herunterladen