Software Entwicklung 2 – 3
Abstrakte Klassen
bei Handschrift in Klammern einschließen.
sobald eine abstrakte Methode, ist die Klasse als abstrakt zu kennzeichnen.
Interfaces
nicht static (weil static methoden statisch gebunden sind; d.h sie können nicht überschrieben werden)
auch Konstanten erlaubt (eher selten);
Interface Methoden können implementiert oder geerbt werden, durch abstrakte Methoden implementiert werden.
typtest: instanceOf()
in UML <<interface>>
Subclassing vs Subtyping
Subclassing: “Codevererbung”
Subtyping: “Schnittstellenvererbung”; zB Interfaces
Werden verwendet um unverwandte Klassen gleich behandeln zu können.
Interfaces vs. abstrakte Klassen:
Abstrakte Klassen können auch konkrete Methoden und Datenfelder enthalten; Interfaces nicht
Abstrakte Klassen erlauben keine Mehrfachvererbung
Interface compeareTo; negative 0 oder positiv
Interface Comparator; Wenn man Objekete vergleichen will deren Klasse nicht Comparable implementiert.
Interface java.lang.Runnable
Macht eine Klasse zu einem Thread
Algo 1 – 3
Bestandteile des Anfangs- und Endzustands
Vorsicht bei globalen Variablen – side effects.
Eingangs-, Ausgangs- und Übergangsgröße
Übergangsgrößen werden geändert Eingangsgrößen werden benutzt
Ausgangsgrößen werden erzeugt irrelevant, hat in der Spezifikation nichts zu suchen
Dateien als Bestandteile der Schnittstelle
Dateiname
Pfad
Format
Dateistruktur
Satzaaufbau
Feldinhalte: Datentypen, Wertebereiche, Bedeutung
Zustands- und Überführungsschema
Eingabe -> f -> Ausgabe
salopp Eingabe + Funktion = Ausgabe
Aus zwei Teilen ergibt sich der dritte.
Zustandsschema:
statisch
gegebene Eingabe und gewünstche Ausgabe
Wie scheint nicht auf; abstrakt; Implementierer erfüllt Lücke;
schwierig zu spezifizieren (alle zustände sind anzugeben);
z.B: p,q e ℝ; ges.: x…..
wenn Anfangs- und Endzustand gut formal beschrieben werden können; es nur wenige Wege zum ZIeel gibt.
Überführungsschema:
gegebene Eingabe und auszuführende Funktion
dynamisch; Ausgabe ergibt sich aus Funktion
Beschreibt den Weg
oft genauer
Sonderfälle leichter zu erkennen
Gibt Hinweise auf den Lösungsweg
Gefahr der Überspezifikation; Beschränkt Implementierer; kann bessere Lösungswege vereiteln
Beispiel: Lösungsformel quadratische Gleichung
wenn Aktion wichtiger als Ergebnis
In der Praxis oft vermischung der 2 Formen
Abstraktionsgard:
verbal ——————————- formal
Ungangssprache unscharf mathematische Ausdrücken präzise
mehrdeutig eindeutig, widerspruchsfrei
verständlich schwer verständlic
(Hausverstand) (Experten)
ausschweifend knapp
Beispiel
oder: umgangsprachlich (exklusiv), mathematisch(inklusiv)
bei Wind und Regen oder Schnee
Algorithmen mit Gedächtnis
weichen von klassischer Definition ab
Trennung in zwei Funktionen
1. Berechnung des Ergebnisses
2. Berechung des Folgezustands (Zustandsüberführungsfunktion)
Mealy vs Morreautomaten
Wie wird der Anfangszustand eingestellt?
Wie wird der Zustand von Aufruf zu Aufruf gerettet?
statische vs. dynamische Variablen
dynamisch: bei Prozedureintritt erzeugt, danch undefiniert
statisch: bei Porgammstart erzeugt; von Prozeduren unabhängig
lokal vs globale Variablen
lokal: nur in der aktuellen Prozedur bekannt
global: überall bekannt
Dynamische Voribalen sind immer lokal
Globale Variablen sind immer statisch
Lokale Varablen können auch statisch sein.
Lokale statischen Variablen in Jana:
A(….) {
static int x = 0 // Wertzuweisung passiert nur einmal
…
}
Zustandsgrößen in realen Progarmmierprachen (in Jana-Notation dargestellt)
in C, C++ wie in JANA
in Java: außerhalb des Algorithmus in der Klasse
ein privates Gedächtnis nur für einen Algorithmus in Java nicht möglic
(6) Ideal in objektorientierten Sprachen
Algorithemn mit Gedächtnis haben “side effects”
Wirkung Größen, die nicht in der PArameterleste aufscheinen
Reihenfolge der Aufrufe können eine Rolle spielen
if (A()&&B() || !A()&&!B()) {…}
problematisch wenn A() od. B() mit Gedächtnis sind und Zustand wechseln
sicherheitshalber in Variable zwischenspeichern
Komplexität
Komplexität =? Aufwand
Auffasungen in der Informatik: Laufzeit, Seicher, Struktur Komplexität
Hier: Laufzeitkomplexität Laufzeit t = f(n)
n: Problemgröße
n
eine ganze Zahl, charakterisiert den Umfang der Aufgabe
typisch: Menge zu verarbeitender Daten (z.B Länge eines Textes oder Feldes)
bei numerischen Aufgaben auch:
Stellenanzahl von Zahlen
Komplexität eines gegebenen Algorithmus
Wie verhält sich die Laufzeit des Algorithmus in Abhängigkeit von der Problemgröße?
Auch zum Verglich mehrerer Algorithmen:
Welcher ist (für welche Problemgrößen)schneller?
Komplexität eines Problems
Gibt es eine Schranke die nicht unterboten weredn kann?
Laufzeitanalyse
Grobanalyse; Feinanalyse
Grazanalyse ist von Sprache und Maschine unabhängig
Elektronik Vorlesung 3
Grundlagen C
Spannung zwischen zwei Klemmen, Widerstand; Strom fängt zu fließen an; Spannung am Widerstandn sinkt
Q=CU
Kondensator ist die Anordnung; Kapazität ist ..
Einheit ist Farad
Farad ist As/volt ??
i(t) = C * (duc(t)/dt)
An einer Kapazität kann die Spannung nicht springen
100 Prozent geladen ist eine Kapazität erst im unendlichen
Differenzialgleichung
Uq = RC*(duc(t)) /(dt) + uc(t)
-> DGL
Lösungsansatz uc(t) = A*exp(B*t) + D
uc(t = 0) =0
Endbedingung uc(t= undendlich) = Uq Leerlauf
duc(t)/dt = AB*exp(B*t)
Herleitung von uc(t) = -Uq*exp(-t/RC) + Uq = Uq(1-exp……….Prüfungsrelevant
Kapazitäten verantwortilch für beschränkungen in Digtaltechnik (timing, Prozesszr, GHZ) Transistoren haben Kapazität.
Strom identisch beim Laden und Entladen der Kapazität
Kapazität in Serie wie Widerstand parallel
Kapazität prallel wie Widerstand in Serie
MOSFET Transistor
NMOS und PMOS Transistor
p = Löcher ?
n =Elektronen ?
L = Kanallänge
Softwareentwicklung 2 Übung – 2
Dynamische Bindung,
statt super kann man
this.bla = bla; abkürzen
@Override
toString()
hashCode()
equals(Object other)
Eclipse kann hashCode() und equals() erzeugen
protected
zur Übung
Simulation; Prozesse und Ressourcen
worker
private static final long WORKTMME_MIn = 10;
protected Wker(String name) {
super(name);
zlublic void drill() {
wait(rand(WORTIME_MIN, WoRTIMe_MAX”)” “drillingn”)j
}
}
Drilling
exectue() {
Worker machine = requent(Worker.class);
Driller drille = requst(drille.class);
worker.drill
drilll….
KFZ Werkstätte
Reperatur
5-10 Sek
5-10 Mst
120-140 HB,Geselle
5-10 Mst
5-10 Sek
Softwareentwicklung 2 – 2
Vererbung
Baustein wiederverwenden passt nicht genau
programming by difference
vererbt: methoden, felder
nicht vererbt: Konstruktor (man kann aber super callen super(h, m, s))
private Felder werden unsichtbar vererbt
pulic class ClockTimer extents Timer
gleiche Signatur heißt überschreiben
man kann aber super Methode noch aufrufen super.bla(foo) (super.super.bla(foo)) geht nicht
autom. super-calls: wird automatisch eingefügt A() wird immer aufgerufen auch wenn superklasse keinen hat -> Fehler -> Lösung superklasse explizit aufrufen: A(bla,foo,bar)
Datenfelder können überschrieben werden. super.bla kann noch angesprochen werden (überschreiben von feldern ist nicht sinnvoll, lieber andere Namen geben)
protected: etwas lockerer als package, in allen Unterklassen noch sichtbar; Aufhebung des Information Hiding
Klassen kompatibel machen
Vererbung ist transitiv
Vererbung ist eine ist-Beziehung
Vererbung bedeutet Typerweiterung
Vererbung bedeutet Typspezialisierung
static type vs dynamic type
Timer timer = new ClockTimer(0,1,30,12)
Timer = statischer Typ; ist dem Compiler bekannt, bestimmt welchen Elemente der Klasse sichtbar sind
ClockTimer = dynamischer Typ; dem Compiler unbekannt; Bestinmmt welche Methode aufgerufen wird
Typedescriptor; unsichbares Feld; kannn über timer.getClass(); angesprochen werden; Informationen über Klasse
Abrgrage des dynamischen Types zur Laufzeit
instanceof(bla)
Typumwandlung(TypeCast)
(ClockTimer)timer = if (timer instanceof ClocTimer || itmer == null)……
else throw new ClassLastExcetion() //geprüft!
Mehrfach Vererbung
nicht unterstüzt; namenkonflikt; deadly diamond of death, Ineffizienz, komplexe Klassenhirachie
Klasse Object
Basisklasse
Dynamische Bindung
zur Laufzeit wird entschieden welche Methode wirklich aufgerufen wird
Überschriebene Felder werden statisch gebunden
Algo Übung 1 – 1
Darstellungsarten von Algorithmen
Umgangsprache
jeder verstehts; unbegrenzte Ausdrucksmöglichkeiten
nicht eindeutig, schwer umsetzber (kein Complier vorhanden)
Stilistierte Prosa
anandereiung Schritte; nur ein Ende
Aktionen besser erkennbar
Struktur nicht sichtbar
Beispiel
Sieb des Eratosthenes
Prosa:
S1: Initialisierung: Erzeuge Feld sieve[1:n-1] vom Typ boolean und setze ale Werte auf true.
S2: 10ausstraicheen: setzee sieve[1] <- false undsetze i -2
S3: Aussieben: setze alle Felder in sieve, deren index ein Viefaches von i sit (und die kleiner als n sind) aus false
S4: Vorrücken: setze i auf den nächtses index eines Feldes, dessen Inhalt true ist ung gehe zu S3. Is kein weiteres true-Feld vorhanden, gehe zu S5
SR: Ausgabe: durchlaufe das Feld sive und gib jene Indizes i aus, in dessen zugehörgen Felder der Wert true steht
Ablaufdiagramm:
Graphische Darstellung
Symbole (Aktionen)
Pfeile (Steuerfluss)
siehe Folien für Darstellung
Struktugramm
zwingen zur besser Strukturierung
schwer zu erstellen
Algorithmenbeschreibungssprache
Jana
Halbformale Beschreabungsweise
Algorithmus Kopf und Aufruf
Name des Algorithmus
Pfeile für EIngangs-, Ausgangs- und Übergangs-Parameter
….
Programmiersprache
exakt
es kommt auf jedes Symbol an
gute Programmiersprachen erlauben die einfache LEsbarkeit von Algorithmen
Parametiertypen können weggelassen weren falls eindeutig
keine Breakanweisung bei switch
for (i e α) //element
immer int, float
final (für Konstanten)
static (für Gedächtnis)
int[1:n] feld1
int[-2:] größe unbestimmet oberer index k
int feld3[] 0 bis unendlich
type Month =(1..12) nur 1 bis 12 erlaubt
Wichtig für Übung
Lokale Variablen immer deklarieren
Arrays können auch mit char indiziert werden
for – Schleife sehr flexibel // sets definieren
repeat { read(ch eof) } until (eof)
Algo 1 – 2
Abstraktionsschichten
Black Box: von Außen, z.B in der Zukunft zu entwickelnn
Grobstruktur: Lösungsidee
Detail: für Algorithmusanalyse
Black Box
Beispiel Median (sort wird nicht erklärt)
Grobstruktur
sort(liste n) {
for (i=l…n-l) {
Suche das kleineste Element listen[k] in liste [i:n]
Vertausche liste[k] mit liste[i]
}
}
kommt Lösung näher
Veranschaulicht das Verfahren, lässt Implementierungsdetails aus.
Detailsicht
Ausforulierung der informell gehaltenen Teile:
sort(liste n) {
for (i=l..n-l) {
k=i
for (j=i+l…n) {
if (liste[j] < liste [k]) { k = j}
}
liste[k]<-> liste [i] // <-> Vertauschungsauktion
}
}
Welche Abstraktionsschicht für welchen Zwech?
Common Mistake: zu viel Detail am Anfang
Grundregel: so abstrakt wie möglich denken, nicht mehr Details als nötig
Black Box: Betonung des Schnittstellenaspekts; wie soll der Algorithmus benutzt werden; Vision
Grobstruktur: für die ersten Enwurfsschitte; erklären;
Detail: genauer Ablauf, Sprach- oder Maschinendetails
Bestandteile von Algorithmen
Was sind unsere Atome?
for vs while
for- und while-schleife sind sematisch äquivalent.
Semantische Äquivalenz
for- und while-Schleife heißen semantisch äquivalent wenn gleiche Anfangs und Folgezustände.
ZFA -> FS -> ZFE und ZWA -> WS -> ZWE gilt:
………….
switch/case = Kaskade von if
if-Kaskade langsamer
trotzdem semantisch Äquivalent; nur Wirkung zählt
Benötigte Bausteine
1. Elementaraktion
Aktion kann sein:
Zweisung: x = ausdruck
E/A-Anweisung: read(war eof); write(wert)
Ausfruf: sort(liste n)
nichts: {} leere Anweisung
2. Sequenz
Schritte
3. Binäre Verzweigung
Bedingung, ja nein, kommt am Ende wieder zusammen, neinzweige dürfen leer sein
4. Abweisschleife
while Schleife; eso lange Bedingung erfüllt ist, Inhalt 0 oder mehrmals ausgeführt.
D-Diagramm (D nach Dijkstra)
die oben gennanten 4 Bausteine reichen um alle Algorithmen zu formulieren -> Ablaufdiagramme heißen D-Diagramme.
Gegensatz: Spaghetti-Struktur (Sprungmarken)
Beweis (nach Knuth)
Zerlegung in Blöcke, Nummerierung, state,
while sate != 0 – swictch case state 1, state 2 state 3,
jana hat kein break
Eigenschaften
nur noch eine Schleife
einzelne Fälle enthalten nur noch Sequenzen (eventuell binäre Verzweigung am Ende)
Funktiontiert für jeden Algorithmus
Für Praxis nicht geeignet, notfalls für C-Programm mit goto -> Java
?andere Formen: Codeverdopplung
Beispiel: n+1/2 Schleife
while (true) { //endlos
Lesen
if (Ende) {break}
Verarbeiten
}
Codeverdopplung:
Lesen
while (!Ende) {
Verarbeiten
Lesen
}
Unangenehm: schwer zu warten; unlogisch
Schaltervarible:
nochDaten = true
while (nochDaten) {
Lesen
nochDaten =! Ende
if (nochDaten) {Verarbeiten}
}
unangenehm: 2 Prüfungen für nochDaten
Spezifikation
Zweck
Schnittstellenbeschreibung
Aufgabenbeschreibung
….
Spezifikation
Spezifikation | Entwurf Implementierung Test (40 Entwurf, 20 Implementierung, 40 Test)
Dokumentation
mit Lösungsideen anfangen, verennen dokumentieren, testen dokumentieren ausbessern dokumentieren
Spezifikationsdokument (Vertrag)
Was soll eigentlich eentwickelt werden?
Worauf ist zu achten?
Was kann vorausgesetzt werden?
Was gilt als richtig, was als falsch?
Der Begriff “Spezifikation”
Salopp: Aufgabenstellung
Dokument: Anfordungsdefinition, Pflichtenheft
juristisches Doukment
von Vertragspartnern gemeinsam verfasst (Auftraggeber, Entwickler)
Spezifikation Implementierung
Aufgabe – Lösung
WAS? – WIE?
von außen – von innen
Black box – Details
Schnittstellen – Algorithmen
Eigenschaften guter Spezifikation
einfach: kein Farchjargon
eindeutig: verdammt schwierig
vollständig:kein Interpretationsspielraum in wesentlichen Punkten
minimal: kei “Wie” behandeln
Funktionale Anforderungen: Was
NichtFunktionale Anforderungen: Qualitätskriterien
funktionale Anforderungen
Was?
Ausgabe…
bla….
Teile Schnittstellenbeschreibung
Aufrufschnittstelle
Parameter
Systemzustand
Dateien
Geräte
Systemumgebung: welche Klassen dürfen nicht benützt werden?
Benutzerschnittstelle
Programm vs Prozedur
Programm: selbständig ablauffähig; Anwendersicht
Prozedur: bestandteil, nicht ablauffähig;
Schnittstellen von Prozeduren
Aufruf -> Parameter ->Prozedur (liefert Daten zurück)??
Variablen ??l
Dateien <-> Prozedur??
Systemumgeben <-> Prozedur??
…
Prozedur
Aufgabe: stichwortartige Beschreibung (eine Zeile, kurz, pregnant)
Aufruf: Name, Parameter, Funktionswert
Eingangsgrößen: Eingangsparameter mit ihren Datentypen und ihre Bedeutung
Ausgangsgrößen: Ausgangsparameter wie Eingangsgößen
Funktion: wie steheln Eingang und Ausgangsrößen in verbindung
Fehler: was tun bei Fehler?
Folgerungen
ZA muss zur Lösung reichen
Der Algorithums darf sonst nichts ändern
keine Annahmen (ausserhalb der Spezifikation)
idealerweise Sicherheitsprüfung
