SlideShare a Scribd company logo
Refactoring legacy code driven by tests
Luca Minudel + Saleem Siddiqui
I’m the
Refactoring
Chicken
I’m the
TDD egg
Let’s clarify the scope of this Workshop
Languages supported in this Workshop
C#
Java
JavaScript
Ruby
Python
Automatic Testing Continuum
Specification
(documentation)
DesignVerification
Scope of this workshop
Specification
(documentation)
DesignVerification
Types of Automatic Tests
End-to-end, out-of-process, business facing
Unit, in-process, technology facing
Scope of this workshop
End-to-end, out-of-process, business facing
Unit, in-process, technology facing
Exercise 1: Tire Pressure Monitoring System
Alarm class:
monitors tire pressure and sets an alarm if the pressure falls
outside of the expected range.
Exercise 1: Tire Pressure Monitoring System
Alarm class:
monitors tire pressure and sets an alarm if the pressure falls
outside of the expected range.
Sensor class:
simulates the behavior of a real tire sensor, providing random
but realistic values.
Exercise 1: Tire Pressure Monitoring System
Write the unit tests for the Alarm class.
Refactor the code as much as you need to make the Alarm
class testable.
Exercise 1: Tire Pressure Monitoring System
Write the unit tests for the Alarm class.
Refactor the code as much as you need to make the Alarm
class testable.
Minimize changes to the public API as much as you can.
Exercise 1: Tire Pressure Monitoring System
Write the unit tests for the Alarm class.
Refactor the code as much as you need to make the Alarm
class testable.
Minimize changes to the public API as much as you can.
Extra credits:
Alarm class fails to follow one or more of the SOLID principles.
Write down the line number, the principle & the violation.
The SOLID acronym
S single responsibility principle
O open closed principle
L Liskov substitution principle
I interface segregation principle
D dependency inversion principle
Dependency Inversion Principle (DIP)
Martin Fowler's definition:
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.
Dependency Inversion Principle (DIP)
Both low level classes and high level classes
should depend on abstractions.
High level classes should not depend on low
level classes.
DIP Violation In Example Code
High Level Class
Low Level Class
Dependency
Open Closed Principle (OCP)
Bertrand Meyer's definition:
Software entities (classes, modules, functions,
etc.) should be open for extension, but closed for
modification.
Open Closed Principle (OCP)
Classes and methods should be
open for extensions
&
strategically closed for modification.
So that the behavior can be changed and
extended adding new code instead of changing
the class.
OCP Violation In Example Code
Want to use a new type of sensor?
Must modify code; cannot extend it
Reference: WELC
Parametrize Constructor
Extract Interface
Exercise 2: Unicode File To Htm Text Converter
UnicodeFileToHtmTextConverter class:
formats a plain text file for display in a browser.
Exercise 2: Unicode File To Htm Text Converter
Write the unit tests for the UnicodeFileToHtmTextConverter
class.
Refactor the code as much as you need to make the class
testable.
Exercise 2: Unicode File To Htm Text Converter
Write the unit tests for the UnicodeFileToHtmTextConverter
class.
Refactor the code as much as you need to make the class
testable.
Minimize changes to the public API as much as you can.
Exercise 2: Unicode File To Htm Text Converter
Write the unit tests for the UnicodeFileToHtmTextConverter
class.
Refactor the code as much as you need to make the class
testable.
Minimize changes to the public API as much as you can.
Extra credits:
UnicodeFileToHtmTextConverter class fails to follow one or
more of the SOLID principles. Write down the line number,
the principle & the violation.
Feathers’ rules of thumb. Extended !
A test is not a unit test when:
 It talks to the database
 It communicates across the network
 It touches the file system or reads config info
 It uses DateTime.now() or Random
 It depends on non-deterministic behavior
 It can't run at the same time as any of your other unit
tests
 You have to do special things to your environment
(such as editing config files) to run it.
Mike Cohn's Test Pyramid. Explained !
UI
tests
Integration
tests
Unit tests
Reference: WELC
Parametrize Constructor
Extract Interface
Skin and Wrap the API
Refactoring and TDD
Should we inject this dependency?
Behavior of TextReader
TextReader documentation from MSDN
Non-idempotent behavior
Dependency injection and
idempotent behavior
Refactoring and TDD
Exercise 3: Ticket Dispenser
TicketDispenser class:
manages a queuing system in a shop.
There may be more than one ticket dispenser but the same
ticket should not be issued to two different customers.
Exercise 3: Ticket Dispenser
TurnTicket class:
represent the ticket with the turn number.
TurnNumberSequence class:
returns the sequence of turn numbers.
Write the unit tests for the TicketDispenser class.
Refactor the code as much as you need to make the
TicketDispenser class testable.
Exercise 3: Ticket Dispenser
Write the unit tests for the TicketDispenser class.
Refactor the code as much as you need to make the
TicketDispenser class testable.
Minimize changes to the public API as much as you can.
Exercise 3: Ticket Dispenser
Write the unit tests for the TicketDispenser class.
Refactor the code as much as you need to make the
TicketDispenser class testable.
Minimize changes to the public API as much as you can.
Extra credits:
TicketDispenser class fails to follow one or more of the OO
and SOLID principles. Write down the line number, the
principle & the violation.
Exercise 3: Ticket Dispenser
Reference: WELC
Parametrize Constructor
Extract Interface
Skin and Wrap the API
Introduce Instance Delegator
…
Exercise 4: Telemetry System
TelemetryDiagnosticControl class:
establishes a connection to the telemetry server through the
TelemetryClient,
sends a diagnostic request and receives the response with
diagnostic info.
TelemetryClient class:
simulates the communication with the Telemetry Server, sends
requests and then receives and returns the responses
Write the unit tests for the TelemetryDiagnosticControl class.
Refactor the code as much as you need to make the class
testable.
Exercise 4: Telemetry System
Write the unit tests for the TelemetryDiagnosticControl class.
Refactor the code as much as you need to make the class
testable.
Minimize changes to the public API as much as you can.
Exercise 4: Telemetry System
Write the unit tests for the TelemetryDiagnosticControl class.
Refactor the code as much as you need to make the class
testable.
Minimize changes to the public API as much as you can.
Extra credits:
TelemetryClient class fails to follow one or more of the OO and
SOLID principles. Write down the line number, the principle &
the violation.
Exercise 4: Telemetry System
Single Responsibility Principle (SRP)
A class should have only one reason to change.
Single Responsibility Principle (SRP)
There should never be more than one reason for
a class to change.
A class should have one and only one
responsibility.
Interface Segregation Principle (IRP)
Clients should not be forced to depend upon
interfaces that they do not use.
Interface Segregation Principle (IRP)
Clients should not be forced to depend upon
interface members that they don't use.
Interfaces that serve only one scope should be
preferred over fat interfaces.
Reference: SRP
http://www.objectmentor.com/resources/articles/srp.pdf
Pag. 151/152
Synergy between testing and design
Michael Feathers:
writing tests is another way to look the code and
locally understand it and reuse it,
and that is the same goal of good OO design.
This is the reason for
the deep synergy
between testability and good design.
More references
More references
More references
References
 http://scratch.mit.edu/projects/13134082/
 http://vimeo.com/15007792
 http://martinfowler.com/bliki/TestPyramid.html
 http://martinfowler.com/bliki/StranglerApplication.html
 http://www.markhneedham.com/blog/2009/07/07/domain-
driven-design-anti-corruption-layer/
 http://www.objectmentor.com/resources/articles/srp.pdf
 http://www.objectmentor.com/resources/articles/ocp.pdf
 http://www.objectmentor.com/resources/articles/lsp.pdf
 http://www.objectmentor.com/resources/articles/isp.pdf
 http://www.objectmentor.com/resources/articles/dip.pdf
References / Links / Slides
On Twitter
On Twitter :
@S2IL
@LUKADOTNET

More Related Content

PDF
Terraform Ansible v3.0
PDF
OpenShift-Technical-Overview.pdf
PDF
Dot Net Core
PDF
Intro to Vertex AI, unified MLOps platform for Data Scientists & ML Engineers
PDF
Interface Fact Sheets in LeanIX Enterprise Architecture Management
PPTX
Modern CI/CD Pipeline Using Azure DevOps
PPTX
MLOps.pptx
PPTX
2015 Future of Open Source Survey Results
Terraform Ansible v3.0
OpenShift-Technical-Overview.pdf
Dot Net Core
Intro to Vertex AI, unified MLOps platform for Data Scientists & ML Engineers
Interface Fact Sheets in LeanIX Enterprise Architecture Management
Modern CI/CD Pipeline Using Azure DevOps
MLOps.pptx
2015 Future of Open Source Survey Results

What's hot (20)

PDF
Gitops: the kubernetes way
PDF
Observabilidade: Será que você está fazendo do jeito certo?
PDF
Vertex AI Presentation
PDF
Introduction to GitHub Copilot
PPT
Sq lite database
PDF
Introduction to Nexus Repository Manager.pdf
PPTX
Infrastructure-as-Code (IaC) Using Terraform (Advanced Edition)
PDF
Performance optimization for Android
PDF
What is the psychology of testing
PPTX
Major Container Platform Comparison
PPTX
DevOps: Infrastructure as Code
PPTX
Azure DevOps
PDF
Requirements Validation
PPT
Object-Oriented Programming Concepts
PPT
Continuous integration
PPSX
PDF
Architectural katas
PPTX
Requirements validation - requirements engineering
PPT
General introduction to intellij idea
PDF
賣 K8s 的人不敢告訴你的事 (Secrets that K8s vendors won't tell you)
Gitops: the kubernetes way
Observabilidade: Será que você está fazendo do jeito certo?
Vertex AI Presentation
Introduction to GitHub Copilot
Sq lite database
Introduction to Nexus Repository Manager.pdf
Infrastructure-as-Code (IaC) Using Terraform (Advanced Edition)
Performance optimization for Android
What is the psychology of testing
Major Container Platform Comparison
DevOps: Infrastructure as Code
Azure DevOps
Requirements Validation
Object-Oriented Programming Concepts
Continuous integration
Architectural katas
Requirements validation - requirements engineering
General introduction to intellij idea
賣 K8s 的人不敢告訴你的事 (Secrets that K8s vendors won't tell you)
Ad

Similar to Refactoring legacy code driven by tests - ENG (20)

PPTX
Refactoring legacy code driven by tests - ITA
PPT
TDD And Refactoring
PDF
Workshop unit test
PDF
Test Driven iOS Development (TDD)
PPTX
Design Patterns
PPTX
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
PPT
Assessing Unit Test Quality
PPTX
SE2018_Lec 20_ Test-Driven Development (TDD)
PDF
SE2_Lec 21_ TDD and Junit
PPTX
JavaScript Unit Testing
PPTX
Testing the untestable
PPTX
Templates and Exception Handling in C++
PDF
Unit testing - A&BP CC
PDF
Unit Testing & TDD Training for Mobile Apps
PPTX
Test driven development in .Net - 2010 + Eclipse
PPT
RPG Program for Unit Testing RPG
PDF
Unit Testing Fundamentals
PPTX
What is Unit Testing
PPT
Software testing
PPT
Unit testing
Refactoring legacy code driven by tests - ITA
TDD And Refactoring
Workshop unit test
Test Driven iOS Development (TDD)
Design Patterns
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
Assessing Unit Test Quality
SE2018_Lec 20_ Test-Driven Development (TDD)
SE2_Lec 21_ TDD and Junit
JavaScript Unit Testing
Testing the untestable
Templates and Exception Handling in C++
Unit testing - A&BP CC
Unit Testing & TDD Training for Mobile Apps
Test driven development in .Net - 2010 + Eclipse
RPG Program for Unit Testing RPG
Unit Testing Fundamentals
What is Unit Testing
Software testing
Unit testing
Ad

More from Luca Minudel (20)

PPTX
It takes two to tango - why tech and business succeed or fail together v4.1 b...
PPTX
Scrum master self-assessment kit v3.2
PPTX
Project management in the age of accelerating change - IT/Tech specific
PPTX
Project management in the age of accelerating change - general non IT specific
PPTX
Scrum master self assessment v2.7
PPTX
Agility - definition and curricula
PPTX
Agile Delivery Manager self-assessment radar
PPTX
CTO self-assessment radar
PPTX
Reflections on Kent Beck's 3x Explore, Expand, and Extract
PPTX
New Lean-Agile Coach Self-Assessment - detailed descriptions v3
PPTX
From Continuous Integration to Continuous Delivery and DevOps
PPTX
Draft your next training course with ideas from Training from the Back of the...
PPTX
New Lean-Agile Coach self-assessment - levels description v3.2
PPT
Pratica avanzata del refactoring (2004)
PPTX
New Lean-Agile Coach self-assessment radars v3.2
PPT
AgileDay 2006 - Essere agili nel diventare agili
PPT
Architettura del software un approccio Agile, Web-cast Microsoft 2006
PPSX
Agility: The scientific definition of how to be(come) Agile
PPSX
Lightning talk: Active Agility, the magic ingredient of Lean and Agile
PPT
Software development in Formula One: challenges, complexity and struggle for ...
It takes two to tango - why tech and business succeed or fail together v4.1 b...
Scrum master self-assessment kit v3.2
Project management in the age of accelerating change - IT/Tech specific
Project management in the age of accelerating change - general non IT specific
Scrum master self assessment v2.7
Agility - definition and curricula
Agile Delivery Manager self-assessment radar
CTO self-assessment radar
Reflections on Kent Beck's 3x Explore, Expand, and Extract
New Lean-Agile Coach Self-Assessment - detailed descriptions v3
From Continuous Integration to Continuous Delivery and DevOps
Draft your next training course with ideas from Training from the Back of the...
New Lean-Agile Coach self-assessment - levels description v3.2
Pratica avanzata del refactoring (2004)
New Lean-Agile Coach self-assessment radars v3.2
AgileDay 2006 - Essere agili nel diventare agili
Architettura del software un approccio Agile, Web-cast Microsoft 2006
Agility: The scientific definition of how to be(come) Agile
Lightning talk: Active Agility, the magic ingredient of Lean and Agile
Software development in Formula One: challenges, complexity and struggle for ...

Recently uploaded (20)

PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
Cost to Outsource Software Development in 2025
PDF
System and Network Administration Chapter 2
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
Understanding Forklifts - TECH EHS Solution
PDF
iTop VPN Free 5.6.0.5262 Crack latest version 2025
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
How to Choose the Right IT Partner for Your Business in Malaysia
Design an Analysis of Algorithms I-SECS-1021-03
Cost to Outsource Software Development in 2025
System and Network Administration Chapter 2
CHAPTER 2 - PM Management and IT Context
Upgrade and Innovation Strategies for SAP ERP Customers
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Operating system designcfffgfgggggggvggggggggg
Design an Analysis of Algorithms II-SECS-1021-03
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
wealthsignaloriginal-com-DS-text-... (1).pdf
Navsoft: AI-Powered Business Solutions & Custom Software Development
Wondershare Filmora 15 Crack With Activation Key [2025
Adobe Illustrator 28.6 Crack My Vision of Vector Design
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PTS Company Brochure 2025 (1).pdf.......
Softaken Excel to vCard Converter Software.pdf
Understanding Forklifts - TECH EHS Solution
iTop VPN Free 5.6.0.5262 Crack latest version 2025
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025

Refactoring legacy code driven by tests - ENG

  • 1. Refactoring legacy code driven by tests Luca Minudel + Saleem Siddiqui I’m the Refactoring Chicken I’m the TDD egg
  • 2. Let’s clarify the scope of this Workshop
  • 3. Languages supported in this Workshop C# Java JavaScript Ruby Python
  • 5. Scope of this workshop Specification (documentation) DesignVerification
  • 6. Types of Automatic Tests End-to-end, out-of-process, business facing Unit, in-process, technology facing
  • 7. Scope of this workshop End-to-end, out-of-process, business facing Unit, in-process, technology facing
  • 8. Exercise 1: Tire Pressure Monitoring System Alarm class: monitors tire pressure and sets an alarm if the pressure falls outside of the expected range.
  • 9. Exercise 1: Tire Pressure Monitoring System Alarm class: monitors tire pressure and sets an alarm if the pressure falls outside of the expected range. Sensor class: simulates the behavior of a real tire sensor, providing random but realistic values.
  • 10. Exercise 1: Tire Pressure Monitoring System Write the unit tests for the Alarm class. Refactor the code as much as you need to make the Alarm class testable.
  • 11. Exercise 1: Tire Pressure Monitoring System Write the unit tests for the Alarm class. Refactor the code as much as you need to make the Alarm class testable. Minimize changes to the public API as much as you can.
  • 12. Exercise 1: Tire Pressure Monitoring System Write the unit tests for the Alarm class. Refactor the code as much as you need to make the Alarm class testable. Minimize changes to the public API as much as you can. Extra credits: Alarm class fails to follow one or more of the SOLID principles. Write down the line number, the principle & the violation.
  • 13. The SOLID acronym S single responsibility principle O open closed principle L Liskov substitution principle I interface segregation principle D dependency inversion principle
  • 14. Dependency Inversion Principle (DIP) Martin Fowler's definition: 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.
  • 15. Dependency Inversion Principle (DIP) Both low level classes and high level classes should depend on abstractions. High level classes should not depend on low level classes.
  • 16. DIP Violation In Example Code High Level Class Low Level Class Dependency
  • 17. Open Closed Principle (OCP) Bertrand Meyer's definition: Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.
  • 18. Open Closed Principle (OCP) Classes and methods should be open for extensions & strategically closed for modification. So that the behavior can be changed and extended adding new code instead of changing the class.
  • 19. OCP Violation In Example Code Want to use a new type of sensor? Must modify code; cannot extend it
  • 21. Exercise 2: Unicode File To Htm Text Converter UnicodeFileToHtmTextConverter class: formats a plain text file for display in a browser.
  • 22. Exercise 2: Unicode File To Htm Text Converter Write the unit tests for the UnicodeFileToHtmTextConverter class. Refactor the code as much as you need to make the class testable.
  • 23. Exercise 2: Unicode File To Htm Text Converter Write the unit tests for the UnicodeFileToHtmTextConverter class. Refactor the code as much as you need to make the class testable. Minimize changes to the public API as much as you can.
  • 24. Exercise 2: Unicode File To Htm Text Converter Write the unit tests for the UnicodeFileToHtmTextConverter class. Refactor the code as much as you need to make the class testable. Minimize changes to the public API as much as you can. Extra credits: UnicodeFileToHtmTextConverter class fails to follow one or more of the SOLID principles. Write down the line number, the principle & the violation.
  • 25. Feathers’ rules of thumb. Extended ! A test is not a unit test when:  It talks to the database  It communicates across the network  It touches the file system or reads config info  It uses DateTime.now() or Random  It depends on non-deterministic behavior  It can't run at the same time as any of your other unit tests  You have to do special things to your environment (such as editing config files) to run it.
  • 26. Mike Cohn's Test Pyramid. Explained ! UI tests Integration tests Unit tests
  • 27. Reference: WELC Parametrize Constructor Extract Interface Skin and Wrap the API
  • 28. Refactoring and TDD Should we inject this dependency?
  • 29. Behavior of TextReader TextReader documentation from MSDN Non-idempotent behavior
  • 32. Exercise 3: Ticket Dispenser TicketDispenser class: manages a queuing system in a shop. There may be more than one ticket dispenser but the same ticket should not be issued to two different customers.
  • 33. Exercise 3: Ticket Dispenser TurnTicket class: represent the ticket with the turn number. TurnNumberSequence class: returns the sequence of turn numbers.
  • 34. Write the unit tests for the TicketDispenser class. Refactor the code as much as you need to make the TicketDispenser class testable. Exercise 3: Ticket Dispenser
  • 35. Write the unit tests for the TicketDispenser class. Refactor the code as much as you need to make the TicketDispenser class testable. Minimize changes to the public API as much as you can. Exercise 3: Ticket Dispenser
  • 36. Write the unit tests for the TicketDispenser class. Refactor the code as much as you need to make the TicketDispenser class testable. Minimize changes to the public API as much as you can. Extra credits: TicketDispenser class fails to follow one or more of the OO and SOLID principles. Write down the line number, the principle & the violation. Exercise 3: Ticket Dispenser
  • 37. Reference: WELC Parametrize Constructor Extract Interface Skin and Wrap the API Introduce Instance Delegator …
  • 38. Exercise 4: Telemetry System TelemetryDiagnosticControl class: establishes a connection to the telemetry server through the TelemetryClient, sends a diagnostic request and receives the response with diagnostic info. TelemetryClient class: simulates the communication with the Telemetry Server, sends requests and then receives and returns the responses
  • 39. Write the unit tests for the TelemetryDiagnosticControl class. Refactor the code as much as you need to make the class testable. Exercise 4: Telemetry System
  • 40. Write the unit tests for the TelemetryDiagnosticControl class. Refactor the code as much as you need to make the class testable. Minimize changes to the public API as much as you can. Exercise 4: Telemetry System
  • 41. Write the unit tests for the TelemetryDiagnosticControl class. Refactor the code as much as you need to make the class testable. Minimize changes to the public API as much as you can. Extra credits: TelemetryClient class fails to follow one or more of the OO and SOLID principles. Write down the line number, the principle & the violation. Exercise 4: Telemetry System
  • 42. Single Responsibility Principle (SRP) A class should have only one reason to change.
  • 43. Single Responsibility Principle (SRP) There should never be more than one reason for a class to change. A class should have one and only one responsibility.
  • 44. Interface Segregation Principle (IRP) Clients should not be forced to depend upon interfaces that they do not use.
  • 45. Interface Segregation Principle (IRP) Clients should not be forced to depend upon interface members that they don't use. Interfaces that serve only one scope should be preferred over fat interfaces.
  • 47. Synergy between testing and design Michael Feathers: writing tests is another way to look the code and locally understand it and reuse it, and that is the same goal of good OO design. This is the reason for the deep synergy between testability and good design.
  • 51. References  http://scratch.mit.edu/projects/13134082/  http://vimeo.com/15007792  http://martinfowler.com/bliki/TestPyramid.html  http://martinfowler.com/bliki/StranglerApplication.html  http://www.markhneedham.com/blog/2009/07/07/domain- driven-design-anti-corruption-layer/  http://www.objectmentor.com/resources/articles/srp.pdf  http://www.objectmentor.com/resources/articles/ocp.pdf  http://www.objectmentor.com/resources/articles/lsp.pdf  http://www.objectmentor.com/resources/articles/isp.pdf  http://www.objectmentor.com/resources/articles/dip.pdf
  • 52. References / Links / Slides On Twitter On Twitter : @S2IL @LUKADOTNET

Editor's Notes

  • #5: The triangle in action: http://scratch.mit.edu/projects/13134082/
  • #9: They could be code you inherited from a legacy code-base.
  • #22: They could be code you inherited from a legacy code-base.
  • #27: http://martinfowler.com/bliki/TestPyramid.html http://martinfowler.com/bliki/StranglerApplication.html http://www.markhneedham.com/blog/2009/07/07/domain-driven-design-anti-corruption-layer/
  • #33: They could be code you inherited from a legacy code-base.
  • #34: They could be code you inherited from a legacy code-base.
  • #39: They could be code you inherited from a legacy code-base.
  • #48: Michael Feathers, NDC 2010 The Deep Synergy Between Testability and Good Design http://vimeo.com/15007792 http://michaelfeathers.typepad.com/michael_feathers_blog/2007/09/the-deep-synerg.html
  • #49: http://martinfowler.com/bliki/TestPyramid.html http://martinfowler.com/bliki/StranglerApplication.html http://www.markhneedham.com/blog/2009/07/07/domain-driven-design-anti-corruption-layer/