Principles of Software Design. Software Engineering Alessio Gambi Saarland University

Similar documents
The Challenge. Principles of Software Design

Maintainable Software. Software Engineering Andreas Zeller, Saarland University

PRINCIPLES OF SOFTWARE DESIGN

Lecture: Modular Design

Patterns of Software Design. Andreas Zeller Saarland University

Object-Oriented Modeling Using UML. CS151 Chris Pollett Aug. 29, 2005.

OO Class Design Principles

Classes and Objects. Object Orientated Analysis and Design. Benjamin Kenwright

The major elements of the object-oriented model

1. Software Systems Complexity, OO Paradigm, UML

OBJECT ORİENTATİON ENCAPSULATİON

Outline. Subtype Polymorphism, Subtyping vs. Subclassing, Liskov Substitution Principle. Benefits of Subtype Polymorphism. Subtype Polymorphism

Making Programs Fail. Andreas Zeller

Learning Objectives. C++ For Artists 2003 Rick Miller All Rights Reserved xli

Chapter 8: Class and Method Design

Software Engineering CSC40232: SOFTWARE ENGINEERING. Guest Lecturer: Jin Guo SOLID Principles sarec.nd.edu/courses/se2017

Today's Agenda. References. Open Closed Principle. CS 247: Software Engineering Principles. Object-Oriented Design Principles

Object- Oriented Design with UML and Java Part I: Fundamentals

CS 520 Theory and Practice of Software Engineering Fall 2017

CS 520 Theory and Practice of Software Engineering Fall 2018

Object-Oriented Programming Concepts

Abstract Data Types (ADT) and C++ Classes

Chapter 5 Object-Oriented Programming

Information System Design (IT60105)

Intro to: Design Principles

Object-Oriented Design

OO Frameworks. Introduction. Using Frameworks

Chapter 1: Principles of Programming and Software Engineering

n HW5 out, due Tuesday October 30 th n Part 1: Questions on material we ll cover today n Part 2: BFS using your graph from HW4

INHERITANCE - Part 1. CSC 330 OO Software Design 1

CSE 70 Final Exam Fall 2009

Object Orientated Analysis and Design. Benjamin Kenwright

CS 370 Design Heuristics D R. M I C H A E L J. R E A L E F A L L

The Unified Modeling Language. Asst.Prof.Dr. Supakit Nootyaskool IT-KMITL

CS 320 Introduction to Software Engineering Spring March 06, 2017

S T R U C T U R A L M O D E L I N G ( M O D E L I N G A S Y S T E M ' S L O G I C A L S T R U C T U R E U S I N G C L A S S E S A N D C L A S S D I A

Object Oriented Programming

CS250 Intro to CS II. Spring CS250 - Intro to CS II 1

Software Engineering

Chapter 10 Classes Continued. Fundamentals of Java

GRASP Design Patterns A.A. 2018/2019

Principles of Object-Oriented Design

Expanding Our Horizons. CSCI 4448/5448: Object-Oriented Analysis & Design Lecture 9 09/25/2011

CMPS 115 Winter 04. Class #10 (2004/02/05) Changes/Review Programming Paradigms Principles of OOD <break> Design Patterns

CHAPTER 5 GENERAL OOP CONCEPTS

Principles of OO Design

Objectives. INHERITANCE - Part 1. Using inheritance to promote software reusability. OOP Major Capabilities. When using Inheritance?

Design Patterns (Composite, Iterator)

Programmazione. Prof. Marco Bertini

Design Engineering. Overview

2D1358 Object Oriented Program Construction in C++ Exercises & Labs. Course Registration / Accounts. Course Literature

1. Write two major differences between Object-oriented programming and procedural programming?

Abstract Classes. Abstract Classes a and Interfaces. Class Shape Hierarchy. Problem AND Requirements. Abstract Classes.

Object-Oriented Design

Index. Index. More information. block statements 66 y 107 Boolean 107 break 55, 68 built-in types 107

CPSC 310: Sample Final Exam Study Questions 2014S1 (These are in addition to the Study Questions listed at the end of some lectures)

Introduction to OO Concepts

Object Oriented Analysis & Design (OOAD)

What are the characteristics of Object Oriented programming language?

INHERITANCE - Part 1. CSC 330 OO Software Design 1

Object Model. Object Orientated Analysis and Design. Benjamin Kenwright

UNIT 3 ARRAYS, RECURSION, AND COMPLEXITY CHAPTER 11 CLASSES CONTINUED

SE 1: Software Requirements Specification and Analysis

OO Techniques & UML Class Diagrams

OBJECT ORIENTED PROGRAMMING

Components vs. Objects

CS 520 Theory and Practice of Software Engineering Fall 2018

An Introduction to Object Orientation

Summary of the course lectures

CSC207 Week 3. Larry Zhang

OO System Models Static Views

CAS 703 Software Design

Chapter 1: Programming Principles

COURSE 2 DESIGN PATTERNS

Welcome to Design Patterns! For syllabus, course specifics, assignments, etc., please see Canvas

OOAD and UML. Prabhudeva S. Assistant professor Department of Computer Science and engineering. J N N C E, Shimoga. Downloaded from

Component-Level Design

Goals of the Lecture OO Programming Principles

Abstraction. Design fundamentals in OO Systems. Fundamental Software Development Principles

In this Lecture you will Learn: Design Patterns. Patterns vs. Frameworks. Patterns vs. Frameworks

INTERNAL ASSESSMENT TEST III Answer Schema

Object-Oriented Design II - GRASP

The Software Design Process. CSCE 315 Programming Studio, Fall 2017 Tanzir Ahmed

CPSC 410? Advanced Software Engineering Mid-term Examination (Term I ) SOLUTION Instructor: Gail Murphy

Use the scantron sheet to enter the answer to questions (pages 1-6)

Object-Oriented Systems Analysis and Design Using UML

LECTURE 3: SOFTWARE DESIGN. Software Engineering Mike Wooldridge

Modularity!! Guidelines for design! in any programming language!

G Programming Languages - Fall 2012

Object-Oriented Languages and Object-Oriented Design. Ghezzi&Jazayeri: OO Languages 1

Object-Oriented Design

S.O.L.I.D: Software Engineering Principles

Java Object Oriented Design. CSC207 Fall 2014

CS 320 Introduction to Software Engineering Spring March

Introduction to Design Patterns

Outline. Outline. 1 Chapter 2: Data Abstraction

Design. Eric McCreath

Design Process Overview. At Each Level of Abstraction. Design Phases. Design Phases James M. Bieman

CHAPTER 9 DESIGN ENGINEERING. Overview

1 Introduction 2 Complex Systems 3 Object Model 4 Dependency Management 5 Class Design. Object Oriented Programming in Physics

Transcription:

Principles of Software Design Software Engineering Alessio Gambi Saarland University

The Challenge Software may live much longer than expected Software must be continuously adapted to a changing environment and requirements Maintenance takes 50 80% of the cost Goal: Make software maintainable and reusable at little or no cost

UML Recap Want a notation to express OO designs UML = Unified Modeling Language a standardized (ISO/IEC 19501:2005), general-purpose modeling language includes a set of graphic notation techniques to create visual models of object-oriented software-intensive systems

Object Model Associations between Objects Abstract Class Abstract Method Squircle {2 * k.radius = r.a = r.b} +set_a() +resize(factor:double) Composition Shape -position: Point = (10, 10) +area(): double +draw() +set_position(position: Point) +get_position(): Point Circle -radius: double = 1 {radius > 0} +area(): double +draw() +set_radius(radius:double) +get_radius(): double Initial Value Constraint Rectangle -a: double = 10 {a > 0} -b: double = 10 {b > 0} +area(): double +draw() +set_a(length:double) +set_b(length:double) +get_a(): double +get_b(): double p1: Professor name = "Phillip" p2: Professor name = "Andreas" Underlined names indicate concrete objects (instances), which have concrete values for their attributes. UML in a Nutshell attends lecture attends lecture attends lecture attends lecture s1: Student name = "Georg" s2: Student name = "Gerda" s3: Student name = "Gustav" s4: Student name = "Grete" resize(factor) s: Squircle r: Rectangle c: Circle State Diagram User new a: a' = a * factor get_a() a set_a(a') set_radius(a' / 2) Not reserved entry / reset() reserve() cancel() [bookedseats == 1] cancel() [bookedseats > 1] partially booked reserve() [availableseats > 1] Sequence Diagram set_a(a') set_b(a') create_flight() cancel_flight() closed close() close() cancel() fully booked reserve() [availableseats == 1]

Principles of object-oriented design Goal: Maintainability and Reusability

Principles of object-oriented design Goal: Maintainability and Reusability

Principles of object-oriented design Abstraction Goal: Maintainability and Reusability

Principles of object-oriented design Abstraction Encapsulation Goal: Maintainability and Reusability

Principles of object-oriented design Abstraction Encapsulation Modularity Goal: Maintainability and Reusability

Principles of object-oriented design Abstraction Encapsulation Modularity Hierarchy Goal: Maintainability and Reusability

Principles of object-oriented design Abstraction Encapsulation Modularity Hierarchy

Abstraction

Concrete Object Abstraction

Abstraction Concrete Object General Principle

Abstraction Highlights common properties of objects Distinguishes important and unimportant properties Must be understood even without a concrete object

Abstraction 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

Perspectives

Example: Sensors

An Engineer s Solution void check_temperature() { // see specs AEG sensor type 700, pp. 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() } }

Abstract Solution typedef float Temperature; typedef int Location; class TemperatureSensor { public: TemperatureSensor(Location); ~TemperatureSensor(); void calibrate(temperature actual); Temperature currenttemperature() const; Location location() const; private: }

Abstract Solution typedef float Temperature; typedef int Location; class TemperatureSensor { public: TemperatureSensor(Location); ~TemperatureSensor(); All implementation details are hidden void calibrate(temperature actual); Temperature currenttemperature() const; Location location() const; private: }

More Abstraction

Principles of object-oriented design Abstraction hide details Encapsulation Modularity Hierarchy

Principles of object-oriented design Abstraction Hide details Encapsulation Modularity Hierarchy

Encapsulation No part of a complex system should depend on internal details of another Goal: keep software changes local Information hiding: Internal details (state, structure, behavior) become the object s secret

Encapsulation 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.

Encapsulation

An active Sensor class ActiveSensor { public: ActiveSensor(Location) ~ActiveSensor(); void calibrate(temperature actual); Temperature currenttemperature() const; Location location() const; void register(void (*callback)(activesensor *)); private: }

An active Sensor class ActiveSensor { public: ActiveSensor(Location) ~ActiveSensor(); called when temperature changes void calibrate(temperature actual); Temperature currenttemperature() const; Location location() const; void register(void (*callback)(activesensor *)); private: }

An active Sensor class ActiveSensor { public: ActiveSensor(Location) ~ActiveSensor(); called when temperature changes void calibrate(temperature actual); Temperature currenttemperature() const; Location location() const; void register(void (*callback)(activesensor *)); private: } Callback management is the sensor s secret

Anticipating Change Features that are anticipated to change should be isolated in specific components Number literals String literals Presentation and interaction

Number literals int a[100]; for (int i = 0; i <= 99; i++) a[i] = 0;

Number literals 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;

Number literals double sales_price = net_price * 1.19;

Number literals double sales_price = net_price * 1.19; final double VAT = 1.19; double sales_price = net_price * VAT;

String literals if (sensor.temperature() > 100) printf( Water is boiling! );

String literals if (sensor.temperature() > 100) printf( Water is boiling! ); if (sensor.temperature() > BOILING_POINT) printf(message(boiling_warning, Water is boiling! );

String literals if (sensor.temperature() > 100) printf( Water is boiling! ); if (sensor.temperature() > BOILING_POINT) printf(message(boiling_warning, Water is boiling! ); if (sensor.temperature() > BOILING_POINT) alarm.handle_boiling();

Principles of object-oriented design Abstraction Hide details Encapsulation Keep changes local Modularity Hierarchy

Principles of object-oriented design Abstraction Hide details Encapsulation Keep changes local Modularity Hierarchy

Modularity Basic idea: Partition a system such that parts can be designed and revised independently ( divide and conquer ) System is partitioned into modules that each fulfil a specific task Modules should be changeable and reuseable independent of other modules

Modularity

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

Module Balance Goal 1: Modules should hide information and expose as little as possible Goal 2: Modules should cooperate and therefore must exchange information These goals are in conflict with each other

Principles of Modularity High cohesion Modules should contain functions that logically belong together Weak coupling Changes to modules should not affect other modules Law of Demeter talk only to friends

High cohesion Modules should contain functions that logically belong together Achieved by grouping functions that work on the same data natural grouping in object oriented design

Weak coupling Changes in modules should not impact other modules Achieved via Information hiding Depending on as few modules as possible

Law of Demeter or Principle of Least Knowledge Basic idea: Assume as little as possible about other modules Approach: Restrict method calls to friends

Call your Friends A method M of an object O should only call methods of 1. O itself 2. M s parameters 3. any objects created in M 4. O s direct component objects

Call your Friends A method M of an object O should only call methods of 1. O itself 2. M s parameters 3. any objects created in M 4. O s direct component objects single dot rule

Demeter: Example 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: Example 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 effects Reduces coupling between modules Disallow direct access to parts Limit the number of accessible classes Reduce dependencies Results in several new wrapper methods ( Demeter transmogrifiers )

Principles of object-oriented design Abstraction Hide details Encapsulation Keep changes local Modularity Control information flow High cohesion weak coupling talk only to friends Hierarchy

Principles of object-oriented design Abstraction Hide details Encapsulation Keep changes local Modularity Control information flow High cohesion weak coupling talk only to friends Hierarchy

Hierarchy Hierarchy is a ranking or ordering of abstractions.

Central Hierarchies

Central Hierarchies has-a hierarchy Aggregation of abstractions A car has three to four wheels

Central Hierarchies has-a hierarchy Aggregation of abstractions A car has three to four wheels is-a hierarchy Generalization across abstractions A turning wheel is a wheel A sport car is a car

Hierarchy principles Open/Close principle Classes should be open for extensions Liskov principle Subclasses should not require more, and not deliver less Dependency principle Classes should only depend on abstractions

Hierarchy principles Open/Close principle Classes should be open for extensions Liskov principle Subclasses should not require more, and not deliver less Dependency principle Classes should only depend on abstractions

Open/Close principle A class should be open for extension, but closed for changes Achieved via inheritance and dynamic binding

An Internet Connection 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) }

Solution with Hierarchies MyApp connect() Connection connect() hangup() ModemConnection connect() hangup() WLANConnection connect() hangup() EthernetConnection connect() hangup()

enum { FUN50, FUN120, FUN240,... } plan; enum { STUDENT, ADAC, ADAC_AND_STUDENT... } special; enum { PRIVATE, BUSINESS,... } customer_type; enum { T60_1, T60_60, T30_1,... } billing_increment; int compute_bill(int seconds) { if (customer_type == BUSINESS) billing_increment = T1_1; else if (plan == FUN50 plan == FUN120) billing_increment = T60_1; else if (plan == FUN240 && contract_year < 2011) billing_increment = T30_1; else billing_increment = T60_60; if (contract_year >= 2011 && special!= ADAC) billing_increment = T60_60; // etc.etc.

Hierarchy Solution Plan year 1 BillingIncrement + units(seconds) Fun50 Fun120 0..* Discount + percentage() T30_1 T1_1 ADAC Student You can add a new plan at any time!

Hierarchy principles Open/Close principle Classes should be open for extensions Liskov principle Subclasses should not require more, and not deliver less Dependency principle Classes should only depend on abstractions

Liskov Substitution Principle An object of a superclass should always be substitutable by an object of a subclass: Same or weaker preconditions Same or stronger postconditions Derived methods should not assume more or deliver less

Circle vs Ellipse Ellipse draw() Circle draw()

Circle vs Ellipse Every circle is an ellipse Ellipse draw() Circle draw()

Circle vs Ellipse Every circle is an ellipse Does this hierarchy make sense? Ellipse draw() Circle draw()

Circle vs Ellipse Every circle is an ellipse Ellipse draw() Does this hierarchy make sense? No, as a circle requires more and Circle draw() delivers less

Circle vs Ellipse Every circle is an ellipse Ellipse draw() Does this hierarchy make sense? No, as a circle requires more and Circle draw() delivers less In geometry a circle is a ellipse. In software, maybe not

Hierarchy principles Open/Close principle Classes should be open for extensions Liskov principle Subclasses should not require more, and not deliver less Dependency principle Classes should only depend on abstractions

Dependency principle A class should only depend on abstractions never on concrete subclasses (dependency inversion principle) This principle can be used to break dependencies

Dependency // 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...

Cyclic Dependency invokes Core +print_to_file() UserPresentation +confirm_loss() invokes Constructing, testing, reusing individual modules becomes impossible!

Dependency // 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...

Depending on Abstraction Core +print_to_file() Presentation +confirm_loss() UserPresentation +confirm_loss() AutomatedPresentation +confirm_loss() ask user return true;

Choosing Abstraction Which is the dominant abstraction? How does this choice impact the remaining system?

Principles of object-oriented design Abstraction Hide details Encapsulation Keep changes local Modularity Control information flow High cohesion weak coupling talk only to friends Hierarchy Order abstractions Classes open for extensions, closed for changes subclasses that do not require more or deliver less depend only on abstractions

Principles of object-oriented design Abstraction Hide details Encapsulation Keep changes local Modularity Control information flow High cohesion weak coupling talk only to friends Hierarchy Order abstractions Classes open for extensions, closed for changes subclasses that do not require more or deliver less depend only on abstractions Goal: Maintainability and Reusability