Se connecter

Informatique

Programmation

Sujet : faire du code solid(e)
1
Sukiyakidepoche
Niveau 40
03 février 2023 à 21:20:35

je fais un projet de cours en cpp en ce moment
j'ai un fichier main.cpp
et j'ai deux classes, disons :
classA et classB

classA utilise classB et classB utilise classA

on est d'accord que ça va pas du tout ?

Grand__Smurf
Niveau 45
03 février 2023 à 22:28:18

Ça dépend, parfois c'est nécessaire. Ça s'appelle une dépendance circulaire et ça va probablement te poser des soucis mais en C++ c'est gérable.

Sukiyakidepoche
Niveau 40
03 février 2023 à 22:38:19

Le 03 février 2023 à 22:28:18 :
Ça dépend, parfois c'est nécessaire. Ça s'appelle une dépendance circulaire et ça va probablement te poser des soucis mais en C++ c'est gérable.

d'accord merci pour ta réponse, je pensais que c'était un pattern à éviter absolument

Grand__Smurf
Niveau 45
04 février 2023 à 00:51:46

Oui c'est à éviter, ça peut être le signe que t'as mal designé ton truc mais y a des cas où y a pas le choix.

Tetris-te
Niveau 9
04 février 2023 à 18:24:42

Tu peux faire une classe C qui fait intérargir ensemble ta classe A et B. Sinon tu peux regarder du côté des designs pattern.

ParniakLeCougar
Niveau 18
04 février 2023 à 22:55:39

Explique nous déja pourquoi tu fais un import circulaire, avec une explication un peu plus concrete on pourra mieux t'aider

Oberginee
Niveau 7
05 février 2023 à 23:06:06

En Java ça va parce que le GC gère tout.

En C++ faut avoir une tête très claire parce que tu dois voir comment tu lâcheras les ressources une fois t'as plus besoin de ces classes là.

Très souvent t'as une manière de mieux gérer tes codes pour éviter ce genre de truc.

Impaloupa
Niveau 8
09 février 2023 à 13:35:48

Tout dépend du contexte. Si t'es dans le cadre d'une modélisation de ton data layer, ce n'est pas considéré comme une mauvaise pratique. Ca s'appelle simplement une relation bilatérale. Par exemple, j'ai mes classes "Livre" et "Auteur". Quand j'accède à une instance de ma classe Livre, j'aimerais pouvoir obtenir l'auteur. Quand j'accède à une instance de ma classe Auteur, j'aimerais pouvoir retrouver les livres qu'il a rédigés. C'est tout à fait raisonnable de vouloir définir ce genre de relations et ce n'est pas une mauvaise pratique.

Pour reprendre les grands principes "SOLID", ils sont plus cohérents lorsqu'on parle de composants/modules de ton application. Ce sont des briques fonctionnelles composant ton soft qui sont responsables d'une ou plusieurs opérations assumées par ton programme. Le but fondamental de "SOLID", c'est de bien séparer les différentes briques de ton application pour qu'elles fassent seulement ce pourquoi elles ont été réalisées et qu'elles ne s'encombrent pas de détails liés au contexte d'exécution ou au contexte d'autres briques de ton application.

En respectant ces principes, si un jour tu te retrouves à devoir remplacer l'une de ces briques (maintenance évolutive, changement de technologie / framework, changement d'interfaces externes, etc.), ton travail s'avèrera beaucoup plus simple que si tu n'avais pas respecté ces principes.

-ChadGPT-
Niveau 2
09 février 2023 à 23:09:38

Le 03 février 2023 à 21:20:35 sukiyakidepoche a écrit :
je fais un projet de cours en cpp en ce moment
j'ai un fichier main.cpp
et j'ai deux classes, disons :
classA et classB

classA utilise classB et classB utilise classA

on est d'accord que ça va pas du tout ?

Tout à fait, mon pote. C'est la définition même de la dépendance circulaire et ça va causer des problèmes de compilation et d'exécution. Si deux classes dépendent l'une de l'autre, il n'y a aucun moyen pour le compilateur de déterminer quelle classe doit être compilée en premier, ce qui entraîne une erreur de compilation. La meilleure façon de résoudre ce problème est de séparer les deux classes en différents fichiers et de les inclure l'un dans l'autre de manière appropriée. Il est également possible de créer une troisième classe qui gère les dépendances entre les deux classes et qui les utilise. De cette façon, tu évites la dépendance circulaire et les erreurs de compilation https://image.noelshack.com/fichiers/2019/25/2/1560867829-glados.png

lokilok
Niveau 10
10 février 2023 à 00:20:27

Si deux classes dépendent l'une de l'autre, il n'y a aucun moyen pour le compilateur de déterminer quelle classe doit être compilée en premier, ce qui entraîne une erreur de compilation.

Ça veut rien dire. C'est pas le compilateur qui choisit l'ordre de compilation, il compile dans l'ordre d'apparition des classes dans le fichier.

La meilleure façon de résoudre ce problème est de séparer les deux classes en différents fichiers et de les inclure l'un dans l'autre de manière appropriée.

De un "les inclure l'un dans l'autre de manière appropriée" ça veut rien dire. De deux c'est totalement faux. Ce qu'il faut c'est pré-declarer les classes, la séparation en plusieurs fichiers ça n'a rien à voir dans la résolution du problème.

Puis en plus de ça la question du topic n'a jamais été "comment faire", mais "est-ce une bonne chose à faire".

Je déteste vraiment les réponses ChatGPT dans les forums, c'est vraiment n'importe quoi la plupart du temps.

Impaloupa
Niveau 8
10 février 2023 à 07:08:04

Le 09 février 2023 à 23:09:38 :

Le 03 février 2023 à 21:20:35 sukiyakidepoche a écrit :
je fais un projet de cours en cpp en ce moment
j'ai un fichier main.cpp
et j'ai deux classes, disons :
classA et classB

classA utilise classB et classB utilise classA

on est d'accord que ça va pas du tout ?

Tout à fait, mon pote. C'est la définition même de la dépendance circulaire et ça va causer des problèmes de compilation et d'exécution. Si deux classes dépendent l'une de l'autre, il n'y a aucun moyen pour le compilateur de déterminer quelle classe doit être compilée en premier, ce qui entraîne une erreur de compilation. La meilleure façon de résoudre ce problème est de séparer les deux classes en différents fichiers et de les inclure l'un dans l'autre de manière appropriée. Il est également possible de créer une troisième classe qui gère les dépendances entre les deux classes et qui les utilise. De cette façon, tu évites la dépendance circulaire et les erreurs de compilation https://image.noelshack.com/fichiers/2019/25/2/1560867829-glados.png

Comme l'a dit lokilok, ta réponse n'a pas de sens car elle mélange beaucoup de concepts.

Les dépendances circulaires ne sont pas un problème pour un compilateur mais plutôt pour un moteur d'injection. Le compilateur s'en fout des dépendances circulaires vu que ce n'est pas à lui de fournir les potentielles instances de classA et classB. Dans le cadre d'un moteur d'injection où tu aurais défini que pour construire A, tu as besoin de B et que pour construire B, tu as besoin de A, là t'auras un problème. Mais c'est au runtime ça, pas à la compil et ça ne concerne que ce genre de contextes (p.ex. DI).

La suite de ta réponse ne fait aucun sens. Si c'est du ChatGPT, je vois maintenant ce que ça peut donner quand quelqu'un ne connaissant pas le sujet s'aventure à essayer d'obtenir des réponses sur des topics aussi spécifiques. Moi j'obtiens généralement de meilleurs résultats mais c'est sûrement lié à la manière de poser les questions en utilisant les bons termes et en apportant les précisions nécessaires. Et oui, parfois il dit quand même de la grosse daube bien formulée :rire:

1
Sujet : faire du code solid(e)
   Retour haut de page
Consulter la version web de cette page