Nächste Seite:
Einleitung
Softwaretechnik II
Vorlesung
Sommersemester 2004,..., 2011
Johannes Waldmann, HTWK Leipzig
Einleitung
Programme und Softwaresysteme
Software ist schwer zu entwickeln
Produktivität
Inhalt
Material
Organisation
Leistungen:
The Pragmatic Programmer
Lernen! Lernen! Lernen!
Regelmäßig investieren
Übung KW 11
Fred Brooks: The Mythical Man Month
Edsger W. Dijkstra über Softwaretechnik
Was macht diese Funktion?
Schnittstellen
Beispiele (,,real life``)
Schnittstellen und -Vererbung in der Mathematik
Schnittstellen von abstrakten Datentypen
Benutzerschnittstellen
Schnittstellen und Code-Eigenschaften
Schnittstellen und Entwurf
Schnittstellen (interfaces) in Java
Literatur zu Schnittstellen
Komponenten und Schnittstellen
Schrittweise Verfeinerung
Schnittstellen (Interfaces) in Java
Überprüfen von Software-Eigenschaften
Abstrakte Datentypen
Abstrakter Datentyp Menge
Generische Polymorphie
Generische Polymorphie (II)
ADTs in der Mathematik
Beispiel für Spezifikation
Logik (Wiederholung)
Aussagenlogik (Syntax)
Aussagenlogik (Semantik)
Aussagenlogik (Eigenschaften)
Prädikatenlogik (Signatur)
Prädikatenlogik (Terme)
Prädikatenlogik (Formeln)
Prädikatenlogik (Bindungen)
Prädikatenlogik (Strukturen)
Prädikatenlogik (Semantik - Terme)
Prädikatenlogik (Semantik - Formeln)
Quantoren
Tests
Definition, Motivation
Tests und Schnittstellen
JUnit
NUnit
Entwurfsmuster: allgemein
Entwurfsmuster
Beispiel zu Entwurfsmustern
Beispiel: Strukturmuster: Kompositum
Beispiel: Verhaltensmuster: Strategie
Beispiel: Strukturmuster: Dekorierer
Beispiel: Erzeugungsmuster: (abstrakte) Fabrik
Beispiel: Verhaltensmuster: Befehl
Wie Entwurfsmuster Probleme lösen
Vorlage: Muster in der Architektur
Algebraische Datentypen (Komposita)
Strukturmuster: Kompositum
Kompositum - Anwendung
Signaturen und Algebren
Termalgebra (Bäume)
Algebraische Datentypen
Entwurfsfragen bei Bäumen
Benutzung Algebr. Datentypen
Pattern Matching
Beispiel: Scala
Maybe
=
Nullable
Entweder--Oder
Listen (einfach verkettet)
Verifikation von funktionalen Programmen
Listen in Haskell
Peano-Zahlen
Rekursionsmuster
Verhaltensmuster: Besucher
Rekursion über Bäume (Beispiele)
Rekursion über Bäume (Schema)
Rekursion über Listen
Rekursionsmuster (Prinzip)
Rekursion über Listen (Übung)
Fold/Besucher in C#
Besucher-Muster für Bäume
Beispiel: Baum-Besucher
Datenströme (Iteratoren)
Verhaltensmuster: Iterator
Unendliche Datenstrukturen
Rechnen mit Streams
Iterator (Java)
Beispiele Iterator
Beispiel Iterator Java
Enumerator (C#)
Iteratoren mit yield
Aufgaben Iterator C#
Streams in C#: funktional, Linq
Befehl, Strategie, Interpreter
Befehl
Strategie
Strategie (Beispiel II)
Funktionen höherer Ordnung (I)
Funktionen höherer Ordnung (II)
Muster: Interpreter (Motivation)
Muster: Interpreter (Realisierung)
Interpreter in FP
Query-Sprachen
Hibernate Criteria Query API
Linq in C#
Zustand, DI, Beobachter, MVC
Entwurfsmuster: Zustand
Zustand (Beispiel)
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
Quelltextverwaltung
Anwendung, Ziele
Welche Formate?
Daten und Operationen
Versionierung (intern)
Objekt-Versionierung in Git
Versionierung (extern)
Arbeit mit Zweigen (Branches)
Übernehmen von Änderungen (Merge)
LCS
Die Einbettungs-Relation
Die Einbettungs-Relation (II)
Die Einbettungs-Relation (III)
LCS -- naiver Algorithmus (exponentiell)
LCS -- wie besser?
LCS -- bottom-up (quadratisch)
+
Übung
Produktqualität (I)
Klassifikation der Verfahren
Fehlermeldungen
Testen und Schnittstellen
Dynamische Tests
Programmablauf-Tests
Prüfen von Testabdeckungen
Übung Profiling (C++)
Profiling (Java)
Dynamische Tests: Black/White
Black-Box-Tests
Probleme mit GUI-Tests
Mischformen
Testen mit JUnit
JUnit und Extreme Programming
Delta Debugging
Delta Debugging (II)
Refactoring
Herkunft
Refaktoring: Definition
Refactoring anwenden
Refaktorisierungen
Code Smell # 1: Duplicated Code
Duplicated Code
→
Schablonen
Size does matter
Primitive Daten (
primitive obsession
)
Typsichere Aufzählungen
Verwendung von Daten: Datenklumpen
Datenklumpen--Beispiel
Verwendung von Daten: Data Class
Aufgabe Refactoring
Temporäre Attribute
Nichtssagende Namen
Name enthält Typ
Programmtext
Größe und Komplexität
Mehrfachverzweigungen
null-Objekte
Richtig refaktorisieren
Aufgaben zu Refaktoring (I)
Aufgaben zu Refaktoring (II)
Aufgaben zu Refaktoring (II)
Class Design
Klassen-Entwurf
Mehrfachverzweigungen
null-Objekte
Das Fabrik-Muster
Immutability
Immutability
Vererbung bricht Kapselung
Vererbung bricht Kapselung
Testfragen
Hinweis
Testfragen
Über dieses Dokument ...
Johannes Waldmann 2011-07-07