SlideShare a Scribd company logo
Applying Design
Principles in Practice
Tushar Sharma
Ganesh Samarthyam
Girish Suryanarayana
Agenda
• Introduction
• Applying abstraction
• Applying encapsulation
• Applying modularisation
• Applying hierarchy
• Practical considerations
• Wrap-up
Why care about design quality and
design principles?
Poor software quality costs
more than $150 billion per year
in U.S. and greater than $500
billion per year worldwide
- Capers Jones
The city metaphor
Source: http://indiatransportportal.com/wp-content/uploads/2012/04/Traffic-congestion1.jpg
“Applying design principles is the key to creating
high-quality software!”
Architectural principles:
Axis, symmetry, rhythm, datum, hierarchy, transformation
What do we mean by “principles”?
“Design principles are key notions considered
fundamental to many different software design
approaches and concepts.”
- SWEBOK ‘04
"The critical design tool for software development
is a mind well educated in design principles"
- Craig Larman
Fundamental Design Principles
SOLID principles
•  There&should&never&be&more&than&one&reason&for&a&class&to&
change&&
Single'Responsibility'
Principle'(SRP)'
•  So6ware&en88es&(classes,&modules,&func8ons,&etc.)&should&
be&open&for&extension,&but&closed&for&modifica8on&
Open'Closed'Principle'
(OCP)'
•  Pointers&or&references&to&base&classes&must&be&able&to&use&
objects&of&derived&classes&without&knowing&it&
Liskov’s'Subs<tu<on'
Principle'(LSP)'
•  Depend&on&abstrac8ons,&not&on&concre8ons&
Dependency'Inversion'
Principle'(DIP)'
•  Many&clientGspecific&interfaces&are&beHer&than&one&
generalGpurpose&interface&
Interface'Segrega<on'
Principle'(ISP)'
3 principles behind patterns
Program to an interface, not to an
implementation
Favor object composition over inheritance
Encapsulate what varies
Booch’s fundamental principles
Principles*
Abstrac/on*
Encapsula/on*
Modulariza/on*
Hierarchy*
How to apply principles in practice?
Abstraction Encapsulation Modularization Hierarchy
Code
How to bridge
the gap?
Real scenario #1
Initial design
Real scenario #1
❖ How will you refactor such
that:
❖ A specific DES, AES, TDES,
… can be “plugged” at
runtime?
❖ Reuse these algorithms in
new contexts?
❖ Easily add support for new
algorithms in Encryption?
Next change:
smelly design
Time to refactor!
Three strikes and you
refactor
Martin Fowler
Potential solution #1?
Broken
hierarchy!
Potential solution #2?
Algorithms not
reusable!
Potential solution #3?
Can you identify the pattern?
You’re right: Its Strategy pattern!
Real scenario #2
Initial design
Real scenario #2
How to add support for new
content types and/or algorithms?
How about this solution?
Can you identify the pattern structure?
You’re right: Its Bridge pattern structure!
Wait, what principle did we apply?
Open Closed Principle (OCP)
Bertrand Meyer
Software entities should be open for
extension, but closed for modification
Variation Encapsulation Principle (VEP)
Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides
Encapsulate the concept that varies
Fundamental principle: Encapsulation
The principle of encapsulation advocates separation of concerns and
information hiding through techniques such as hiding implementation
details of abstractions and hiding variations
Enabling techniques for encapsulation
Design principles and enabling techniques
What is refactoring?
Refactoring (noun): a change
made to the internal structure of
software to make it easier to
understand and cheaper to
modify without changing its
observable behavior
Refactor (verb): to restructure
software by applying a series
of refactorings without
changing its observable
behavior
Applying principles in practice
Encapsulation
Violating
encapsulation
Adherence to
encapsulation
Enabling
technique:
Hide
variations
Applying principles in practice
Principle
Violating
principles
Adherence to
principles
Refactoring
Bad design
(with smells)
Good design
(with patterns)
Design determines qualities
Understandability Changeability Extensibility
Reusability Testability Reliability
DESIGN
impacts
impacts
impacts
Smells approach to learn principles
A"good"designer"is"
one"who"knows"the"
design"solu1ons"
A"GREAT"designer"is"
one"who"understands"
the"impact"of"design"
smells"and"knows"
how"to"address"them!
Agenda
• Introduction
• Applying abstraction
• Applying encapsulation
• Applying modularisation
• Applying hierarchy
• Practical considerations
• Wrap-up
What is abstraction?
public'class'Throwable'{'
//'following'method'is'available'from'Java'1.0'version.''
//'Prints'the'stack'trace'as'a'string'to'standard'output''
//'for'processing'a'stack'trace,''
//'we'need'to'write'regular'expressions''
public'void'printStackTrace();''''''
//'other'methods'elided''
}'
Refactoring for this smell
public'class'Throwable'{'
//'following'method'is'available'from'Java'1.0'version.''
//'Prints'the'stack'trace'as'a'string'to'standard'output''
//'for'processing'a'stack'trace,''
//'we'need'to'write'regular'expressions''
public'void'printStackTrace();''''''
//'other'methods'elided''
}'
public'class'Throwable'{'
public'void'printStackTrace();''''''
''''''''''''public'StackTraceElement[]'getStackTrace();'//'Since'1.4'
'''''''''''''//'other'methods'elided''
}'
public'final'class'StackTraceElement'{'
public'String'getFileName();'
public'int'getLineNumber();'
public'String'getClassName();'
public'String'getMethodName();'
public'boolean'isNativeMethod();'
}'
Applying abstraction principle
Provide a crisp conceptual
boundary and a unique identity
public class FormattableFlags {
    // Explicit instantiation of this class is prohibited.
    private FormattableFlags() {}
    /** Left-justifies the output.  */
    public static final int LEFT_JUSTIFY = 1<<0; // '-'
    /** Converts the output to upper case */
    public static final int UPPERCASE = 1<<1;    // 'S'
    /**Requires the output to use an alternate form. */
    public static final int ALTERNATE = 1<<2;    // '#'
}
class Currency {
public static String DOLLAR = "u0024";
public static String EURO = "u20AC";
public static String RUPEE = "u20B9";
public static String YEN = "u00A5";
// no other members in this class
}
Applying abstraction principle
Assign single and meaningful
responsibility
Enabling techniques for abstraction
Agenda
• Introduction
• Applying abstraction
• Applying encapsulation
• Applying modularisation
• Applying hierarchy
• Practical considerations
• Wrap-up
What is encapsulation?
Applying Design Principles in Practice
Applying Design Principles in Practice
Refactoring for that smell
Applying encapsulation principle
Hide implementation details
Scenario
Initial design
TextView
+ Draw()
BorderedTextView
+ Draw()
+ DrawBorder()
Real scenario
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
Supporting new requirements
Revised design with
new requirements
TextView
+ Draw()
BorderedTextView
+ Draw()
+ DrawBorder()
ScrollableTextView
ScrollableBordered
TextView
- borderWidth
+ Draw()
+ ScrollTo()
- ScrollPosition
+ Draw()
+ ScrollTo()
+ DrawBorder()
- ScrollPosition
- borderWidth
Real scenario
❖ How will you refactor such
that:
❖ You don't have to “multiply-
out” sub-types? (i.e., avoid
“explosion of classes”)
❖ Add or remove
responsibilities (e.g.,
scrolling) at runtime?
Next change:
smelly design
How about this solution?
VisualComponent
+ Draw()
TextView
+ Draw()
ScrollDecortor BorderDecorator
+ Draw()
+ ScrollTo()
- ScrollPosition
+ Draw()
+ DrawBorder()
- borderWidth
Decorator
+ Draw() component->Draw()
Decorator::Draw()
DrawBorder()
Decorator::Draw()
ScrollTo()
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
At runtime (object diagram)
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
Can you identify the pattern?
VisualComponent
+ Draw()
TextView
+ Draw()
ScrollDecortor BorderDecorator
+ Draw()
+ ScrollTo()
- ScrollPosition
+ Draw()
+ DrawBorder()
- borderWidth
Decorator
+ Draw() component->Draw()
Decorator::Draw()
DrawBorder()
Decorator::Draw()
ScrollTo()
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
You’re right: Its Decorator pattern!
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
Decorator pattern: Discussion
❖ Want to add responsibilities to
individual objects (not an
entire class)
❖ One way is to use inheritance
❖ Inflexible; static choice
❖ Hard to add and remove
responsibilities dynamically
Attach additional responsibilities to an object dynamically. Decorators
provide a flexible alternative to subclassing for extending functionality
❖ Add responsibilities through
decoration
❖ in a way transparent to the
clients
❖ Decorator forwards the requests to
the contained component to
perform additional actions
❖ Can nest recursively
❖ Can add an unlimited number
of responsibilities dynamically
Identify pattern used in this code
LineNumberReader lnr =
new LineNumberReader(
new BufferedReader(
new FileReader(“./test.c")));
String str = null;
while((str = lnr.readLine()) != null)
System.out.println(lnr.getLineNumber() + ": " + str);
Decorator pattern in Reader
Scenario
a) How do we treat files
and folders alike?
b) How can we handle
shortcuts?
File
+ GetName()
+ GetSize()
+ …
- name: String
- size: int
- type: FileType
- data: char[]
- …
Folder
+ GetName()
+ GetFiles()
+ GetFolders()
+ …
- name: String
- files[]: File
- folders[]: Folder
How about this solution?
FileItem
+ GetName()
+ GetSize()
+ Add(FileItem)
+ Remove(FileItem)
Folder
+ GetFiles()
+ …
File
- files: FileItem
+ GetType()
+ GetContents()
+ …
- type: FileType
- data: char[]
Shortcut
+ GetLinkedFileItem()
+ …
- linkToFile: FileItem
Composite pattern
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
Composite pattern: Discussion
❖ There are many situations where
a group of components form
larger components
❖ Simplistic approach: Make
container component contain
primitive ones
❖ Problem: Code has to treat
container and primitive
components differently
Compose objects into tree structures to represent part-whole hierarchies. Composite
lets client treat individual objects and compositions of objects uniformly.
❖ Perform recursive
composition of
components
❖ Clients don’t have to
treat container and
primitive components
differently
Decorator vs. Composite
Decorator and composite structure looks similar:
Decorator is a degenerate form of Composite!
Decorator Composite
At max. one component Can have many components
Adds responsibilities Aggregates objects
Does not make sense to have
methods such as Add(),
Remove(), GetChid() etc.
Has methods such as Add(),
Remove(), GetChild(), etc.
Applying encapsulation principle
Hide variations
Enabling techniques for encapsulation
Agenda
• Introduction
• Applying abstraction
• Applying encapsulation
• Applying modularisation
• Applying hierarchy
• Practical considerations
• Wrap-up
What is modularization?
Applying Design Principles in Practice
Refactoring for this smell
Applying modularisation principle
Localize related data and
methods
Applying Design Principles in Practice
Suggested refactoring for this smell
Applying modularisation principle
Create acyclic dependencies
Enabling techniques for modularisation
Agenda
• Introduction
• Applying abstraction
• Applying encapsulation
• Applying modularisation
• Applying hierarchy
• Practical considerations
• Wrap-up
What is hierarchy?
public Insets getBorderInsets(Component c, Insets insets){
Insets margin = null;
// Ideally we'd have an interface defined for classes which
// support margins (to avoid this hackery), but we've
// decided against it for simplicity
//
if (c instanceof AbstractButton) {
margin = ((AbstractButton)c).getMargin();
} else if (c instanceof JToolBar) {
margin = ((JToolBar)c).getMargin();
} else if (c instanceof JTextComponent) {
margin = ((JTextComponent)c).getMargin();
}
// rest of the code elided …
Suggested refactoring for this smell
Suggested refactoring for the code
margin = c.getMargin();
if (c instanceof AbstractButton) {
margin = ((AbstractButton)c).getMargin();
} else if (c instanceof JToolBar) {
margin = ((JToolBar)c).getMargin();
} else if (c instanceof JTextComponent) {
margin = ((JTextComponent)c).getMargin();
}
Applying hierarchy principle
Apply meaningful
classification
Applying Design Principles in Practice
Suggested refactoring for this smell
A real-world case study
Applying hierarchy principle
Ensure proper ordering
Enabling techniques for hierarchy
Agenda
• Introduction
• Applying abstraction
• Applying encapsulation
• Applying modularisation
• Applying hierarchy
• Practical considerations
• Wrap-up
How to repay technical debt in practice?
IMPACT process model
Useful tools during Refactoring
Comprehension Tools
STAN
http://stan4j.com
Comprehension Tools
Code City
http://www.inf.usi.ch/phd/wettel/codecity.html
Comprehension Tools
Imagix 4D
http://www.imagix.com
Critique, code-clone detectors, and metric tools
Infusion
www.intooitus.com/products/infusion
Critique, code-clone detectors, and metric tools
Designite
www.designite-tools.com
Critique, code-clone detectors, and metric tools
PMD Copy Paste Detector (CPD)
http://pmd.sourceforge.net/pmd-4.3.0/cpd.html
Critique, code-clone detectors, and metric tools
Understand
https://scitools.com
Technical Debt quantification/visualization tools
Sonarqube
http://www.sonarqube.org
Refactoring tools
ReSharper
https://www.jetbrains.com/resharper/features/
Agenda
• Introduction
• Applying abstraction
• Applying encapsulation
• Applying modularisation
• Applying hierarchy
• Practical considerations
• Wrap-up
Applying Design Principles in Practice
Principles and enabling techniques
“Applying design principles is the key to creating
high-quality software!”
Architectural principles:
Axis, symmetry, rhythm, datum, hierarchy, transformation
ganesh.samarthyam@gmail.com
@GSamarthyam
tusharsharma@ieee.org
@Sharma__Tushar
girish.suryanarayana@siemens.com
@Girish_Sur
www.designsmells.com
@designsmells

More Related Content

PDF
Design patterns through refactoring
PDF
OO Design and Design Patterns in C++
PDF
Refactoring for Software Design Smells - 1 day Workshop
PPT
Ppt local tracking and gps
PPT
PDF
Refactoring for Software Design Smells
PDF
Bad Code Smells
PPTX
Oracle BPM Adaptive Case Management 2014
Design patterns through refactoring
OO Design and Design Patterns in C++
Refactoring for Software Design Smells - 1 day Workshop
Ppt local tracking and gps
Refactoring for Software Design Smells
Bad Code Smells
Oracle BPM Adaptive Case Management 2014

What's hot (11)

PPTX
SOLID _Principles.pptx
PPTX
1, 2, 3 codez : l'informatique à l'école maternelle et élémentaire
PPTX
Microsoft Visio Detailed Presentation
PPTX
Data Privacy and Security in Autonomous Vehicles
PPTX
pmse-sitttr-session-3.pptx
PPTX
Getting started with Svelte Presentation
PPTX
Auto pilot mode/Autonomus car
PDF
Simulation for autonomous driving at uber atg
PPTX
Self Driving- Advantages and Disadvantages
PPTX
Single Responsibility Principle @ Clean Code Alliance Meetup
SOLID _Principles.pptx
1, 2, 3 codez : l'informatique à l'école maternelle et élémentaire
Microsoft Visio Detailed Presentation
Data Privacy and Security in Autonomous Vehicles
pmse-sitttr-session-3.pptx
Getting started with Svelte Presentation
Auto pilot mode/Autonomus car
Simulation for autonomous driving at uber atg
Self Driving- Advantages and Disadvantages
Single Responsibility Principle @ Clean Code Alliance Meetup
Ad

Viewers also liked (11)

PDF
Pragmatic Technical Debt Management
PDF
A Checklist for Design Reviews
PDF
SOLID Principles and Design Patterns
PDF
Why care about technical debt?
PDF
Infographic - Pragmatic Technical Debt Management
PDF
Tools for Identifying and Addressing Technical Debt
PDF
PHAME: Principles of Hierarchy Abstraction Modularization and Encapsulation
PDF
Tools for refactoring
PDF
Refactoring for Software Design Smells: Managing Technical Debt
PDF
Towards a Principle-based Classification of Structural Design Smells
PPT
Working Effectively With Legacy Code
Pragmatic Technical Debt Management
A Checklist for Design Reviews
SOLID Principles and Design Patterns
Why care about technical debt?
Infographic - Pragmatic Technical Debt Management
Tools for Identifying and Addressing Technical Debt
PHAME: Principles of Hierarchy Abstraction Modularization and Encapsulation
Tools for refactoring
Refactoring for Software Design Smells: Managing Technical Debt
Towards a Principle-based Classification of Structural Design Smells
Working Effectively With Legacy Code
Ad

Similar to Applying Design Principles in Practice (20)

PDF
Three ways to apply design principles in practice
PDF
L03 Software Design
PPTX
Design Patterns - General Introduction
PDF
Software Architecture: Principles, Patterns and Practices
PDF
Applying Design Patterns in Practice
PPT
04 designing architectures
PPTX
Online TechTalk  "Patterns in Embedded SW Design"
PDF
Applying Design Principles in Practice
PPTX
2009 Dotnet Information Day: More effective c#
PDF
Domain Driven Design
PDF
Introduction to SOLID Principles
PPT
Design Patterns.ppt
PPTX
OOSAD Chapter 6 Object Oriented Design.pptx
PDF
Beyond MVC: from Model to Domain
PPT
Contemporary Software Engineering Practices Together With Enterprise
PDF
"Paradigm Shifting" Presentation
PDF
Dicoding Developer Coaching #31: Android | Menerapkan Clean Architecture di A...
PPT
Cs 1023 lec 4 (week 1)
PPT
Design poo my_jug_en_ppt
PDF
Three ways to apply design principles in practice
L03 Software Design
Design Patterns - General Introduction
Software Architecture: Principles, Patterns and Practices
Applying Design Patterns in Practice
04 designing architectures
Online TechTalk  "Patterns in Embedded SW Design"
Applying Design Principles in Practice
2009 Dotnet Information Day: More effective c#
Domain Driven Design
Introduction to SOLID Principles
Design Patterns.ppt
OOSAD Chapter 6 Object Oriented Design.pptx
Beyond MVC: from Model to Domain
Contemporary Software Engineering Practices Together With Enterprise
"Paradigm Shifting" Presentation
Dicoding Developer Coaching #31: Android | Menerapkan Clean Architecture di A...
Cs 1023 lec 4 (week 1)
Design poo my_jug_en_ppt

More from Tushar Sharma (13)

PDF
House of Cards: Code Smells in Open-source C# Repositories
PDF
The tail of two source-code analysis tools - Learning and experiences
PDF
Designite: A Customizable Tool for Smell Mining in C# Repositories
PDF
Writing Maintainable Code
PDF
FOSDEM - Does your configuration code smell?
PDF
Achieving Design Agility by Refactoring Design Smells
PDF
Does your configuration code smell?
PDF
Designite – Software Design Quality Assessment Tool
PDF
Does Your Configuration Code Smell?
PDF
Technical debt - The elephant in the room
PDF
Understanding software metrics
PDF
Does your design smell?
PDF
Refactoring for Design Smells - ICSE 2014 Tutorial
House of Cards: Code Smells in Open-source C# Repositories
The tail of two source-code analysis tools - Learning and experiences
Designite: A Customizable Tool for Smell Mining in C# Repositories
Writing Maintainable Code
FOSDEM - Does your configuration code smell?
Achieving Design Agility by Refactoring Design Smells
Does your configuration code smell?
Designite – Software Design Quality Assessment Tool
Does Your Configuration Code Smell?
Technical debt - The elephant in the room
Understanding software metrics
Does your design smell?
Refactoring for Design Smells - ICSE 2014 Tutorial

Recently uploaded (20)

PPTX
L1 - Introduction to python Backend.pptx
PPTX
Advanced SystemCare Ultimate Crack + Portable (2025)
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
Cost to Outsource Software Development in 2025
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Complete Guide to Website Development in Malaysia for SMEs
PDF
Tally Prime Crack Download New Version 5.1 [2025] (License Key Free
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
AutoCAD Professional Crack 2025 With License Key
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PPTX
assetexplorer- product-overview - presentation
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PDF
Download FL Studio Crack Latest version 2025 ?
PDF
How to Make Money in the Metaverse_ Top Strategies for Beginners.pdf
PDF
Autodesk AutoCAD Crack Free Download 2025
PPTX
Monitoring Stack: Grafana, Loki & Promtail
PPTX
Why Generative AI is the Future of Content, Code & Creativity?
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
L1 - Introduction to python Backend.pptx
Advanced SystemCare Ultimate Crack + Portable (2025)
Design an Analysis of Algorithms II-SECS-1021-03
Cost to Outsource Software Development in 2025
Odoo Companies in India – Driving Business Transformation.pdf
Operating system designcfffgfgggggggvggggggggg
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Complete Guide to Website Development in Malaysia for SMEs
Tally Prime Crack Download New Version 5.1 [2025] (License Key Free
How to Choose the Right IT Partner for Your Business in Malaysia
AutoCAD Professional Crack 2025 With License Key
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
assetexplorer- product-overview - presentation
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Download FL Studio Crack Latest version 2025 ?
How to Make Money in the Metaverse_ Top Strategies for Beginners.pdf
Autodesk AutoCAD Crack Free Download 2025
Monitoring Stack: Grafana, Loki & Promtail
Why Generative AI is the Future of Content, Code & Creativity?
wealthsignaloriginal-com-DS-text-... (1).pdf

Applying Design Principles in Practice