Prinzipien des Software-Entwurfs. Software-Praktikum, Sommer 2015 Andreas Zeller Universität des Saarlandes



Ähnliche Dokumente
Software-Design. Programmierstile. Chaos Fortran Algol ( ) Chaotisch Prozedural Modular Objektorientiert. Daten. Programme teilen sich Daten

Prinzipien des Software-Entwurfs. Problem. Programmierstile

Prinzipien des Software-Entwurfs. Checkliste Grobentwurf. Checkliste Feinentwurf

Client-Server-Beziehungen

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

SEP 114. Design by Contract

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Objektorientierte Programmierung OOP

Objektorientierte Programmierung

Fassade. Objektbasiertes Strukturmuster. C. Restorff & M. Rohlfing

Programmieren in Java

Tagesprogramm

Vorkurs C++ Programmierung

Vererbung & Schnittstellen in C#

Prinzipien Objektorientierter Programmierung

Assoziation und Aggregation

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

Java: Vererbung. Teil 3: super()

arlanis Software AG SOA Architektonische und technische Grundlagen Andreas Holubek

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Client-Server Beziehungen

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Software Engineering Interaktionsdiagramme

Java Kurs für Anfänger Einheit 5 Methoden

Programmieren Tutorium

Objektorientierte Programmierung

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Whitebox-Vererbung vs. Blackbox-Vererbung. - Begriffsbestimmung - Vererbung öffentliche Vererbung private Vererbung - Zusammenfassung

Klassenbeziehungen & Vererbung

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Softwaretechnik (Allgemeine Informatik) Überblick

SDD System Design Document

How to do? Projekte - Zeiterfassung

Objektbasierte Entwicklung

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Programmierkurs Java

VBA-Programmierung: Zusammenfassung

3. Konzepte der objektorientierten Programmierung

Design Patterns 2. Model-View-Controller in der Praxis

5. Abstrakte Klassen

Grundzüge der Programmierung. Konzepte der objektorientierten Programmierung (oop) OBJEKTE - KLASSEN

Software Engineering Klassendiagramme Assoziationen

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Albert HAYR Linux, IT and Open Source Expert and Solution Architect. Open Source professionell einsetzen

Objektorientierte Programmierung. Kapitel 12: Interfaces

Typumwandlungen bei Referenztypen

OO Softwareentwicklung

Objektorientierter Software-Entwurf Grundlagen 1 1. Analyse Design Implementierung. Frühe Phasen durch Informationssystemanalyse abgedeckt

Testen mit JUnit. Motivation

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

ERPaaS TM. In nur drei Minuten zur individuellen Lösung und maximaler Flexibilität.

EinfÅhrung in die objektorientiere Programmierung (OOP) unter Delphi 6.0. EDV Kurs 13/2

Objektorientiertes JavaScript

Vermeiden Sie es sich bei einer deutlich erfahreneren Person "dranzuhängen", Sie sind persönlich verantwortlich für Ihren Lernerfolg.

Selbststudium OOP4 Auftrag

Java Einführung Abstrakte Klassen und Interfaces

SWE5 Übungen zu Software-Engineering

SharePoint Demonstration

Einführung in die Programmierung

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Grundlagen von Python

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Probeklausur Softwareengineering SS 15

Klassendiagramm. (class diagram)

Factory Method (Virtual Constructor)

Kommunikations-Parameter

RIGGTEK. Dissolution Test Systems. DissoPrep Browser-Interface

.NET Code schützen. Projekt.NET. Version 1.0

Software-Entwurfsmuster

Klassendefinitionen verstehen

Übungsklausur vom 7. Dez. 2007

Kapitel 6. Vererbung

Theoretische Grundlagen des Software Engineering

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Kapitel 6. Vererbung

Software-Engineering

Eclipse Equinox als Basis für Smart Client Anwendungen. Christian Campo, compeople AG, Java Forum Stuttgart 2007

Cad-OasEs Int. GmbH. 20 Jahre UG/NX Erfahrung prägen Methodik und Leistungen. Nutzen Sie dieses Wissen!

Algorithmen & Datenstrukturen 1. Klausur

Software Maintenance - Musterlösung zum Übungsblatt 1

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Internet Explorer Version 6

Software Engineering. Sommersemester 2012, Dr. Andreas Metzger

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Kleines Handbuch zur Fotogalerie der Pixel AG

Grundlagen der Informatik für Ingenieure I

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Installation der SAS Foundation Software auf Windows

Graphic Coding. Klausur. 9. Februar Kurs A

Das Pflichtenheft. Dipl.- Ing. Dipl.-Informatiker Dieter Klapproth Ains A-Systemhaus GmbH Berlin

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

3 Objektorientierte Konzepte in Java

Delegatesund Ereignisse

Powermanager Server- Client- Installation

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Step by Step Webserver unter Windows Server von Christian Bartl

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Transkript:

Prinzipien des Software-Entwurfs Software-Praktikum, Sommer 2015 Andreas Zeller Universität des Saarlandes

Problem Software lebt oft sehr viel länger als ursprünglich geplant Software muss beständig angepasst werden Anteil Wartungskosten 50 80% Hauptziel: Software änderbar und wiederverwendbar machen bei geringem Risiko und niedrigen Kosten.

Programmierstile Chaotisch Prozedural Modular Objektorientiert

Chaos Fortran Algol (1954 1958) Daten Programme teilen sich Daten

Prozeduren Fortran Algol Cobol Lisp (1959 1961) Daten Unterprogramme mit Parametern

Module PL/1 Algol 68 Pascal Modula Simula (1962 1970) Daten Daten

Objekte Smalltalk C++ Ada Eiffel Java (1980 ) Schnittstelle Zustand Methoden

Übersicht Generation Kontrolle Daten chaotisch beliebig beliebig prozedural Prozedur beliebig modular Prozedur Modul objektorientiert Methode Objekt außerdem: logikbasiert, regelbasiert, constraintbasiert, funktional

Grundprinzipien des objektorientierten Modells Abstraktion Einkapselung Modularität Hierarchie Ziel: Änderbarkeit + Wiederverwendbarkeit

Grundprinzipien des objektorientierten Modells Abstraktion Einkapselung Modularität Hierarchie

Abstraktion Konkretes Objekt Allgemeines Prinzip

Abstraktion Hebt gemeinsame Eigenschaften von Objekten hervor Unterscheidet zwischen wichtigen und unwichtigen Eigenschaften Muss unabhängig von Objekten verstanden werden können

Abstraktion An abstraction denotes the essential characteristics of an object that distinguish it from all other kinds of objects and thus provide crisply defined conceptual boundaries, relative to the perspective of the viewer

Blickwinkel

Beispiel: Sensoren

Ingenieurs-Lösung void check_temperature() { // vgl. Dokumentation AEG-Sensor Typ 700, S. 53 short *sensor = 0x80004000; short *low = sensor[0x20]; short *high = sensor[0x21]; int temp_celsius = low + high * 256; if (temp_celsius > 50) { turn_heating_off() } }

Abstrakte Lösung typedef float Temperature; typedef int Location; class TemperatureSensor { public: TemperatureSensor(Location); ~TemperatureSensor(); Alle Details der Implementierung bleiben versteckt void calibrate(temperature actual); Temperature currenttemperature() const; Location location() const; private: }

Abstraktion anders

Grundprinzipien des objektorientierten Modells Abstraktion Details verstecken Einkapselung Modularität Hierarchie

Grundprinzipien des objektorientierten Modells Abstraktion Details verstecken Einkapselung Modularität Hierarchie

Einkapselung Kein Teil eines komplexen Systems soll von internen Details eines anderen abhängen Ziel: Änderungen vereinfachen Geheimnisprinzip: Die internen Details (Zustand, Struktur, Verhalten) werden zum Geheimnis eines Objekts

Einkapselung Encapsulation is the process of compartmentalizing the elements of an abstraction that constitute its structure and its behavior; encapsulation serves to separate the contractual interface of an abstraction and its implementation.

Einkapselung

Aktiver Sensor class ActiveSensor { public: ActiveSensor(Location) ~ActiveSensor(); wird aufgerufen, wenn sich Temperatur ändert void calibrate(temperature actual); Temperature currenttemperature() const; Location location() const; void register(void (*callback)(activesensor *)); private: } Verwaltung der Callbacks ist Geheimnis des Sensors

Antizipation des Wandels Eigenschaften, die sich vorhersehbar ändern, sollten in spezifischen Komponenten isoliert werden. Zahlen-Literale String-Literale Präsentation und Interaktion

Zahlen-Literale int a[100]; for (int i = 0; i <= 99; i++) a[i] = 0; const int SIZE = 100; int a[size]; for (int i = 0; i < SIZE; i++) a[i] = 0; const int ONE_HUNDRED = 100; int a[one_hundred];

Zahlen-Literale double brutto = netto * 1.19; final double MWST = 1.19; double brutto = netto * MWST;

String-Literale if (sensor.temperature() > 100) printf( Wasser kocht! ); if (sensor.temperature() > BOILING_POINT) printf(message(boiling_warning, Wasser kocht! ); if (sensor.temperature() > BOILING_POINT) alarm.handle_boiling();

Grundprinzipien des objektorientierten Modells Abstraktion Details verstecken Einkapselung Änderungen lokal halten Modularität Hierarchie

Grundprinzipien des objektorientierten Modells Abstraktion Details verstecken Einkapselung Änderungen lokal halten Modularität Hierarchie

Modularität Grundidee: Teile isoliert betrachten, um Komplexität in den Griff zu bekommen ( Teile und Herrsche ) Programm wird in Module aufgeteilt, die speziellen Aufgaben zugeordnet sind Module sollen unabhängig von anderen geändert und wiederverwendet werden können

Modularität

Modularität Modularity is the property of a system that has been decomposed into a set of cohesive and loosely coupled modules.

Modul-Balance Ziel 1: Module sollen Geheimnisprinzip befolgen und so wenig nach außen dringen lassen, wie möglich Ziel 2: Module sollen zusammenarbeiten und hierfür müssen sie Informationen austauschen Diese Ziele stehen im Konflikt zueinander

Modul-Prinzipien Hohe Kohäsion Module sollen logisch zusammengehörige Funktionen enthalten Schwache Kopplung Änderungen in Modulen sollen sich nicht auf andere Module auswirken Demeter-Prinzip nur mit Freunden reden

Hohe Kohäsion Module sollen logisch zusammengehörige Funktionen enthalten Erreicht man durch Zusammenfassen der Funktionen, die auf denselben Daten arbeiten Bei objektorientierter Modellierung natürliche Zusammenfassung

Schwache Kopplung Änderungen in Modulen sollen sich nicht auf andere Module auswirken Erreicht man durch Geheimnisprinzip Abhängigkeit zu möglichst wenig Modulen

Demeter-Prinzip Grundidee: So wenig wie möglich über Objekte und ihre Struktur annehmen Verfahren: Methodenaufrufe auf Freunde beschränken

Zugelassene Aufrufe Eine Methode sollte nur Methoden folgender Objekte aufrufen: 1. des eigenen Objekts 2. ihrer Parameter 3. erzeugter Objekte 4. direkte Teile des eigenen Objekts single dot rule

Demeter: Beispiel class Uni { Prof boring = new Prof(); public Prof getprof() { return boring; } public Prof getnewprof() { return new Prof(); } } class Test { Uni uds = new Uni(); public void one() { uds.getprof().fired(); } public void two() { uds.getnewprof().hired(); } }

Demeter: Beispiel class Uni { Prof boring = new Prof(); public Prof getprof() { return boring; } public Prof getnewprof() { return new Prof(); } public void fireprof(...) {... } } class BetterTest { Uni uds = new Uni(); public void betterone() { uds.fireprof(...); } }

Demeter-Prinzip Reduziert Kopplung zwischen Modulen Verhindert direkten Zugang zu Teilen Beschränkt verwendbare Klassen Verringert Abhängigkeiten Sorgt für zahlreiche neue Methoden

Grundprinzipien des objektorientierten Modells Abstraktion Details verstecken Einkapselung Änderungen lokal halten Modularität Informationsfluss kontrollieren Hohe Kohäsion Schwache Kopplung nur mit Freunden reden Hierarchie

Grundprinzipien des objektorientierten Modells Abstraktion Details verstecken Einkapselung Änderungen lokal halten Modularität Informationsfluss kontrollieren Hohe Kohäsion Schwache Kopplung nur mit Freunden reden Hierarchie

Hierarchie Hierarchy is a ranking or ordering of abstractions.

Wichtige Hierarchien hat -Hierarchie Aggregation von Abstraktionen Ein Auto hat drei bis vier Räder ist-ein -Hierarchie Verallgemeinerung über Abstraktionen Ein ActiveSensor ist ein TemperatureSensor

Wichtige Hierarchien hat -Hierarchie Aggregation von Abstraktionen Ein Auto hat drei bis vier Räder ist-ein -Hierarchie Verallgemeinerung über Abstraktionen Ein ActiveSensor ist ein TemperatureSensor

Hierarchie-Prinzipien Open/Close-Prinzip Klassen sollten offen für Erweiterungen sein Liskov-Prinzip Unterklassen sollten nicht mehr verlangen, und nicht weniger liefern Abhängigkeits-Prinzip Abhängigkeiten sollten nur zu Abstraktionen bestehen

Hierarchie-Prinzipien Open/Close-Prinzip Klassen sollten offen für Erweiterungen sein Liskov-Prinzip Unterklassen sollten nicht mehr verlangen, und nicht weniger liefern Abhängigkeits-Prinzip Abhängigkeiten sollten nur zu Abstraktionen bestehen

Open/Close-Prinzip Eine Klasse sollte offen für Erweiterungen, aber geschlossen für Änderungen sein Wird durch Vererbung und dynamische Bindung erzielt

Ein Internet-Anschluss void connect() { if (connection_type == MODEM_56K) { Modem modem = new Modem(); modem.connect(); } else if (connection_type == ETHERNET) else if (connection_type == WLAN) else if (connection_type == UMTS) }

Lösung mit Hierarchien MyApp connect() Connection connect() hangup() ModemConnection connect() hangup() WLANConnection connect() hangup() EthernetConnection connect() hangup()

enum { FUN50, FUN120, FUN240,... } tarif; enum { STUDENT, ADAC, ADAC_UND_STUDENT... } spezial; enum { PRIVAT, BUSINESS,... } kundentyp; enum { T60_1, T60_60, T30_1,... } taktung; int rechnungsbetrag(int sekunden) { if (kundentyp == BUSINESS) taktung = T1_1; else if (tarif == FUN50 tarif == FUN120) taktung = T60_1; else if (tarif == FUN240 && vertragsjahr < 2006) taktung = T30_1; else taktung = T60_60; if (vertragsjahr >= 2006 && spezial!= ADAC) taktung = T60_60; // usw. usf.

Lösung mit Hierarchien Tarif jahr 1 Taktung + einheiten(sekunden) Fun50 Fun120 0..* Rabatt + prozent() T30_1 T1_1 ADAC Student Neue Rabattstufen, Tarife, etc. können jederzeit hinzugefügt werden!

Hierarchie-Prinzipien Open/Close-Prinzip Klassen sollten offen für Erweiterungen sein Liskov-Prinzip Unterklassen sollten nicht mehr verlangen, und nicht weniger liefern Abhängigkeits-Prinzip Abhängigkeiten sollten nur zu Abstraktionen bestehen

Liskov-Prinzip Eine Unterklasse sollte stets an Stelle der Oberklasse treten können: Gleiche oder schwächere Vorbedingungen Gleiche oder stärkere Nachbedingungen Abgeleitete Methoden sollten nicht mehr erwarten und nicht weniger liefern.

Kreis vs. Ellipse Jeder Kreis ist eine Ellipse Ellipse draw() Ist diese Hierarchie sinnvoll? Nein, da ein Kreis mehr erwartet und Circle draw() weniger liefert

Hierarchie-Prinzipien Open/Close-Prinzip Klassen sollten offen für Erweiterungen sein Liskov-Prinzip Unterklassen sollten nicht mehr verlangen, und nicht weniger liefern Abhängigkeits-Prinzip Abhängigkeiten sollten nur zu Abstraktionen bestehen

Abhängigkeits-Prinzip Abhängigkeiten sollten nur zu Abstraktionen bestehen nie zu konkreten Unterklassen (dependency inversion principle) Dieses Prinzip kann gezielt eingesetzt werden, um Abhängigkeiten zu brechen

Abhängigkeit // Print current Web page to FILENAME. void print_to_file(string filename) { if (path_exists(filename)) { // FILENAME exists; // ask user to confirm overwrite bool confirmed = confirm_loss(filename); if (!confirmed) return; } } // Proceed printing to FILENAME...

Zyklische Abhängigkeit invokes Core +print_to_file() UserPresentation +confirm_loss() invokes Konstruktion, Test, Wiederverwendung einzelner Module werden unmöglich!

Abhängigkeit // Print current Web page to FILENAME. void print_to_file(string filename, Presentation *p) { if (path_exists(filename)) { // FILENAME exists; // ask user to confirm overwrite bool confirmed = p->confirm_loss(filename); if (!confirmed) return; } } // Proceed printing to FILENAME...

Abhängigkeit von der Abstraktion Core +print_to_file() Presentation +confirm_loss() UserPresentation +confirm_loss() AutomatedPresentation +confirm_loss() ask user return true;

Wahl der Abstraktion Welche ist die dominante Abstraktion? Wie wirkt sich die Wahl auf den Rest des Systems aus?

Hierarchie-Prinzipien Open/Close-Prinzip Klassen sollten offen für Erweiterungen sein Liskov-Prinzip Unterklassen sollten nicht mehr verlangen, und nicht weniger liefern Abhängigkeits-Prinzip Abhängigkeiten sollten nur zu Abstraktionen bestehen

Grundprinzipien des objektorientierten Modells Abstraktion Details verstecken Einkapselung Änderungen lokal halten Modularität Informationsfluss kontrollieren Hohe Kohäsion Schwache Kopplung nur mit Freunden reden Hierarchie Abstraktionen ordnen Klassen offen für Erweiterungen, geschlossen für Änderungen Unterklassen, die nicht mehr verlangen und nicht weniger liefern Abhängigkeiten nur zu Abstraktionen

Grundprinzipien des objektorientierten Modells Abstraktion Details verstecken Einkapselung Änderungen lokal halten Modularität Informationsfluss kontrollieren Hohe Kohäsion Schwache Kopplung nur mit Freunden reden Hierarchie Abstraktionen ordnen Klassen offen für Erweiterungen, geschlossen für Änderungen Unterklassen, die nicht mehr verlangen und nicht weniger liefern Abhängigkeiten nur zu Abstraktionen Ziel: Änderbarkeit + Wiederverwendbarkeit