Software Design Principles

Slides:



Advertisements
Similar presentations
Chapter 11 Component-Level Design
Advertisements

CS 350 – Software Design The Bridge Pattern – Chapter 10 Most powerful pattern so far. Gang of Four Definition: Decouple an abstraction from its implementation.
INTERFACES IN JAVA 1.Java Does not support Multiple Inheritance directly. Multiple inheritance can be achieved in java by the use of interfaces. 2.We need.
1 Object-Oriented Reengineering © R. Marinescu Lecture 5 Radu Marinescu Principles of Object-Oriented Design.
General OO Concepts and Principles CSE301 University of Sunderland Harry R. Erwin, PhD.
Lecture 9 Improving Software Design CSC301-Winter 2011 – University of Toronto – Department of Computer Science Hesam C. Esfahani
SOLID Object Oriented Design Craig Berntson
5/17/2015 OO Design: Liskov Substitution Principle 1.
Testing and Inheritance What is the relation between the test suite of a superclass and a subclass?
Inheritance and object compatibility Object type compatibility An instance of a subclass can be used instead of an instance of the superclass, but not.
CSE115: Introduction to Computer Science I Dr. Carl Alphonce 219 Bell Hall Office hours: M-F 11:00-11:
More Inheritance and LSP CS340100, NTHU Yoshi. More about Inheritance Reuse? – Q1: 你有沒有程式 ” 砍掉重練 ” 的經驗 ? – Q2: 你有沒有 ” 再造輪子 ” 的經驗 ? class Rectangle – Firstly,
Lecture 17 Abstract classes Interfaces The Comparable interface Event listeners All in chapter 10: please read it.
Chapter 8, Object Design: Reuse and Patterns Qutaibah Malluhi Software Engineering Qatar University Based on slides by Bernd Bruegge & Allen H. Dutoit.
Inheritance (notes for 10/26 lecture). Inheritance Inheritance is the last of the relationships we will study this semester. Inheritance is (syntactically)
Developed by Reneta Barneva, SUNY Fredonia Component Level Design.
CSc 335: Three More OO Design Principles
1 OO Design Principles Project Group eXtreme Programming Md. Abul Bashar 07/09/2004.
CLASS DESIGN PRINCIPLES Lecture 2. The quality of the architecture What is a good design? It is the design that at least does not have signs of “bad”.
1 OO Design Novosoft, 2001 by V. Mukhortov. 2 OO Design Goals  Flexibility Changes must be localized  Maintainability Modules requiring changes can.
Ch:10 Component Level Design Unit 4. What is Component? A component is a modular building block for computer software Because components reside within.
Company Confidential – Do Not Duplicate 2 Copyright 2008 McLane Advanced Technologies, LLC S.O.L.I.D. Software Development Achieving Object Oriented Principles,
Principles of Object-Oriented Design SEI, SJTU WEB APPS and SERVICES.
Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()
Object Orientation Yaodong Bi, Ph.D. Department of Computer Sciences University of Scranton October 18, 2015October 18, 2015October 18, 2015.
© 2004 Capgemini - All rights reserved SOLID - OO DESIGN PRINCIPLES Andreas Enbohm, Capgemini.
Chapter 9 Object-Oriented Software Development F Software Development Process F Analyze Relationships Among Objects F Class Development F Class Design.
Introduction to SOLID Principles. Background Dependency Inversion Principle Single Responsibility Principle Open/Closed Principle Liskov Substitution.
Class Design III: Advanced Inheritance Additional References “Object-Oriented Software Development Using Java”, Xiaoping Jia, Addison Wesley, 2002 “Core.
S.O.L.I.D. Software Development 12 January 2010 (Martin Verboon, Patrick Kalkman, Stan Verdiesen)
SWE © Solomon Seifu ELABORATION. SWE © Solomon Seifu Lesson 12-5 Software Engineering Design Goals.
Design Principles iwongu at gmail dot com.
OO as a language for acm l OO phrase l Mental model of key concepts.
1 Single Responsibility Principle Open Closed Principle Liskov Substitution Principle Law of Demeter CSC 335: Object-Oriented Programming and Design.
Incremental Design Why incremental design? Goal of incremental design Tools for incremental design  UML diagrams  Design principles  Design patterns.
Elements of OO Abstraction Encapsulation Modularity Hierarchy: Inheritance & Aggregation 4 major/essential elements3 minor/helpful elements Typing Concurrency.
Testing and Inheritance What is the relation between the test suite of a superclass and a subclass?
OO Design Principles Copyright © Vyacheslav Mukhortov, Nikita Nyanchuk-Tatarskiy, Copyright © INTEKS LLC,
Ordered Linked Lists using Abstract Data Types (ADT) in Java Presented by: Andrew Aken.
Five design principles
Inheritance CSI 1101 Nour El Kadri. OOP  We have seen that object-oriented programming (OOP) helps organizing and maintaining large software systems.
1 Design by Principles (Robert Martin) Software Engineering.
Object Orientation Yaodong Bi, Ph.D. Department of Computer Sciences University of Scranton January 12, 2016January 12, 2016January 12, 2016.
Evaluating an Object-Oriented Design ©SoftMoore ConsultingSlide 1.
1. Perspectives on Design Principles – Semantic Invariants and Design Entropy Catalin Tudor 2.
Inheritance Type/Subtype Relationship. Inheritance Idea: An object B of one type, termed child class, inherits from another object A of another type,
PRINCIPLES OF OBJECT ORIENTED DESIGN S.O.L.I.D. S.O.L.I.D Principles What is SOLID?  Acrostic of 5 Principles:  The Single Responsibility Principle.
SOLID Design Principles
Session 33 More on SOLID Steve Chenoweth Office: Moench Room F220 Phone: (812) Chandan Rupakheti Office: Moench.
S.Ducasse Stéphane Ducasse 1 Some Principles Stéphane Ducasse ---
SOLID PHP & Code Smell Wrap-Up
Object Orientation Yaodong Bi, Ph.D. Department of Computer Sciences University of Scranton August 19, 2005.
 Description of Inheritance  Base Class Object  Subclass, Subtype, and Substitutability  Forms of Inheritance  Modifiers and Inheritance  The Benefits.
Microsoft Advertising 16:9 Template Light Use the slides below to start the design of your presentation. Additional slides layouts (title slides, tile.
14 Jul 2005CSE403, Summer'05, Lecture 09 Lecture 09: Fundamental Principles and Best Practices for Software Design Valentin Razmov.
1 Advanced Object- oriented Design – Principles CS320 Fall 2005.
Mantas Radzevičius ifm-2/2
OCP and Liskov Principles
Course information Old exam Resit Report Result and walkthrough
Software Design Principles
Inheritance ITI1121 Nour El Kadri.
Copyright © by Curt Hill
Object Orientation Yaodong Bi, Ph.D. Department of Computer Sciences
CSE 331 Subtyping slides created by Marty Stepp based on materials by M. Ernst, S. Reges, D. Notkin, R. Mercer, Wikipedia
Object Orientation Yaodong Bi, Ph.D. Department of Computer Sciences
Component-Level Design
Software Design Principles
Principles of Object-Oriented Design
Object Oriented Design & Analysis
Some principles for object oriented design
Presentation transcript:

Software Design Principles August 19, 2005

Software design principles The single-responsibility principle The open-closed principle The Liskov substitution principle The dependency inversion principle The interface segregation principle

The single-responsibility principle “A class should have only one reason to change.” -- Robert Martin A responsibility = a reason to change Separate coupled responsibilities into separate classes

The single-responsibility principle Example: Often we need to sort students by their name, or ssn. So one may make Class Student implement the Java Comparable interface. class Student implements Comparable { … int compareTo(Object o) { … } }; Student is a business entity, it does not know in what order it should be sorted since the order of sorting is imposed by the client of Student. Worse: every time students need to be ordered differently, we have to recompile Student and all its client. Cause of the problems: we bundled two separate responsibilities (i.e., student as a business entity with ordering) into one class – a violation of SRP

The single-responsibility principle Register Add(Course d, Student s); Student SSN Name getSSN() getName() major getMajor() int compareTo() Comparable int compareTo() When a new requirement needs to sort students in a different order, Student, Register, and AClient all need to be recompiled, even Register has nothing to do with any ordering of Students. AClient op() { ;} It invokes Collections.sort(aListofStudents);

The single-responsibility principle Register Add(Course d, Student s); Comparator int compare(Object o1, Object o2) Student SSN Name getSSN() getName() major getMajor() StudentByName int compare(Object o1, Object o2) ClientA op() { ;} StudentBySSN int compare(Object o1, Object o2) The solution is to separate the two responsibilities into two separate classes and use another version of Collections.sort(). ClientB op() { ;} It invokes Collections.sort(aListofStudents, StudentBySSN);

The single-responsibility principle Computational Geometry Application Rectangle +draw():void +area():integer Graphical Application GUI Class Rectangle may be forced to make changes from two different unrelated sources. One is from the Computational Geometry Application (CGA). E.g., adding area function for length and width of type double. The other is from Graphical Application (GA). E.g., add draw() in Windows XP to the existing draw in X Windows. A change from either of the two source would still cause the other application to recompile.

The single-responsibility principle Computational Geometry Application Graphical Application Geometric Rectangle +area():double Graphic Rectangle +draw():void GUI Package CGA is no longer dependent on graphical side of Rectangle and thus it becomes independent of package GUI. Any change caused by graphical application no longer requires CGA to be recompiled. However, any changes from the CGA side may cause GA to be recompiled.

The single-responsibility principle Computational Geometry Application Graphical Application Rectangle -double length -double width +getLength():dobule +getWidth():dobule Geometric Rectangle +area():double Graphic Rectangle +draw():void GUI Class Rectangle contains the most primitive attributes and operations of rectangles. Classes GeometricRectangle and GraphicRectangle are independent of each other. A change from either side of CGA or GA, it would not cause the other side to be recompiled. NOTE: this does not violate LSP, since Rectangle does not have any client.

The open-closed principle “Software entities (classes, modules, functions, etc,) should be open for extension, but closed for modification.” – R. Martin To make a class open for extension, closed for modification, program the class to interfaces (or abstract classes), not implementation (concrete classes).

The open-closed principle Employee +int EmpType Faculty +getOffice() Staff +getDept() Secretary +getTypeSpeed() Engineer +getEngTYpe() void printEmpRoster(Employee[] emps) { for (int i; i<emps.size(); i++) { if (emps[i].empType == FACULTY) printfFaculty((Faculty)emps[i]); else if (emps[i].empType ==STAFF) printStaff((Staff)emps[i]); else if (emps[i].empType == SECRETARY) printSecretary((Secretary)emps[i]); } What if we need to add Engineer??

The open-closed principle Employee +printInfo() Faculty +printInfo() Staff +printInfo() Secretary +printInfo Engineer +printInfo() void printEmpRoster(Employee[] emps) { for (int i; i<emps.size(); i++) { emps[i].printInfo(); } When Engineer is added, printEmpRoster() does not even need to recompile. PrintEmpRoster() is open to extension, closed for modification.

The open-closed principle Three versions of SORT sort(List list) Elements of list must implement Comparable interface sort(List list, StringComparator sc) Elements of list are not required to implement Comparable StringComparator orders objects of String only Sort(List list, Comparator comp) Comparator may compare objects of any type. Open to extension since it can sort objects of any type at any order specified in the second parameter.

The Liskov substitution principle “Subtypes must be substitutable for their base types.” – R. Martin Demand no more, promise no less Demand no more: the subclass would accept any arguments that the superclass would accept. Promise no less: Any assumption that is valid when the superclass is used must be valid when the subclass is used. Interface inheritance – The LSP should be conformed to. Implementation inheritance – use composition instead of inheritance (in Java) or use private base classes (in C++).

The Liskov substitution principle Implementation inheritance When you use List to implement Queue (in Java), use composition, not inheritance. The intention is that you use only List’s implementation <foundation> List +insert() +delete() +find() List +insert() +delete() +find() List +insert() +delete() +find() MyList Queue +enqueue() +dequeue() +isEmpty() Queue +enqueue() +dequeue() +isEmpty() Queue +enqueue() +dequeue() +isEmpty()

The Liskov substitution principle class Square extends Rectangle { public void setWidth(int width) { super.setWidth(width); super.setHeight(width); } public void setHeight(int height) { super.setHeight(height); super.setWidth(height); void clientOfRectangle(Rectangle r) { r.setWidth(10); r.setHeight(20); print(r.area()); Rectangle r = new Square(…); clientOfRectangle(r); // what would be printed? Rectangle -int width; -int height +getWidth() +setWidth() +getHeight() +setHeight() +area(); IS-A Square +getWidth() +setWidth() +getHeight() +setHeight()

The Liskov substitution principle Rectangle and Square Invariant of Rectangle: width and height are independent of each other (which can be expected from the setWidth and setHeight operations) Square violates the width-height-independence invariant of Rectangle

The Liskov substitution principle There are cases in which the substitutability may not be needed Generalization: we found that Faculty, Staff, Secretary and Engineer all have the same set of attributes and operations, so we created the Employee as a placeholder for those common properties. For the system, there is no client for Employee Thus, the four subclasses do not need to be substitutable Actually, there is no way we can tell whether they are or not. Employee +printInfo() Faculty +printInfo() Staff +printInfo() Secretary +printInfo Engineer +printInfo() generalization

The dependency inversion principle “Abstraction should not depend on details. Details should depend on abstraction.” – R. Martin High-level concepts are more stable than low-level implementation

The dependency inversion principle Policy Layer High-level modules make calls to low-level modules. Mechanism Layer Utility Layer The upper-level layer is dependent upon lower-level layers.

The dependency inversion principle Dependency Inversion: Lower-level layers is dependent upon upper-level layers. Policy Policy Layer Mechanism Mechanism Layer <<interface>> Policy Service Utility <<interface>> Mechanism Service Utility Layer Ownership Inversion: The client (upper-level layer) owns the interface, not the lower-level layers

The interface segregation principle “Clients should not be forced to depend on methods that they do not use.” – R. Martin When we bundle functions for different clients into one interface/class, we create unnecessary coupling among the clients. When one client causes the interface to change, all other clients are forced to recompile.

Software design principles - summary The single-responsibility principle There is only one source that may the class to change The open-closed principle Open to extension, closed for modification The Liskov substitution principle A subclass must substitutable for its base class The dependency inversion principle Low-level (implementation, utility) classes should be dependent on high-level (conceptual, policy) classes The interface segregation principle A client should not be forced to depend on methods it does not use.