SlideShare a Scribd company logo
1 of 35
Hithesh N
Associate software engineer
Single Responsibility Principle
Open/Closed Principle
Liskov Substitution Principle
Inter face Segregation Principle
Dependency Inversion Principle
Code becomes more Testably (remember TDD is
not only about testing, more important its about
Design)
Apply ’smart’
- don’t do stuff ’just because of’
- very importad to see the context of the
program/code when applying SOLID
- Joel On Software advise – use with common
sense!
 How can we tell when our code is rotting?
Rigidity

 Design is to hard change
Fragility

 Design is easy to break
Immobility

 Design is hard to reuse
Viscosity

 Design makes hard to do the right thing
Definition
 “Every object should have a single
responsibility and that responsibility should
be entirely encapsulated by the class”

 “Class should have one responsibility - one
reason to change”
 My translation: A class should concentrate
on doing one thing and one thing only
Example
 Two resposibilities

interface Modem {
public void dial(String pno);
public void hangup();
public void send(char c);
public char recv();
}

 Connection Management + Data Communication
 Separate into two interfaces
interface DataChannel {
public void send(char c);
public char recv();
}

interface Connection {
public void dial(String phn);
public char hangup();
}
Argument Against SRP
 “To Many classes and too difficult to understand the
BIG PICTURE”
 There are no more moving parts in a system with many
small pieces than that with a few large pieces. The
benefits outweigh this argument. Consistency, Good
names and documentation make this a mute point.
What are some of the benefits
 Reuse - If all your class follow the SRP,you are more likely to reuse
some of them
 Clarity - Your code is cleaner as your class don’t do unexpected
things
 Naming –As all your classes have a single responsibility, choosing
a good name easy
 Readability –Due to the clarity, better names and shorter files the
readability is improved greatly

 Smaller Function -
 A module should be open to Extensibility ,but closed for
modification
 My translation: Change a class' behavior using
inheritance and composition
Example
// Open-Close Principle - Bad example
class GraphicEditor {
public void drawShape(Shape s) {
if (s.m_type==1)
drawRectangle(s);
else if (s.m_type==2)
drawCircle(s);
}
public void drawCircle(Circle r) {....}
public void drawRectangle(Rectangle r) {....}
}
class Shape {
int m_type;
}
class Rectangle extends Shape {
Rectangle() {
super.m_type=1;
}
}
class Circle extends Shape {
Circle() {
super.m_type=2;
}
}
Open Closed Principle – a Few Problems…
 Impossible to add a new Shape without modifying
GraphEditor
 Important to understand GraphEditor to add a new
Shape
 Tight coupling between GraphEditor and Shape

 Difficult to test a specific Shape without involving
GraphEditor
 If-Else-/Case should be avoided
Open Closed Principle - Improved
 // Open-Close Principle - Good example
class GraphicEditor {
public void drawShape(Shape s) {
s.draw();
}
}
class Shape {
abstract void draw();
}
class Rectangle extends Shape {
public void draw() {
// draw the rectangle
}
}
Challenges with using OCP?
Challenges
 Expensive – Requires significant effort

 Experience – best judgment

 Research – ask the right question
Liskov Substitution Principle

 “Derived classes must be substitutable for their base
class”
 My translation: Subclasses should behave nicely when
used in place of their base class
Liskov Substitution Principle
class Square extends Rectangle
// Violation of Liskov's Substitution Principle
{
class Rectangle
public void setWidth(int width){
{
m_width = width;
int m_width;
m_height = width;
int m_height;
}
public void setWidth(int width){
m_width = width;
}
public void setHeight(int h){
m_height = ht;
}

public int getWidth(){
return m_width;
}
public int getHeight(){
return m_height;
}
public int getArea(){
return m_width * m_height;
}
}

public void setHeight(int height){
m_width = height;
m_height = height;
}
}
Liskov Substitution Principle
class LspTest
{
private static Rectangle getNewRectangle()
{
// it can be an object returned by some factory ...
return new Square();
}
public static void main (String args[])
{
Rectangle r = LspTest.getNewRectangle();
r.setWidth(5);
r.setHeight(10);
// user knows that r it's a rectangle. It assumes that he's
able to set the width and height as for the base class
System.out.println(r.getArea());
// now he's surprised to see that the area is 100
instead of 50.
}
}
Interface Segregation Principle
 "Clients should not be forced to depend upon
interfaces that they do not use.“

 My translation: Keep interfaces small
Interface Segregation Principle
//bad example (polluted interface)
interface Worker {
void work();
void eat();
}

ManWorker implements Worker {
void work() {…};
void eat() {30 min
break;};

}

RobotWorker implements Worker {
void work() {…};
void eat() {//Not
Appliciable
for a
RobotWorker};
Interface Segregation Principle
 Solution
- split into two interfaces

interface Workable {
public void work();
}

interface Feedable{
public void eat();
}
Dependency Inversion Principle
 A. High level modules should not depend upon low level
modules. Both should depend upon abstractions.
B. Abstractions should not depend upon details. Details
should depend upon abstractions.“
 My translation: Use lots of interfaces and abstractions
Dependency Inversion Principle
//DIP - bad example
public class EmployeeService {
private EmployeeFinder emFinder //concrete class, not abstract.
Can access a SQL DB for instance
public Employee findEmployee(…) {
emFinder.findEmployee(…)
}
}
Dependency Inversion Principle
//DIP - fixed
public class EmployeeService {
private IEmployeeFinder emFinder //depends on an abstraction,
no animplementation
public Employee findEmployee(…) {

emFinder.findEmployee(…)
}
}

Now its possible to change the finder to be a
XmlEmployeeFinder, DBEmployeeFinder,
FlatFileEmployeeFinder, MockEmployeeFinder….
Q&A

http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOo
d
http://www.oodesign.com
http://www.slideshare.net/enbohm

More Related Content

What's hot

Classes and data abstraction
Classes and data abstractionClasses and data abstraction
Classes and data abstractionHoang Nguyen
 
Java OOP Programming language (Part 6) - Abstract Class & Interface
Java OOP Programming language (Part 6) - Abstract Class & InterfaceJava OOP Programming language (Part 6) - Abstract Class & Interface
Java OOP Programming language (Part 6) - Abstract Class & InterfaceOUM SAOKOSAL
 
Abstract data types
Abstract data typesAbstract data types
Abstract data typesHoang Nguyen
 
Lecture 9 access modifiers and packages
Lecture   9 access modifiers and packagesLecture   9 access modifiers and packages
Lecture 9 access modifiers and packagesmanish kumar
 
SOLID mit Java 8
SOLID mit Java 8SOLID mit Java 8
SOLID mit Java 8Roland Mast
 
Ch.1 oop introduction, classes and objects
Ch.1 oop introduction, classes and objectsCh.1 oop introduction, classes and objects
Ch.1 oop introduction, classes and objectsITNet
 
What are Abstract Classes in Java | Edureka
What are Abstract Classes in Java | EdurekaWhat are Abstract Classes in Java | Edureka
What are Abstract Classes in Java | EdurekaEdureka!
 
Support for Object-Oriented Programming (OOP) in C++
Support for Object-Oriented Programming (OOP) in C++Support for Object-Oriented Programming (OOP) in C++
Support for Object-Oriented Programming (OOP) in C++Ameen Sha'arawi
 
Lecture18 structurein c.ppt
Lecture18 structurein c.pptLecture18 structurein c.ppt
Lecture18 structurein c.ppteShikshak
 
Abstract Class Presentation
Abstract Class PresentationAbstract Class Presentation
Abstract Class Presentationtigerwarn
 

What's hot (20)

Java interface
Java interfaceJava interface
Java interface
 
Abstract classes and interfaces
Abstract classes and interfacesAbstract classes and interfaces
Abstract classes and interfaces
 
Classes and data abstraction
Classes and data abstractionClasses and data abstraction
Classes and data abstraction
 
Structures
StructuresStructures
Structures
 
Java OOP Programming language (Part 6) - Abstract Class & Interface
Java OOP Programming language (Part 6) - Abstract Class & InterfaceJava OOP Programming language (Part 6) - Abstract Class & Interface
Java OOP Programming language (Part 6) - Abstract Class & Interface
 
Structure in c#
Structure in c#Structure in c#
Structure in c#
 
Abstract data types
Abstract data typesAbstract data types
Abstract data types
 
Abstraction file
Abstraction fileAbstraction file
Abstraction file
 
SOLID Java Code
SOLID Java CodeSOLID Java Code
SOLID Java Code
 
Lecture 9 access modifiers and packages
Lecture   9 access modifiers and packagesLecture   9 access modifiers and packages
Lecture 9 access modifiers and packages
 
SOLID mit Java 8
SOLID mit Java 8SOLID mit Java 8
SOLID mit Java 8
 
Abstract method
Abstract methodAbstract method
Abstract method
 
Ch.1 oop introduction, classes and objects
Ch.1 oop introduction, classes and objectsCh.1 oop introduction, classes and objects
Ch.1 oop introduction, classes and objects
 
What are Abstract Classes in Java | Edureka
What are Abstract Classes in Java | EdurekaWhat are Abstract Classes in Java | Edureka
What are Abstract Classes in Java | Edureka
 
javainterface
javainterfacejavainterface
javainterface
 
Support for Object-Oriented Programming (OOP) in C++
Support for Object-Oriented Programming (OOP) in C++Support for Object-Oriented Programming (OOP) in C++
Support for Object-Oriented Programming (OOP) in C++
 
Lecture18 structurein c.ppt
Lecture18 structurein c.pptLecture18 structurein c.ppt
Lecture18 structurein c.ppt
 
Poo java
Poo javaPoo java
Poo java
 
Abstract classes
Abstract classesAbstract classes
Abstract classes
 
Abstract Class Presentation
Abstract Class PresentationAbstract Class Presentation
Abstract Class Presentation
 

Similar to Solid Principles

Similar to Solid Principles (20)

An Introduction to the SOLID Principles
An Introduction to the SOLID PrinciplesAn Introduction to the SOLID Principles
An Introduction to the SOLID Principles
 
SOLID
 SOLID SOLID
SOLID
 
Object Design - Part 1
Object Design - Part 1Object Design - Part 1
Object Design - Part 1
 
SOLID Design Principles
SOLID Design PrinciplesSOLID Design Principles
SOLID Design Principles
 
L04 Software Design 2
L04 Software Design 2L04 Software Design 2
L04 Software Design 2
 
The maze of Design Patterns & SOLID Principles
The maze of Design Patterns & SOLID PrinciplesThe maze of Design Patterns & SOLID Principles
The maze of Design Patterns & SOLID Principles
 
Interface in java By Dheeraj Kumar Singh
Interface in java By Dheeraj Kumar SinghInterface in java By Dheeraj Kumar Singh
Interface in java By Dheeraj Kumar Singh
 
L22 Design Principles
L22 Design PrinciplesL22 Design Principles
L22 Design Principles
 
L02 Software Design
L02 Software DesignL02 Software Design
L02 Software Design
 
Structural pattern 3
Structural pattern 3Structural pattern 3
Structural pattern 3
 
20 Object-oriented programming principles
20 Object-oriented programming principles20 Object-oriented programming principles
20 Object-oriented programming principles
 
SOLID
SOLIDSOLID
SOLID
 
Design pattern
Design patternDesign pattern
Design pattern
 
Solid js
Solid jsSolid js
Solid js
 
Solid principles in action
Solid principles in actionSolid principles in action
Solid principles in action
 
Solid principles - Object oriendte
Solid principles - Object oriendteSolid principles - Object oriendte
Solid principles - Object oriendte
 
Chapter 13 introduction to classes
Chapter 13 introduction to classesChapter 13 introduction to classes
Chapter 13 introduction to classes
 
Design patters java_meetup_slideshare [compatibility mode]
Design patters java_meetup_slideshare [compatibility mode]Design patters java_meetup_slideshare [compatibility mode]
Design patters java_meetup_slideshare [compatibility mode]
 
L03 Software Design
L03 Software DesignL03 Software Design
L03 Software Design
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 

Recently uploaded

GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdfChristopherTHyatt
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 

Recently uploaded (20)

GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 

Solid Principles

  • 2. Single Responsibility Principle Open/Closed Principle Liskov Substitution Principle Inter face Segregation Principle Dependency Inversion Principle
  • 3. Code becomes more Testably (remember TDD is not only about testing, more important its about Design) Apply ’smart’ - don’t do stuff ’just because of’ - very importad to see the context of the program/code when applying SOLID - Joel On Software advise – use with common sense!
  • 4.
  • 5.  How can we tell when our code is rotting?
  • 6. Rigidity  Design is to hard change
  • 7. Fragility  Design is easy to break
  • 8. Immobility  Design is hard to reuse
  • 9. Viscosity  Design makes hard to do the right thing
  • 10.
  • 11. Definition  “Every object should have a single responsibility and that responsibility should be entirely encapsulated by the class”  “Class should have one responsibility - one reason to change”  My translation: A class should concentrate on doing one thing and one thing only
  • 12. Example  Two resposibilities interface Modem { public void dial(String pno); public void hangup(); public void send(char c); public char recv(); }  Connection Management + Data Communication
  • 13.  Separate into two interfaces interface DataChannel { public void send(char c); public char recv(); } interface Connection { public void dial(String phn); public char hangup(); }
  • 14. Argument Against SRP  “To Many classes and too difficult to understand the BIG PICTURE”  There are no more moving parts in a system with many small pieces than that with a few large pieces. The benefits outweigh this argument. Consistency, Good names and documentation make this a mute point.
  • 15. What are some of the benefits  Reuse - If all your class follow the SRP,you are more likely to reuse some of them  Clarity - Your code is cleaner as your class don’t do unexpected things  Naming –As all your classes have a single responsibility, choosing a good name easy  Readability –Due to the clarity, better names and shorter files the readability is improved greatly  Smaller Function -
  • 16.
  • 17.  A module should be open to Extensibility ,but closed for modification  My translation: Change a class' behavior using inheritance and composition
  • 18. Example // Open-Close Principle - Bad example class GraphicEditor { public void drawShape(Shape s) { if (s.m_type==1) drawRectangle(s); else if (s.m_type==2) drawCircle(s); } public void drawCircle(Circle r) {....} public void drawRectangle(Rectangle r) {....} } class Shape { int m_type; } class Rectangle extends Shape { Rectangle() { super.m_type=1; } } class Circle extends Shape { Circle() { super.m_type=2; } }
  • 19. Open Closed Principle – a Few Problems…  Impossible to add a new Shape without modifying GraphEditor  Important to understand GraphEditor to add a new Shape  Tight coupling between GraphEditor and Shape  Difficult to test a specific Shape without involving GraphEditor  If-Else-/Case should be avoided
  • 20. Open Closed Principle - Improved  // Open-Close Principle - Good example class GraphicEditor { public void drawShape(Shape s) { s.draw(); } } class Shape { abstract void draw(); } class Rectangle extends Shape { public void draw() { // draw the rectangle } }
  • 22. Challenges  Expensive – Requires significant effort  Experience – best judgment  Research – ask the right question
  • 23.
  • 24. Liskov Substitution Principle  “Derived classes must be substitutable for their base class”  My translation: Subclasses should behave nicely when used in place of their base class
  • 25. Liskov Substitution Principle class Square extends Rectangle // Violation of Liskov's Substitution Principle { class Rectangle public void setWidth(int width){ { m_width = width; int m_width; m_height = width; int m_height; } public void setWidth(int width){ m_width = width; } public void setHeight(int h){ m_height = ht; } public int getWidth(){ return m_width; } public int getHeight(){ return m_height; } public int getArea(){ return m_width * m_height; } } public void setHeight(int height){ m_width = height; m_height = height; } }
  • 26. Liskov Substitution Principle class LspTest { private static Rectangle getNewRectangle() { // it can be an object returned by some factory ... return new Square(); } public static void main (String args[]) { Rectangle r = LspTest.getNewRectangle(); r.setWidth(5); r.setHeight(10); // user knows that r it's a rectangle. It assumes that he's able to set the width and height as for the base class System.out.println(r.getArea()); // now he's surprised to see that the area is 100 instead of 50. } }
  • 27.
  • 28. Interface Segregation Principle  "Clients should not be forced to depend upon interfaces that they do not use.“  My translation: Keep interfaces small
  • 29. Interface Segregation Principle //bad example (polluted interface) interface Worker { void work(); void eat(); } ManWorker implements Worker { void work() {…}; void eat() {30 min break;}; } RobotWorker implements Worker { void work() {…}; void eat() {//Not Appliciable for a RobotWorker};
  • 30. Interface Segregation Principle  Solution - split into two interfaces interface Workable { public void work(); } interface Feedable{ public void eat(); }
  • 31.
  • 32. Dependency Inversion Principle  A. High level modules should not depend upon low level modules. Both should depend upon abstractions. B. Abstractions should not depend upon details. Details should depend upon abstractions.“  My translation: Use lots of interfaces and abstractions
  • 33. Dependency Inversion Principle //DIP - bad example public class EmployeeService { private EmployeeFinder emFinder //concrete class, not abstract. Can access a SQL DB for instance public Employee findEmployee(…) { emFinder.findEmployee(…) } }
  • 34. Dependency Inversion Principle //DIP - fixed public class EmployeeService { private IEmployeeFinder emFinder //depends on an abstraction, no animplementation public Employee findEmployee(…) { emFinder.findEmployee(…) } } Now its possible to change the finder to be a XmlEmployeeFinder, DBEmployeeFinder, FlatFileEmployeeFinder, MockEmployeeFinder….