Nächste Seite:
Einleitung
Deklarative
(= fortgeschrittene)
Programmierung
Vorlesung
WS 09, WS 10, SS 12, SS 13
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
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
Ü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
Quelltextverwaltung
Anwendung, Ziele
Welche Formate?
Daten und Operationen
Zentrale und dezentrale Verwaltung
Versionierung (intern)
Versionierung (extern)
Arbeit mit Zweigen (Branches)
Übernehmen von Änderungen (Merge)
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
Strukturmuster: Kompositum
Kompositum - Definition
Kompositum - Beispiel
Kompositum - Beispiel
Kompositum - Verarbeitung
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
Lambda-Terme: verkürzte Notation
Freie und gebundene Variablen(vorkommen)
Semantik des Lambda-Kalküls
Umbenennung von lokalen Variablen
Ein- und mehrstellige Funktionen
Typen
Beispiele Fkt. höherer Ord.
Lambda-Ausdrücke in C#
Ü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
Testklausur KW 18
Übersicht
Datentypen
Termersetzung
Pattern Matching, Rekursion
Rekursionsmuster (Bäume)
Rekursionsmuster (Zahlen)
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
Zustand, DI, Beobachter, MVC
Entwurfsmuster: Zustand
Impliziter und expliziter Zustand, Bsp. 1
Impliziter und expliziter Zustand, Bsp. 2
Zustand und Spezifikation
Zustand in Services
Dependency Injection
Verhaltensmuster: Beobachter
Beobachter: Beispiel (I)
Beobachter: Beispiel Sudoku, Semantik
Beobachter: Beispiel Sudoku, GUI
Model/View/Controller
javax.swing und MVC
Swing: Datenmodelle
Swing: Bäume
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
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
Über dieses Dokument ...
Johannes Waldmann 2013-06-11