GLO-4002 - Site du cours 2024

Temps estimé: 1h

Implanter un Repository en Java

Vous êtes maintenant l'heureux-euse propriétaire d'un garage automobile. Pour offrir une meilleure qualité de service à vos clients, vous décidez de programmer un logiciel simple qui fait le suivi de chaque service effectué.

Le logiciel permet, entre autres, de traiter les scénarios suivants:

Scenario: The one where I swap wheels of a car
  Given the following car:
  | serial number | mileage | front left wheel | front right wheel | rear left wheel | rear right wheel | last oil change date | last oil change mileage |
  | QC38822R83F   | 41736   | 81248233         | 81248234          | 81248235        | 81248236         | 2020-01-01           | 28756                   |
  When I swap 'front left' and 'rear left' wheels of car 'QC38822R83F'
  Then wheel '81248233' should be at position 'rear left'
   And wheel '81248235' should be at position 'front left'
Scenario: The one where I change engine oil of a car
  Given the following car:
  | serial number | mileage | front left wheel | front right wheel | rear left wheel | rear right wheel | last oil change date | last oil change mileage |
  | QC38822R83F   | 41736   | 81248233         | 81248234          | 81248235        | 81248236         | 2020-01-01           | 28756                   |
   And today is '2020-09-25'
  When I change oil of car 'QC38822R83F'
  Then last oil change date is '2020-09-25'
   And last oil change mileage is '41736'

Pour cet exercice, bien que cela pourrait grandement vous aider à définir le/les bon(s) contrat(s) et à pratiquer vos compétences de conception OO, il n'est pas nécessaire d'implémenter les scénarios. Le but est simplement d'implémenter un ou plusieurs Repository pour satisfaire les cas d'utilisation présentés ci-dessus.

Vous devez tenter d'implémenter deux repositories différents, un qui lit les données à partir de fichiers JSON et un autre qui lit les données à partir d'une base de données SQLite. Vous pouvez utiliser les données fournies ci-dessous pour tester votre implémentation.

Implémentation JSON

L'implémentation JSON du repository sera en lecture seule, avec des fichiers JSON dans les ressources du projet.

Implémentation SQLite

Vous pouvez pour ce repository utiliser directement le connecteur jdbc ou un ORM comme Hibernate.

Attention de ne pas faire "leaké" votre choix de techno partout dans le code, tout ce qui a rapport à la persistence devrait rester confiné dans la couche infrastructure.

Défi OO

Mettez en place une façon de changer entre un repository ou l'autre sans que le code (autre que le démarrage de l'application) ne soit affecté. Une bonne application du polymorphisme est de mise. Des patrons de conception (design patterns) tels que la Factory peuvent également être judicieux.

Il est conseillé de d'abord tenter de faire l'injection des dépendances manuellement, sans outils. Par contre, si vous désirez par la suite tenter avec un outil d'injection de dépendance, vous pouvez utiliser un conteneur d'IoC de votre choix (exemple : Guice).

Il existe plusieurs façons d'exécuter un programme avec différents paramètres en Java. Par exemple, vous pouvez utiliser les propriétés (fichier .properties ou -Dkey=value) ou les arguments du programme (args[]) ou encore les variables d'environnement. Vous pouvez choisir la méthode qui vous semble la plus appropriée, ou expérimenter avec plusieurs.

Données de base

[
  {
    "serial_number": "QC38822R83F",
    "brand": "Toyota",
    "model": "Rav4",
    "year": "2019",
    "mileage": 41736,
    "id": 237
  },
  {
    "serial_number": "QC87594A39Y",
    "brand": "Nissan",
    "model": "GT-R Nismo",
    "year": "2014",
    "mileage": 11622,
    "id": 430
  }
]
[
  {
    "serial_number": "81248233",
    "brand": "Toyo Tires",
    "model": "PROXES TM1 Ultra High Performance",
    "size": "195R50-15",
    "position": "FL",
    "mileage_installation": 34250,
    "car_id": 430
  },
  {
    "serial_number": "81248234",
    "brand": "Toyo Tires",
    "model": "PROXES TM1 Ultra High Performance",
    "size": "195R50-15",
    "position": "FR",
    "mileage_installation": 34250,
    "car_id": 430
  },
  {
    "serial_number": "81248235",
    "brand": "Toyo Tires",
    "model": "PROXES TM1 Ultra High Performance",
    "size": "195R50-15",
    "position": "RL",
    "mileage_installation": 34250,
    "car_id": 430
  },
  {
    "serial_number": "81248236",
    "brand": "Toyo Tires",
    "model": "PROXES TM1 Ultra High Performance",
    "size": "195R50-15",
    "position": "RR",
    "mileage_installation": 34250,
    "car_id": 430
  },
  {
    "serial_number": "B1234785",
    "brand": "Bridgestone",
    "model": "Dueler A/T Revo 3",
    "size": "P225/75/16",
    "position": "FL",
    "mileage_installation": 1543,
    "car_id": 237
  },
  {
    "serial_number": "B1234786",
    "brand": "Bridgestone",
    "model": "Dueler A/T Revo 3",
    "size": "P225/75/16",
    "position": "FR",
    "mileage_installation": 1543,
    "car_id": 237
  },
  {
    "serial_number": "B1234787",
    "brand": "Bridgestone",
    "model": "Dueler A/T Revo 3",
    "size": "P225/75/16",
    "position": "RL",
    "mileage_installation": 1543,
    "car_id": 237
  },
  {
    "serial_number": "B1234788",
    "brand": "Bridgestone",
    "model": "Dueler A/T Revo 3",
    "size": "P225/75/16",
    "position": "RR",
    "mileage_installation": 1543,
    "car_id": 237
  }
]
[
  {
    "car_id": 237,
    "changed_at_date": "2019-04-21",
    "changed_at_mileage": 11235
  },
  {
    "car_id": 237,
    "changed_at_date": "2019-12-16",
    "changed_at_mileage": 15280
  },
  {
    "car_id": 237,
    "changed_at_date": "2020-02-06",
    "changed_at_mileage": 18199
  },
  {
    "car_id": 430,
    "changed_at_date": "2020-01-01",
    "changed_at_mileage": 9491
  }
]

Il n'y a pas qu'une seule solution à cet exercice. Le plus important est de comprendre les compris de chacun des choix que vous avez faits. Vous pouvez en parler à votre assistant ou à vos coéquipiers si vous désirez avoir des commentaires.

Si vous êtes bloqués et désirez avoir un coup de pouce, vous pouvez regarder ce dépôt GitHub pour avoir une solution partielle au problème (bien lire le README.md).