Nächste Seite:
Einleitung
Deklarative
(= fortgeschrittene)
Programmierung
Vorlesung
WS 09, WS 10, SS 12, SS 13, SS 14
Johannes Waldmann, HTWK Leipzig
Einleitung
Formen der deklarative Programmierung
Definition
Softwaretechnische Vorteile
Beispiel Spezifikation/Test
Beispiel Verifikation
Beispiel Parallelisierung
Softwaretechnische Vorteile
Deklarative Programmierung in der Lehre
Konzepte und Sprachen
Gliederung der Vorlesung
Softwaretechnische Aspekte
Organisation der LV
Literatur
Übungen
Daten
Wiederholung: Terme
Beispiele: Signatur, Terme
Algebraische Datentypen
Datentyp mit mehreren Konstruktoren
Rekursive Datentypen
Bezeichnungen für Teilterme
Operationen mit (Teil)Termen
Operationen mit Variablen in Termen
Termersetzungssysteme
Termersetzungssysteme als Programme
Konstruktor-Systeme
Übung Terme, TRS
Programme
Funktionale Programme
data
und
case
Peano-Zahlen
Übung Programme
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
Definition, Motivation
Beispiele f. Typkonstruktoren (I)
Beispiele f. Typkonstruktoren (II)
Polymorphe Funktionen
Operationen auf Listen (I)
Operationen auf Listen (II)
Operationen auf Bäumen
Übung Polymorphie
Algebraische Datentypen in OOP
Polymorphie in OO-Sprachen
Beispiel f. dynamische Polymorphie
Kompositum, Wiederholung
Kompositum, Beispiel
Java-Notation f. generische Polymorphie
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
Freie und gebundene Variablen(vorkommen)
Semantik des Lambda-Kalküls
Umbenennung von lokalen Variablen
Lambda-Terme: verkürzte Notation
Ein- und mehrstellige Funktionen
Typen
Beispiele Fkt. höherer Ord.
Lambda-Ausdrücke in C#
Lambda-Ausdrücke in Java(8)
Lambda-Ausdrücke in Javascript
Übung Lambda-Kalkül
Übung Fkt. höherer Ordnung
Rekursionsmuster
Rekursion über Bäume (Beispiele)
Rekursion über Bäume (Schema)
Haskell-Syntax für Komponenten-Namen
Objektinitialisierer in C#
Rekursion über Listen
Rekursionsmuster (Prinzip)
Rekursionsmuster (Merksätze)
Rekursion über Listen (Übung)
Weitere Beispiele für Folds
Rekursionsmuster (Peano-Zahlen)
Übung Rekursionsmuster
Objektorientierte Rekursionsmuster
Plan
Wiederholung Rekursionsschema
Wiederholung: Kompositum
Übung Kompositum
Kompositum und Visitor
Aufgabe: Besucher für Listen
Eine Funktion, die kein Fold ist
Bedarfs-Auswertung
Motivation: Datenströme
Bedarfs-Auswertung, Beispiele
Beispiel Bedarfsauswertung
Strictness
Strictness (Beispiele)
Realisierung der Bedarfsauswertung
Bedarfsauswertung in Scala
Diskussion
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
Streams in Java8
Typklassen
Motivation: Sortieren/Vergleichen)
Motivation: Numerik
Typklassen (Definition, Verwendung)
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
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
Übung Stream-Operationen
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)
Übung LINQ und SQLmetal
Weitere Entwurfsmuster
Überblick
Überblick (II)
Das Fabrik-Muster
Entwurfsmuster: Zustand
Impliziter und expliziter Zustand, Bsp. 1
Impliziter und expliziter Zustand, Bsp. 2
Zustand, Spezifikation, Tests
Zustand in Services
Verhaltensmuster: Beobachter
Beobachter: Beispiel (I)
Beobachter: Beispiel Sudoku, Semantik
Beobachter: Beispiel Sudoku, GUI
Model/View/Controller
Befehl
Kompositum, Wiederholung
Kompositum, Beispiel
Strategie
Strategie (Beispiel II)
Refactoring
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
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)
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
Testklausur KW 18
Übersicht
Datentypen
Termersetzung
Pattern Matching, Rekursion
Rekursionsmuster (Bäume)
Rekursionsmuster (Zahlen)
Über dieses Dokument ...
Johannes Waldmann 2014-07-10