J'ai un grand projet java et nous utilisons maven pour notre cycle de construction. Ce projet est largement utilisé - dans d'autres projets, dans diverses applications, dont certains y sont contenus et d'autres ailleurs ... Pour être honnête, c'est un peu le bordel (divers bits ajoutés à différents moments pour des fins), et je voudrais le nettoyer un peu. De plus, il n'est pas entièrement testé (beaucoup de bits ont été ajoutés sans tests d'unité et d'intégration appropriés), et il y a des tests qui prennent beaucoup de temps à exécuter ou qui ne passent pas réellement ... (uh-oh) - donc les tests sont désactivés dans le cycle de construction de maven (encore une fois, uh-oh).
Je pense à séparer ce grand projet en plus petits projets spécifiques, de telle sorte que le sous-projet «final» (ou plusieurs sous-projets) reprendrait les différents sous-projets dont il aurait besoin.
Ma pensée est la suivante:
- si je sépare le grand projet en plusieurs sous-projets, cela montre clairement quelle est la responsabilité de chaque projet.
- en me séparant en sous-projets, je peux ensuite nettoyer les tests de chaque sous-projet individuellement et activer les tests de ce sous-projet dans le cycle de construction de maven.
Je suis légèrement préoccupé par l'impact que cela pourrait avoir sur le temps de construction.
- L'imposition d'une structure sur le grand projet (c'est-à-dire dans des sous-projets plus petits) ralentirait-elle le compilateur?
De plus, j'ai une légère inquiétude sur l'impact que cela pourrait avoir sur le temps d'édition dans les IDE (nous utilisons principalement Intellij). Intellij semble construire chaque projet tour à tour à travers l'arbre de dépendance - c'est-à-dire que si C dépend de B dépend de A, et je change A, il n'essaiera pas de construire B à moins que A ne compile, et ainsi de suite. C'est sans doute avantageux, mais j'ai constaté que si - par exemple, je change une interface en A qui est largement utilisée en B et C, il faut un certain temps pour corriger toutes les erreurs de ce changement ...
Une autre question est de savoir comment utiliser les classes d'usine. Certains aspects du projet dépendent de pots externes. De temps en temps (heureusement pas souvent), ceux-ci sont mis à jour et nous devons migrer. Nous avons tendance à gérer cela en utilisant une classe Factory qui pointe vers les versions correctes du code externe (nous n'avons donc pas à modifier toutes les implémentations dans la base de code).
Pour le moment, tout cela fait partie du grand projet, mais je pense qu'en passant à des sous-projets, je pourrais développer un nouveau projet pour la mise en œuvre d'un nouveau code externe, m'assurer que le sous-projet est entièrement fonctionnel et testé, et puis changez les dépendances / classe d'usine dans le projet utilisateur. Cependant, cela est rendu plus compliqué par l'utilisation extensive d'interfaces tout au long du grand projet. Par exemple
- sous-projet A - contient des interfaces
- sous-projet B - dépend de A pour les interfaces et l'ancien pot externe
- sous-projet C - dépend de B (et donc de A et de l'ancien pot externe), et contient une classe Factory qui utilise les implémentations d'interfaces de B
Si je dois changer le pot externe de B, je peux:
- créer le sous-projet B_ii - dépend à nouveau de A, et maintenant le nouveau pot externe
- une fois pleinement fonctionnel, je peux ajouter la dépendance de C à B_ii, et changer la classe Factory pour utiliser les nouvelles implémentations d'interfaces.
lorsque tout fonctionne, je peux ensuite supprimer la dépendance de C par rapport au B d'origine et, si vous le souhaitez, supprimer le sous-projet B.
Est-ce une façon sensée de procéder?
Donc, en général, mes questions sont:
- Quelqu'un a-t-il une expérience de la rupture de grands projets? Y a-t-il des conseils / astuces que vous seriez prêt à partager?
- Quel impact cela a-t-il eu sur vos temps de développement et de construction?
- Quels conseils pourriez-vous offrir pour structurer une telle rupture d'un tel projet?