Refactoring with the Sandwich pattern

Thursday afternoon 14:00 - 16:00 CET (UTC+1)


Sepehr Namdar and Hadi Ahmadi


In this session, we’ll try to solve a very common problem in software development teams: dealing with legacy procedural code without tests.

In the Sandwich pattern, we start from a class (generally an Application Service). We identify where it uses shared state (generally from a database). Then we push that code to its extremes (up and down) between which we have an immutable domain model that we can interact with.

The idea is to protect our code using Approval Tests and refactor this procedural code to domain-centric code. We’ll use good practices to finally reach services that correspond to the Sandwich pattern and coherent rich domain objects containing business behaviours.

In between exercises, we’ll discuss:

  • How Temporal Coupling can help us to respect our use case
  • What is a pure and isolated Domain model?
  • Understanding Domain Completeness
  • What is the difference between an Application Service & a Domain Service ?
  • Does Sandwich pattern helps us to make clean Domain Services ?

The exercises will be available in Java and C#.

Practical information

Before starting the session, please make sure that you can clone this repository and run tests :


C# :

About Sepehr Namdar

Technology agnostic developer, DDD Iran organiser and DDD Teacher Twitter LinkedIn Company Website GitHub

Interested in Agile practices, Craft and Architecture and having had the opportunity to work in various development teams, I acquired the knowledge on all phases of software development. I believe that the sucess of a product (i.e. software) does not depend on technologies that we use but a good understanding of business needs and on the methodologies applied during its development.

About Hadi Ahmadi

Independent Software Architect, Consultant, DDD Teacher, Co-Founder of DDD Iran Community Twitter LinkedIn

With over 10 years of experience in Software development, I am a Technical Leader, Architect and Designer. Passionate for Software design & Architecture (specially DDD, CQRS & Event Sourcing) and Agile practices such as TDD and BDD with an in depth knowledge of OOP, GoF Design Patterns, SOLID Principles and Integration Patterns.