# 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="https://1936518372-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MAffO8xa1ZWmgZvfeK2%2Fuploads%2FPLexecD4aMoBE3qz923A%2Fimage.png?alt=media&#x26;token=ac7c888b-7275-4cda-9cac-3146203d70db" 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="https://1936518372-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MAffO8xa1ZWmgZvfeK2%2Fuploads%2FOD2qbnQdjwXl3P5DWTKe%2Fimage.png?alt=media&#x26;token=82c854ad-5a18-45e0-8e30-52c10e4cf0bc" 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="https://1936518372-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MAffO8xa1ZWmgZvfeK2%2Fuploads%2FlJ0w6EvKi1RkngvVxLST%2Fexample-mapping.webp?alt=media&#x26;token=c519862f-7733-4f78-82a4-d549f448ed66" 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="https://1936518372-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MAffO8xa1ZWmgZvfeK2%2Fuploads%2FfR94jI8KJb3tkE6IwDcW%2Fimage.png?alt=media&#x26;token=b44500d3-5188-45aa-9f91-cab8d42d2dc3" 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="refactoring-du-bouchonnois/1-se-faire-une-idee-du-code" %}
[1-se-faire-une-idee-du-code](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/1-se-faire-une-idee-du-code)
{% endcontent-ref %}

{% content-ref url="refactoring-du-bouchonnois/2-treat-warnings-as-errors" %}
[2-treat-warnings-as-errors](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/2-treat-warnings-as-errors)
{% endcontent-ref %}

{% content-ref url="refactoring-du-bouchonnois/3-lets-kill-some-mutants" %}
[3-lets-kill-some-mutants](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/3-lets-kill-some-mutants)
{% endcontent-ref %}

{% content-ref url="refactoring-du-bouchonnois/4-ameliorer-la-lisibilite-des-tests" %}
[4-ameliorer-la-lisibilite-des-tests](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/4-ameliorer-la-lisibilite-des-tests)
{% endcontent-ref %}

{% content-ref url="refactoring-du-bouchonnois/5-approve-everything" %}
[5-approve-everything](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/5-approve-everything)
{% endcontent-ref %}

{% content-ref url="refactoring-du-bouchonnois/6-definir-des-proprietes" %}
[6-definir-des-proprietes](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/6-definir-des-proprietes)
{% endcontent-ref %}

{% content-ref url="refactoring-du-bouchonnois/7-tests-darchitecture" %}
[7-tests-darchitecture](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/7-tests-darchitecture)
{% endcontent-ref %}

{% content-ref url="refactoring-du-bouchonnois/8-use-cases" %}
[8-use-cases](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/8-use-cases)
{% endcontent-ref %}

{% content-ref url="refactoring-du-bouchonnois/9-tell-dont-ask" %}
[9-tell-dont-ask](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/9-tell-dont-ask)
{% endcontent-ref %}

{% content-ref url="refactoring-du-bouchonnois/10-avoid-primitives-commands" %}
[10-avoid-primitives-commands](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/10-avoid-primitives-commands)
{% endcontent-ref %}

{% content-ref url="refactoring-du-bouchonnois/11-avoid-exceptions" %}
[11-avoid-exceptions](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/11-avoid-exceptions)
{% endcontent-ref %}

{% content-ref url="refactoring-du-bouchonnois/12-event-sourcing" %}
[12-event-sourcing](https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/code-katas/refactoring-du-bouchonnois/12-event-sourcing)
{% endcontent-ref %}
