> For the complete documentation index, see [llms.txt](https://yoan-thirion.gitbook.io/knowledge-base/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois.md).

# Refactoring du Bouchonnois

Ce kata a pour objectif de s'exercer au refactoring sur un code existant afin de :

* Identifier certains `smells` dans notre code
* Comprendre quelles pratiques et/ou outils peuvent nous aider pour surpasser ces `smells`
* Pratiquer dans 1 environnement `safe` en dehors de son code de production

<figure><img src="/files/T2j01IGaaMmO44G0Vgu7" alt=""><figcaption></figcaption></figure>

## Cloner le code

Le kata est disponible sur github [ici](https://github.com/ythirion/refactoring-du-bouchonnois/).

## Le contexte

Nos vaillants chasseurs du Bouchonnois ont besoin de pouvoir gérer leurs parties de chasse.\
Ils ont commencé à faire développer 1 système de gestion par l'entreprise `Toshiba` mais ne sont pas satisfaits.

L'entreprise leur parle d'une soit-disante `dette technique` qui les ralentit dans le développement de nouvelles features...

<figure><img src="/files/vJX7OcsU93GgTgxZ3GE0" alt=""><figcaption></figcaption></figure>

> Les chasseurs comptent sur nous pour améliorer la situation.

## Example Mapping

Ils ont fait quelques ateliers avec `Toshiba` et ont réussi à clarifier ce qui est attendu du système. Pour ce faire, ils ont utilisé le format `Example Mapping` à découvrir [ici](https://xtrem-tdd.netlify.app/Flavours/example-mapping).

Voici l'Example Mapping qui a servi d'alignement pour développer ce système.

<figure><img src="/files/C4mvBka5EW2FggzG2KSP" alt=""><figcaption><p>Example Mapping du Bouchonnois</p></figcaption></figure>

Version PDF disponible [ici](https://github.com/ythirion/refactoring-du-bouchonnois/blob/main/example-mapping/example-mapping.pdf).

## Facilitation

### Pré-requis

Le code est disponible en `.NET 7`.

Voici la liste des packages utilisés :

* `xUnit`
* `FluentAssertions`
* `Verify.xUnit`
* `FSCheck`
* `TngTech.ArchUnitNET.xUnit`
* `LanguageExt.Core`
* `FluentAssertions.LanguageExt`

### Guide

Chaque étape comprend :

* un "guide" de facilitation
* une proposition de solution "*étape par étape*"

> 1 branche / étape avec le code source associé

<figure><img src="/files/eskk5Nlgt7ABotfu4tCs" alt=""><figcaption></figcaption></figure>

## Objectifs pédagogiques

À travers ces différentes étapes j'ai essayé d'introduire les sujets suivants :

* Example Mapping
* Static Code Analysis / Linter
* Treat Warnings as Errors
* Mutation Testing
* Test Data Builders
* Approval Testing
* Automated Refactoring
* Property-Based Testing
* Tests d'Architecture
* Test-Driven Development
* Clean Architecture
* Domain Driven Design
* Tell Don't Ask
* Functional Programming
* Avoid Primitives
* Avoid Exceptions
* Architecture Decision Records
* Event Sourcing
* ...

Bon voyage 🤩

### Proposition de solution

Afin d'améliorer le code on te propose de suivre les étapes ci-dessous :&#x20;

{% content-ref url="/pages/NHcmSvhpL4fapMwfKYIm" %}
[1) Se faire une idée du code](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/1-se-faire-une-idee-du-code.md)
{% endcontent-ref %}

{% content-ref url="/pages/mvPWNBohcNJK3U3TX7k2" %}
[2) "Treat warnings as errors"](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/2-treat-warnings-as-errors.md)
{% endcontent-ref %}

{% content-ref url="/pages/6FxiI91u1IjP0cC1Tyl4" %}
[3) Let's kill some mutants](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/3-lets-kill-some-mutants.md)
{% endcontent-ref %}

{% content-ref url="/pages/SDXoNhrnw1n2e9ymI3pA" %}
[4) Améliorer la lisibilité des tests](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/4-ameliorer-la-lisibilite-des-tests.md)
{% endcontent-ref %}

{% content-ref url="/pages/pB4NbJm5zx8RmtOVhNvQ" %}
[5) "Approve Everything"](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/5-approve-everything.md)
{% endcontent-ref %}

{% content-ref url="/pages/NwF6yS7DY7gujtL3sAwS" %}
[6) Définir des propriétés](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/6-definir-des-proprietes.md)
{% endcontent-ref %}

{% content-ref url="/pages/z63N5lL8M3zAMbmDeJWt" %}
[7) Tests d'architecture](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/7-tests-darchitecture.md)
{% endcontent-ref %}

{% content-ref url="/pages/wFVbbsKQU0cYBlMSQJhX" %}
[8) Use Cases](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/8-use-cases.md)
{% endcontent-ref %}

{% content-ref url="/pages/v79mqjh6tLXLLQYnHouc" %}
[9) Tell Don't Ask](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/9-tell-dont-ask.md)
{% endcontent-ref %}

{% content-ref url="/pages/pzHd1gLIEm9fSBYKzQMj" %}
[10) "Avoid Primitives" - Commands](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/10-avoid-primitives-commands.md)
{% endcontent-ref %}

{% content-ref url="/pages/uL5GRAEEO0T5dBvzoJiN" %}
[11) "Avoid Exceptions"](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/11-avoid-exceptions.md)
{% endcontent-ref %}

{% content-ref url="/pages/KavRA7h4UXoIaAohxlbI" %}
[12) "Event Sourcing"](/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/12-event-sourcing.md)
{% endcontent-ref %}
