Nächste Seite:
Einleitung
Deklarative
(= fortgeschrittene)
Programmierung
Vorlesung
WS 2009, WS 2010, SS 2012
Johannes Waldmann, HTWK Leipzig
Einleitung
Formen der deklarative Programmierung
Definition
Softwaretechnische Vorteile
Beispiel Spezifikation/Test
Beispiel Verifikation
Beispiel Parallelisierung
Deklarative Programmierung in der Lehre
Konzepte und Sprachen
Gliederung der Vorlesung
Softwaretechnische Aspekte
Organisation der LV
Literatur
Übungen KW11
Daten
Wiederholung: Terme
Algebraische Datentypen
Datentyp mit mehreren Konstruktoren
Rekursive Datentypen
Polymorphe Typen
Termersetzungssysteme
Funktionale Programme
data
und
case
Rekursive Datentypen und Funktionen
Peano-Zahlen
Wiederholung Bäume
Listen
Operationen auf Listen
Algebraische Datentypen in OOP
Strukturmuster: Kompositum
Kompositum - Definition
Kompositum - Beispiel
Kompositum - Beispiel
Kompositum - Verarbeitung
Binäre Bäume als Komposita
Kompositum-Vermeidung
Maybe
=
Nullable
Alg. DT und Pattern Matching in Scala
Funktionen
Funktionen als Daten
Der Lambda-Kalkül
Lambda-Terme: verkürzte Notation
Freie und gebundene Variablen(vorkommen)
Semantik des Lambda-Kalküls
Ein- und mehrstellige Funktionen
Typen
Rekursion über Bäume (Beispiele)
Rekursion über Bäume (Schema)
Rekursion über Listen
Rekursionsmuster (Prinzip)
Rekursion über Listen (Übung)
Weitere Beispiele für Folds
Strukturerhaltende Folds
Programmtransformationen
Programmtransformationen (II)
Objektorientierte Rekursionsmuster
Plan
Wiederholung Rekursionsschema
Wiederholung: Kompositum
Übung Kompositum
Kompositum und Visitor
Aufgabe: Besucher für Listen
Aufgabe: Besucher für Bäume
Unveränderliche Objekte
Überblick
Beispiel: Einfügen in Baum
Beispiel: (unbalancierter) Suchbaum
Beispiel: Sortieren mit Suchbäumen
Persistente Objekte in Git
Objekt-Versionierung in Git
Polymorphie/Typklassen
Einleitung
Der Typ von sort
Instanzen
Typen und Typklassen
Wörterbücher
Wörterbücher (II)
Vergleich Polymorphie
Klassen-Hierarchien
Die Klasse Show
Generische Instanzen (I)
Generische Instanzen (II)
Benutzung von Typklassen bei Smallcheck
Smallcheck--Beispiel
Typgesteuertes Generieren von Werten
Generieren der Größe nach
Kombinatoren für Folgen
Anwendung I: Generierung von Bäumen
Anwendung II: geordnete Bäume
Weitere Werkzeuge zur Testfallgenerierung
Übung Typklassen und Smallcheck
Bedarfs-Auswertung
Motivation: Datenströme
Bedarfs-Auswertung, Beispiele
Bedarfsauswertung in Haskell
Strictness
Bedarfsauswertung in Scala
Primzahlen
Rekursive Stream-Definitionen
Die Thue-Morse-Folge
Traversieren
OO-Simulation v. Bedarfsauswertung
Motivation (Wdhlg.)
Iterator (Java)
Beispiele Iterator
Beispiel Iterator Java
Enumerator (C#)
Iteratoren mit yield
Aufgaben Iterator C#
Streams in C#: funktional, Linq
Fkt. höherer Ord. für Streams
Motivation
Strom-Operationen
Strom-Transformationen (1)
Strom-Transformationen (2)
Strom-Transformationen (3)
Strom-Verbraucher
Zusammenfassung: C#(Linq) (Semantik)
Linq-Syntax (type-safe SQL)
Linq und Parallelität
Iterierte assoziative Operationen
Map/Reduce-Algorithmen
Map-Reduce: Literatur
Serialisierung, Persistenz
Motivation
Typisierung von Daten
Ansätze
Enterprise Java Beans
DB-Anfragen in Java EE
Noch mehr Sprachen: HTML, Javascript
LINQ und SQLmetal (1)
LINQ und SQLmetal (2)
Refactoring (KW23)
Definition
Refactoring: Herkunft
Refactoring anwenden
Refaktorisierungen
Guter und schlechter Code
Für wen schreibt man Code?
Code Smell # 1: Duplicated Code
Duplicated Code
→
Schablonen
Plan
Klassen-Entwurf
Primitive Daten (
primitive obsession
)
Verwendung von Daten: Datenklumpen
Datenklumpen--Beispiel
Verwendung von Daten: Data Class
Mehrfachverzweigungen
Das Fabrik-Muster
null-Objekte
Typsichere Aufzählungen
Refactoring (KW24)
Vererbung bricht Kapselung
Vererbung bricht Kapselung
Immutability
Immutability
Zustandsänderungen
Code smell: Temporäre Attribute
Code-Größe und Komplexität
Benannte Abstraktionen
Name enthält Typ
Refaktorisierung von Ausdrücken
Refaktorisierung durch Funktionen
Refaktorisierung durch Prozeduren
Richtig refaktorisieren
Aufgaben zu Refaktoring (I)
Aufgaben zu Refaktoring (II)
Aufgaben zu Refaktoring (II)
Testklausur KW 25
Übersicht
Datentypen
Pattern Matching
Rekursionsmuster
(Un)veränderliche Objekte
Datenströme
LINQ
Verfrühte Optimierung ...
...ist die Quelle allen Übels
Sprüche zur Optimierung
Rekursion ist teuer? Falsch!
Java ist langsam? Falsch!
Array-Index-Prüfungen sind teuer? Falsch!
Lokale Variablen sind teuer? Falsch!
Weitere Diskussionen
Über dieses Dokument ...
Johannes Waldmann 2012-06-25