39 votes

Comment dois-je visualiser la structure de mon code ?

J'ai une application écrite en Java. Elle est stockée dans plusieurs fichiers. Elle utilise différentes classes avec différentes méthodes. Le code est gros et compliqué. Je pense qu'il serait plus facile de comprendre le code si j'avais un modèle graphique du code (une sorte de graphe dirigé). Existe-t-il des méthodes standard pour la visualisation du code ? Je pense à l'utilisation d'UML (je ne suis pas sûr que ce soit un bon choix). Quelqu'un peut-il me recommander quelque chose ?

AJOUTÉ :

J'envisage deux possibilités :

  1. Créer le graphique à la main (de manière explicite).
  2. Créer un graphique de manière automatique. Par exemple, utiliser des outils qui lisent le code disponible et génèrent un graphique décrivant la structure du code.

AJOUTÉ 2 :

Ce serait bien d'avoir quelque chose de gratuit.

25voto

Vineet Points 545

J'ai essayé d'utiliser un certain nombre d'outils UML et j'ai constaté que les capacités de rétro-ingénierie de la plupart des outils UML étaient les suivantes pas utile pour comprendre le code . Ils se concentrent sur les besoins de conception et les capacités de rétro-ingénierie finissent souvent par montrer d'énormes images contenant de nombreuses informations inutiles. Lorsque je travaillais sur le code de Microsoft Office, j'ai trouvé l'utilisation d'un stylo et d'un papier plus utile que les outils de conception/modélisation typiques.

En général, vous devez penser à le faire de plusieurs manières :

  1. Utilisez votre cerveau : Quelqu'un d'autre l'a mentionné - rien ne remplace le fait d'essayer réellement de comprendre une base de code. Vous devrez peut-être prendre des notes et vous y référer plus tard. Les outils peuvent-ils aider ? Sans aucun doute. Mais ne vous attendez pas à ce qu'ils fassent le gros du travail à votre place.
  2. Trouver de la documentation et parler aux collègues de travail : Il n'y a pas de meilleur moyen que de demander à une source de décrire les principales concepts dans une base de données. Si vous pouvez trouver quelqu'un pour vous aider, prenez un stylo et du papier, allez le voir et prenez beaucoup de notes. Jusqu'à quel point faut-il embêter l'autre personne ? Au début - autant que cela est pratique pour votre travail, mais aucune quantité n'est trop faible.
  3. Pensez aux outils : Si vous êtes nouveau dans une partie d'un projet - vous allez passer une quantité importante de temps à comprendre le code, alors voyez quelle aide vous pouvez obtenir automatiquement. Il y a de bons et de mauvais outils. Essayez d'abord de déterminer quels outils ont des capacités qui pourraient vous être utiles. Comme je l'ai mentionné plus haut, l'outil UML moyen se concentre davantage sur la modélisation et ne semble pas être le bon outil pour vous.
  4. Temps et coût : Bien sûr, la gratuité est une bonne chose. Mais si un outil gratuit n'est pas utilisé par beaucoup de gens, c'est peut-être parce qu'il ne fonctionne pas. Il existe de nombreux outils qui ont été créés juste pour explorer ce qui pouvait être fait, mais qui ne sont pas vraiment utiles et qui sont donc mis à disposition gratuitement dans l'espoir que quelqu'un d'autre les adopte. Une autre façon de voir les choses est de décider de la valeur de votre temps. Il peut être judicieux de consacrer un jour ou deux à l'élaboration d'un outil qui fonctionne pour vous.

Une fois sur place, gardez-les à l'esprit lorsque vous essayez de comprendre le projet :

  1. Le point de vue de Mile High : Un diagramme d'architecture en couches peut être très utile pour savoir comment les principaux éléments de l'architecture de l'entreprise sont utilisés. concepts dans un projet sont liés les uns aux autres. Des outils comme Lattix y Architexa peut être très utile ici.
  2. Le noyau : Essayez de comprendre comment le code fonctionne en ce qui concerne la principaux concepts . Les diagrammes de classe sont exceptionnellement utiles ici. Le stylo et le papier fonctionnent assez souvent ici, mais les outils peuvent non seulement accélérer le processus, mais aussi vous aider à sauvegarder et à partager ces diagrammes. Je pense AgileJ y Architexa sont vos meilleurs paris ici, mais votre outil UML moyen peut souvent être assez bon.
  3. Principaux cas d'utilisation : Je vous suggère de tracer au moins un cas d'utilisation clé pour votre application. Vous pouvez probablement obtenir les cas d'utilisation les plus importants auprès de n'importe quel membre de votre équipe, et les étudier sera très utile. La plupart des IDE sont très utiles à cet égard. Si vous essayez de les dessiner, les diagrammes de séquence sont les plus appropriés. Pour les outils, je pense que MaintenirJ , JDeveloper y Architexa sont vos meilleurs paris ici.

Note : Je suis le fondateur d'Architexa - nous créons des outils pour vous aider. comprendre et documenter le code Java mais j'ai essayé d'être impartial ci-dessus. Mon intention est de suggérer des outils et des options, étant donné que c'est ce sur quoi je me suis concentré dans le cadre de mon doctorat.

20voto

Erick Robertson Points 12958

L'outil le plus important que vous devez utiliser est votre cerveau, et il est gratuit.

Il n'y a aucune raison d'utiliser une quelconque méthode standard de visualisation, et vous pouvez utiliser le média de votre choix. Papier, tableau blanc, photoshop, visio, powerpoint, bloc-notes : tous ces supports peuvent être efficaces. Dessinez un diagramme de classes, d'objets, de méthodes, de propriétés, de variables - tout ce que vous pensez utile de voir pour comprendre l'application. Le public n'est pas seulement composé des autres membres de votre équipe, mais aussi de vous-même. Créez des diagrammes que vous pouvez regarder et comprendre rapidement. Affichez-les dans votre espace de travail et regardez-les régulièrement pour vous rappeler l'architecture globale du système au fur et à mesure que vous le construisez.

Les normes UML et autres normes de documentation de code constituent de bonnes lignes directrices pour les types de diagrammes que vous pouvez réaliser et les informations que vous devez envisager d'inclure. Cependant, elles sont excessives pour la plupart des applications et existent essentiellement pour les personnes qui ne peuvent pas prendre la responsabilité personnelle de documenter sans normes. Si vous suivez UML à la lettre, vous finirez par passer beaucoup trop de temps sur votre documentation au lieu de créer votre application.

14voto

Il est stocké dans plusieurs fichiers. Il utilise différentes classes avec différentes méthodes. Le code est gros et compliqué.

Tout le code Java écrit en dehors de l'école est comme ça, en particulier pour un nouveau développeur qui commence un projet.

Il s'agit d'une ancienne question, mais comme elle apparaît dans les recherches Google, j'ajoute ma réponse ici afin qu'elle puisse être utile aux futurs visiteurs. Permettez-moi également de préciser que je suis l'auteur de MaintenirJ .

N'essayez pas de comprendre l'ensemble de l'application

Laissez-moi vous poser la question suivante : pourquoi voulez-vous comprendre le code ? Il est fort probable que vous soyez en train de corriger un bogue ou d'améliorer une fonctionnalité de l'application. La première chose que vous ne devriez pas essayer de faire est de comprendre l'ensemble de l'application. Essayer de comprendre l'ensemble de l'architecture en commençant un nouveau projet ne fera que vous submerger.

Croyez-moi quand je dis ceci : des développeurs ayant plus de 10 ans d'expérience solide en codage peuvent ne pas comprendre comment certaines parties de l'application fonctionnent même après avoir travaillé sur le même projet pendant plus d'un an (en supposant qu'ils ne soient pas les développeurs originaux). Ils peuvent ne pas comprendre comment l'authentification fonctionne ou comment la gestion des transactions fonctionne dans l'application. Je parle ici d'applications d'entreprise typiques comportant 1000 à 2000 classes et utilisant différents frameworks.

Deux compétences importantes requises pour la maintenance de grandes applications

Alors comment font-ils pour survivre et être payés grassement ? Les développeurs expérimentés comprennent généralement ce qu'ils font ; autrement dit, s'ils doivent corriger un bogue, ils trouveront l'emplacement du bogue, puis le corrigeront et s'assureront qu'il ne casse pas le reste de l'application. S'ils doivent améliorer une fonctionnalité ou en ajouter une nouvelle, la plupart du temps, il leur suffit d'imiter une fonctionnalité existante qui fait une chose similaire.

Deux compétences importantes les aident à le faire.

  1. Ils sont capables d'analyser l'impact du ou des changements qu'ils effectuent en corrigeant un bogue. Ils commencent par localiser le problème, modifient le code et le testent pour s'assurer qu'il fonctionne. Ensuite, parce qu'ils connaissent bien le langage Java et les frameworks, ils peuvent dire si cela va casser d'autres parties de l'application. Si ce n'est pas le cas, ils ont terminé.

  2. J'ai dit qu'ils devaient simplement imiter pour améliorer l'application. Pour imiter efficacement, il faut bien connaître Java et comprendre les frameworks "suffisamment bien". Par exemple, lorsqu'ils ajoutent une nouvelle classe Struts Action et l'ajout au xml de configuration, ils vont d'abord trouver une fonctionnalité similaire, essayer de suivre le flux de cette fonctionnalité et comprendre comment elle fonctionne. Il se peut qu'il doive modifier un peu la configuration (par exemple, les données du "formulaire" se trouvent dans la portée de la "requête" plutôt que dans celle de la "session"). Mais s'ils connaissent suffisamment bien les frameworks, ils peuvent facilement le faire.

L'essentiel est que, vous n'avez pas besoin de comprendre ce que font les classes 2000 pour corriger un bug ou améliorer l'application. Comprenez juste ce qui est nécessaire.

Se concentrer sur la fourniture d'une valeur immédiate

Alors, est-ce que je vous décourage de comprendre l'architecture ? Non, pas du tout. Tout ce que je vous demande, c'est de tenir vos promesses. Une fois que vous commencez un projet et que vous avez mis en place l'environnement de développement sur votre PC, vous ne devriez pas prendre plus d'une semaine pour livrer quelque chose, aussi petit soit-il. Si vous êtes un programmeur expérimenté et que vous ne livrez rien après deux semaines, comment un responsable peut-il savoir si vous travaillez vraiment ou si vous lisez les nouvelles sportives ?

Donc, pour faciliter la vie de tout le monde, livrer quelque chose. N'allez pas croire que vous devez comprendre l'ensemble de l'application pour fournir quelque chose de valable. C'est complètement faux. L'ajout d'une petite validation Javascript localisée peut être très utile à l'entreprise et, lorsque vous la livrez, le responsable se sent soulagé d'en avoir eu pour son argent. De plus, cela vous donne le temps de lire les nouvelles sportives.

Au fil du temps et après avoir livré 5 petits correctifs, vous commencerez à comprendre lentement l'architecture. Ne sous-estimez pas le temps nécessaire pour comprendre chaque aspect de l'application. Donnez 3-4 jours pour comprendre l'authentification. Peut-être 2-3 jours pour comprendre la gestion des transactions. Cela dépend vraiment de l'application et de votre expérience antérieure sur des applications similaires, mais je ne donne que des estimations approximatives. Volez le temps entre la correction des défauts. Ne demandez pas ce temps.

Lorsque vous comprenez quelque chose, prenez des notes ou dessinez le diagramme de classe/séquence/modèle de données.

Diagrammes

Haaa...il m'a fallu si longtemps pour mentionner les diagrammes :). J'ai commencé par révéler que je suis l'auteur de MaintainJ, l'outil qui génère des diagrammes de séquence en temps réel. Laissez-moi vous dire comment il peut vous aider.

Une grande partie de la maintenance consiste à localiser la source d'un problème ou à comprendre le fonctionnement d'une fonctionnalité.

Les diagrammes de séquence générés par MaintainJ montrent le flux d'appels et le flux de données pour un seul cas d'utilisation. Ainsi, dans un diagramme de séquence simple, vous pouvez voir quelles méthodes sont appelées pour un cas d'utilisation. Donc, si vous corrigez un bogue, le bogue se trouve très probablement dans l'une de ces méthodes. Il suffit de le corriger, de s'assurer qu'il ne casse rien d'autre et de sortir.

Si vous devez améliorer une fonctionnalité, comprenez le flux d'appels de cette fonctionnalité à l'aide du diagramme de séquence, puis améliorez-la. L'amélioration peut consister à ajouter un champ supplémentaire ou à ajouter une nouvelle validation, etc. En général, l'ajout de nouveau code est moins risqué.

Si vous devez ajouter une nouvelle fonctionnalité, trouvez une autre fonctionnalité similaire à celle que vous devez développer, comprenez le flux d'appels de cette fonctionnalité à l'aide de MaintainJ, puis imitez-la.

Cela semble simple ? En fait, c'est simple, mais il y aura des cas où vous devrez apporter des améliorations plus importantes, comme la création d'une toute nouvelle fonctionnalité ou quelque chose qui affecte la conception fondamentale de l'application. Au moment où vous vous lancez dans une telle entreprise, vous devez être familiarisé avec l'application et en comprendre raisonnablement bien l'architecture.

Deux réserves à mon argument ci-dessus

  1. J'ai mentionné que l'ajout de code est moins risqué que la modification du code existant. Comme vous voulez éviter de changer, vous pouvez être tenté de copier simplement une méthode existante et d'y ajouter du code plutôt que de modifier le code existant. Résistez à cette tentation. Toutes les applications ont une certaine structure ou "uniformité". Ne la gâchez pas par de mauvaises pratiques comme la duplication de code. Vous devez savoir quand vous vous écartez de cette "uniformité". Demandez à un développeur senior du projet de revoir les changements. Si vous devez faire quelque chose qui ne suit pas les conventions, assurez-vous au moins que c'est local à une petite classe (une méthode privée dans une classe de 200 lignes ne ruinerait pas l'esthétique de l'application).

  2. Si vous suivez l'approche décrite ci-dessus, vous pouvez certes survivre pendant des années dans le secteur, mais vous courez le risque de ne pas comprendre les architectures d'application, ce qui n'est pas bon à long terme. Ce risque peut être évité en travaillant sur des changements plus importants ou en consacrant moins de temps à Facebook. Passez du temps à comprendre l'architecture lorsque vous êtes un peu libre et documentez-la pour les autres développeurs.

Conclusion

Concentrez-vous sur la valeur immédiate et utilisez les outils qui y contribuent, mais ne soyez pas paresseux. Les outils et les diagrammes sont utiles, mais vous pouvez aussi vous en passer. Vous pouvez suivre mon conseil en prenant simplement le temps d'un développeur senior sur le projet.

10voto

nanda Points 12764

Quelques plugins que je connais pour Eclipse :

Architexa

http://www.architexa.com/

nWire

http://www.nwiresoftware.com/

Si vous voulez faire de la rétro-ingénierie du code, vous devriez essayer Architecte d'entreprise

9voto

Jan Schierkolk Points 31

Avez-vous essayé Google CodePro Analytix ?

Il peut par exemple afficher les dépendances et est gratuit (capture d'écran de cod.google.com) :

Screenshot from Google

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X