# 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
