Citation:
Envoyé par
Lavock
Oui si on renvoie une lvalue (lref ou pointeur); non si on renvoie une rvalue (rref ou valeur). Evidemment, la rref révèle un peu la classe; mais tout mis à jour ou on passerai dès lors une valeur se ferais de manière totalement transparente. Après, ce pose de pourquoi la POO -> paranoïa protectionniste ou clémence envers le mec qui passe derrière toi\ utilise ton code.
J'aurais tendance à estimer que, si tu renvoies une valeur ou une rvalue reference, tu ne renverra pas un membre de la classe mais un objet créé sur base des membres de ta classe... (ce qui peut parfaitement se justifier ;))
Il n'est pas exclu (quoi que discutable) que l'objet renvoyé soit en fait la "copie conforme" d'un membre unique de la classe, mais, dans l'absolu, si tu renvoies une valeur, c'est parce que tu veux renvoyer un objet temporaire créé pour l'occasion au sein de la fonction ;)
Question :
Citation:
Imaginons deux classes complexes.
La première, A, n'as, de son point de vue, aucun rapport avec la seconde.
Quant à la seconde, B, bien qu'elle n'ai pas besoin de A pour fonctionner, elle sait que d'un point de vu externe elle associé à un B (agrégation).
D'un point de vue externe, on possède des A, des B, et tout fonction de B->A est une surjection.
(1) Puis-je considérer, selon Demeter, que B agis comme une collection (rajout d'une petite interface supplémentaire peu coûteuse en prévision du respect du SRP); (2)ou suis-je obligé de créer une nouvelle classe multimap (bien plus lourd quand même) ?
Si deux, êtes vous d'accord pour dire que je n'y gagne n'y en clarté, ni en performance ?
En vertu du principe de la responsabilité unique, je partirais plutôt sur la deuxième solution.
Et je ne suis pas d'accord pour dire que tu ne gagne ni en clarté ni en performances:
Tu perdra peut etre un peu en perf du fait de l'indirection supplémentaire, mais, trois classes ayant chacune une interface "aussi restreinte que possible" et leur responsabilité propre seront bien plus claires et faciles à maintenir qu'une classe regroupant l'ensemble des interfaces des trois classes et ayant les trois responsabilités ;)
Enfin, sous réserve de ne pas modifier (en terme d'argument à passer ou de l'ordre dans lequel le faire) ni supprimer des fonctions de l'interface de A et de B qui sont utilisée par la troisième classe, tu sera en mesure de faire évoluer l'interface des trois classes de manière strictement indépendante et sans devoir t'inquiéter d'aller modifier une fonction particulière de l'une d'elle suite aux changements appliqués dans l'autre ;)
Citation:
Donc en gros, bien que Demeter se dise loi de style, elle devrait se dire corolaire de loi d'architecture ?
Sauf erreur, la loi demeter a, à l'origine, été énoncée pour tout autre chose que l'informatique, mais fortement lié à une méthode de conception cependant...
Et comme une bonne programmation devrait avant tout s'appuyer sur une bonne conception, il devient difficile de déterminer son domaine réel d'application...
Ceci dit, elle devrait être prise en compte dés le moment de la conception ;)
Citation:
Quelle est le problème, au juste, d'une interface particulière, n'ayant aucune méthode publique / protéger (a part le destructeur en public et constructeur en protégé), aucune donnée publique, mais qui possède un lot de donnée protéger. Sont but alors étant un constructeur complexe -> tu me donne des infos en entrées, je te ressort plein de données en sortie.
Le raisonnement peut paraitre un peu tordu, mais, le but d'un membre protégé revient à dire
Citation:
Je laisse mes descendants s'occuper de cela
Or, si, l'héritage public aidant, une classe enfant peut "se faire passer pour" sa classe parente, il n'en reste pas moins que la classe enfant subit des restrictions par rapport à sa classe parente, et donc que, bien que l'on parle volontiers de relation "est un" pour l'héritage, que la classe enfant n'est pas "tout à fait" la classe parent :aie:
Par conséquent, il semblerait logique, en vertu de demeter, que même une classe enfant ne puisse accéder aux membres de sa classe parent qu'au travers... des comportements publics et protégés de la classe parent ;)
Il faut cependant attirer ton attention sur le fait qu'Emmanuel parlait des données membres, et non des fonctions membres (comportements ) ;)
Citation:
J'ai pas bien compris tout ça, notamment sur ce qu'en pratique une référence circulaire. Un truc comme :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
class A;
class B {
A plop();
}
class A{
B b;
.....
}
A B::plop() {...} |
?
Ca, ou pire:
Code:
1 2 3 4 5 6 7 8 9
| class A;
class B
{
A* ptrA;
};
class A
{
B value;
}; |
Citation:
Existe-t-il des normes de nommage ?
Si non,
C'est ton jugement personnel, ta convention de nommage, etc... Enfin bref, c'est un point de vue, compréhensible et partagé (avec moi aussi d'ailleurs). Mais ça reste qu'un point de vue...
Si oui,
Quelles sont les textes exactes et ou puis-je les trouver ?
A ma connaissance, il n'y a pas de regle de nommage uniformisée (portant le label ISO, ANSI ou tout autre)...
Elles sont généralement relatives à un projet, une équipe ou une entreprise.
Mais, si j'ai bien compris le raisonnement d'Emmanuel (sans doute parce que j'y adhère), et sans vouloir parler pour lui, lorsque tu utilise le terme "set", cela revient à dire "définis (quelque chose)", alors que, dans l'exemple cité, moveTo induit la notion de mouvement, et introduit donc la notion que j'ai essayé de faire passer plus haut selon laquelle il est possible que cela ne soit pas strictement instantané ;)
Citation:
Et surtout, principale abus, le but de Demeter c'est de maintenir une clarté (utilisation et maintenance). Donc en gros, on jette du flou pour que la clarté soit plus facilement maintenable... C'est un peu comme ne pas se doucher pour pas qu'on puisse dire qu'on est sale en temps normal. C'est vrai, m'enfin Oo quoi !
N'oublie pas la particularité intrinsèque même de tout programme est d'être écrit une fois, lu souvent.
Or, il n'y a rien à faire: tout comme il devient particulièrement difficile pour tout le monde de retenir quels arguments il faut transmettre et dans quel ordre dés que leur nombre devient plus important que quatre ou cinq (allez, montons même jusqu'à six ou sept, pour les plus doués), il devient rapidement difficile de se rappeler de l'utilisation qui peut être faite d'une classe dés le moment où elle a plus d'une responsabilité ou qu'elle expose plus d'un nombre finalement restreint de fonctions membres...
Tu as donc "naturellement" intérêt à faire un nombre plus important de petites classe qu'une seule et unique classe qui prendrait en charge l'ensemble des responsabilité de toutes ces petites classes.
Demeter en "rajoute une couche" en limitant ce que tu dois savoir "du reste" de ton projet afin d'être en mesure d'utiliser n'importe quelle classe prise au hasard.
Comme souvent en programmation, une chose prise séparément n'a que peu d'impact et d'intérêt, mais trouve tout son intérêt dés qu'elle est mise en relation avec "d'autres choses".
Demeter ne fait pas vraiment exception en ne s'exprimant pleinement qu'une fois qu'elle est mise en relation avec d'autres lois / règles / principes ;)