Application Java
2026
Ma Ville
Une application Java qui permet aux résidents de Montréal de voir les travaux en cours dans leur rue, et aux intervenants de trouver les demandes déposées et d'y soumissionner.
La ville publie tout ça en données ouvertes, et rien n'est lisible par un humain. J'ai pris un projet d'équipe qui fonctionnait et j'en ai fait quelque chose qu'un autre développeur peut reprendre.
- Passage du projet à Maven pour qu'un clone neuf compile. Avant ça, il ne compilait que dans les IDE où on l'avait écrit.
- Découpe de deux très grosses classes en plus petites : Resident.java de 780 lignes à 106, et Menu.java de 579 à 97.
- 6 bogues trouvés et corrigés en retirant du code dupliqué, et la suite de tests passée de 9 à 35.
- Java 17
- Maven
- JUnit 4
- Gson
- REST / JSON
- Données ouvertes de Montréal
Ce qu'a révélé la découpe d'une classe de 780 lignes
- Resident.java
- 780 → 106 lignes
- Menu.java
- 579 → 97 lignes
- Suite de tests
- 9 → 35 tests
- Bogues de duplication trouvés
- 6
Les écrans, un client HTTP, l'analyse JSON et les lectures au clavier en sont sortis. Il reste les sept champs d'une personne et les deux opérations qui lui appartiennent.
Les deux écrans de connexion, les deux écrans d'inscription, les deux menus principaux et cinq validateurs de saisie en sont sortis. La classe choisit maintenant entre se connecter et s'inscrire.
Sur 6 fichiers, contre 3. L'ancienne suite avait besoin d'une API tierce en direct pour passer ; mvn test n'a plus besoin ni de réseau ni de terminal.
Chacun est apparu en fusionnant des copies du même code. Ils sont listés dans le commit qui les a supprimés.
On était trois à construire ça pour un cours et ça marchait très bien sur nos machines. C'était justement le problème. JUnit et Hamcrest étaient versionnés en fichiers jar, et Gson passait par un réglage IntelliJ qui pointait vers un dossier sur le portable de quelqu'un. N'importe qui d'autre qui clonait obtenait un mur d'erreurs. Passer à Maven a été la première chose que j'ai faite.
La partie que j'ai trouvée la plus intéressante, c'est la découpe de Resident.java. 780 lignes qui faisaient environ cinq métiers à la fois : garder les informations d'une personne, dessiner les écrans, appeler l'API de la ville, analyser le JSON et lire le clavier. J'ai sorti le réseau et l'analyse dans leur propre paquet, et les écrans dans un autre. Ça a fait remonter un bogue que j'aime bien : la liste des dix types de travaux existait en trois copies séparées qui avaient divergé, donc l'option 8 affichait « Travaux résidentiel » sur un écran et « Travaux résidentiels » sur un autre. Un résident pouvait déposer une requête et ne jamais la retrouver. C'est une seule énumération maintenant, avec un test qui échoue si les libellés cessent de concorder.
La plupart des bogues que j'ai trouvés venaient de la même cause : la même logique écrite plus d'une fois. L'autre chose que j'en retiens, c'est que séparer le code qui va chercher du code qui analyse est ce qui a permis aux tests de tourner sans réseau. L'ancienne suite avait un test qui appelait l'API de la ville en direct, donc la compilation échouait sur toute machine qui ne pouvait pas l'atteindre.
