o mettre toute ces autres classes en friend de la classe Facade; ca
fait beaucoup d'amis, ca force certaines operations qui peuvent etre
implementee dans des namespaces prives a etre membre de ces classes
ou des fonctions publiques pour que ces fonctions soient friend, ca
empeche d'avoir des vraies fonctions privees a la Facade.
Il manque en C++ la possibilité de réduire la portée du 'friend' à
o faire une classe (friend de Facade, donc ce ne peut pas etre un
namespace) qui n'a que des membres statiques fournissant l'interface
supplementaires accessibles aux composants du sous-systeme.
L'indirection me gene.
Pourquoi des membres statiques? Votre classe friend ne pourrait-elle
o rendre protected l'interface "privee", faire une classe descendant
de Facade qui a des membres publics qui renvoient a cette interface
privee. A nouveau l'indirection me gene et la maniere d'avoir acces
a la classe fournissant l'interface privee n'est pas claire (ok, un
cast du pointeur fonctionne si on s'arrange pour ne construire que
des objects de cette classe, mais bon).
Il faut instancer la sous-classe de la façade. L'existence de cette
o mettre toute ces autres classes en friend de la classe Facade; ca
fait beaucoup d'amis, ca force certaines operations qui peuvent etre
implementee dans des namespaces prives a etre membre de ces classes
ou des fonctions publiques pour que ces fonctions soient friend, ca
empeche d'avoir des vraies fonctions privees a la Facade.
Il manque en C++ la possibilité de réduire la portée du 'friend' à
o faire une classe (friend de Facade, donc ce ne peut pas etre un
namespace) qui n'a que des membres statiques fournissant l'interface
supplementaires accessibles aux composants du sous-systeme.
L'indirection me gene.
Pourquoi des membres statiques? Votre classe friend ne pourrait-elle
o rendre protected l'interface "privee", faire une classe descendant
de Facade qui a des membres publics qui renvoient a cette interface
privee. A nouveau l'indirection me gene et la maniere d'avoir acces
a la classe fournissant l'interface privee n'est pas claire (ok, un
cast du pointeur fonctionne si on s'arrange pour ne construire que
des objects de cette classe, mais bon).
Il faut instancer la sous-classe de la façade. L'existence de cette
o mettre toute ces autres classes en friend de la classe Facade; ca
fait beaucoup d'amis, ca force certaines operations qui peuvent etre
implementee dans des namespaces prives a etre membre de ces classes
ou des fonctions publiques pour que ces fonctions soient friend, ca
empeche d'avoir des vraies fonctions privees a la Facade.
Il manque en C++ la possibilité de réduire la portée du 'friend' à
o faire une classe (friend de Facade, donc ce ne peut pas etre un
namespace) qui n'a que des membres statiques fournissant l'interface
supplementaires accessibles aux composants du sous-systeme.
L'indirection me gene.
Pourquoi des membres statiques? Votre classe friend ne pourrait-elle
o rendre protected l'interface "privee", faire une classe descendant
de Facade qui a des membres publics qui renvoient a cette interface
privee. A nouveau l'indirection me gene et la maniere d'avoir acces
a la classe fournissant l'interface privee n'est pas claire (ok, un
cast du pointeur fonctionne si on s'arrange pour ne construire que
des objects de cette classe, mais bon).
Il faut instancer la sous-classe de la façade. L'existence de cette
J'ai une classe qui est une Facade vers un sous systeme. Elle a donc
en membres publics les fonctions d'interfacage prevue pour etre
utilisee a l'exterieur du sous-systeme.
Le probleme est que les autres classes du sous-systeme ont besoin
d'acceder a des fonctions qui ne doivent etre utilisee que par le
sous-systeme.
Solutions possibles:
o mettre toute ces autres classes en friend de la classe Facade; ca
fait beaucoup d'amis, ca force certaines operations qui peuvent etre
implementee dans des namespaces prives a etre membre de ces classes
ou des fonctions publiques pour que ces fonctions soient friend, ca
empeche d'avoir des vraies fonctions privees a la Facade.
o faire une classe (friend de Facade, donc ce ne peut pas etre un
namespace) qui n'a que des membres statiques fournissant l'interface
supplementaires accessibles aux composants du sous-systeme.
L'indirection me gene.
o rendre protected l'interface "privee", faire une classe descendant
de Facade qui a des membres publics qui renvoient a cette interface
privee. A nouveau l'indirection me gene et la maniere d'avoir acces
a la classe fournissant l'interface privee n'est pas claire (ok, un
cast du pointeur fonctionne si on s'arrange pour ne construire que
des objects de cette classe, mais bon).
Quelqu'un a-t'il d'autres alternatives?
J'ai une classe qui est une Facade vers un sous systeme. Elle a donc
en membres publics les fonctions d'interfacage prevue pour etre
utilisee a l'exterieur du sous-systeme.
Le probleme est que les autres classes du sous-systeme ont besoin
d'acceder a des fonctions qui ne doivent etre utilisee que par le
sous-systeme.
Solutions possibles:
o mettre toute ces autres classes en friend de la classe Facade; ca
fait beaucoup d'amis, ca force certaines operations qui peuvent etre
implementee dans des namespaces prives a etre membre de ces classes
ou des fonctions publiques pour que ces fonctions soient friend, ca
empeche d'avoir des vraies fonctions privees a la Facade.
o faire une classe (friend de Facade, donc ce ne peut pas etre un
namespace) qui n'a que des membres statiques fournissant l'interface
supplementaires accessibles aux composants du sous-systeme.
L'indirection me gene.
o rendre protected l'interface "privee", faire une classe descendant
de Facade qui a des membres publics qui renvoient a cette interface
privee. A nouveau l'indirection me gene et la maniere d'avoir acces
a la classe fournissant l'interface privee n'est pas claire (ok, un
cast du pointeur fonctionne si on s'arrange pour ne construire que
des objects de cette classe, mais bon).
Quelqu'un a-t'il d'autres alternatives?
J'ai une classe qui est une Facade vers un sous systeme. Elle a donc
en membres publics les fonctions d'interfacage prevue pour etre
utilisee a l'exterieur du sous-systeme.
Le probleme est que les autres classes du sous-systeme ont besoin
d'acceder a des fonctions qui ne doivent etre utilisee que par le
sous-systeme.
Solutions possibles:
o mettre toute ces autres classes en friend de la classe Facade; ca
fait beaucoup d'amis, ca force certaines operations qui peuvent etre
implementee dans des namespaces prives a etre membre de ces classes
ou des fonctions publiques pour que ces fonctions soient friend, ca
empeche d'avoir des vraies fonctions privees a la Facade.
o faire une classe (friend de Facade, donc ce ne peut pas etre un
namespace) qui n'a que des membres statiques fournissant l'interface
supplementaires accessibles aux composants du sous-systeme.
L'indirection me gene.
o rendre protected l'interface "privee", faire une classe descendant
de Facade qui a des membres publics qui renvoient a cette interface
privee. A nouveau l'indirection me gene et la maniere d'avoir acces
a la classe fournissant l'interface privee n'est pas claire (ok, un
cast du pointeur fonctionne si on s'arrange pour ne construire que
des objects de cette classe, mais bon).
Quelqu'un a-t'il d'autres alternatives?
Mais je n'ai peut-être pas bien compris le problème...
Mais je n'ai peut-être pas bien compris le problème...
Mais je n'ai peut-être pas bien compris le problème...
Si j'ai bien compris le problème, j'aurais bien vu quelque chose du gen re :
- une classe façade contenant toutes les fonctions nécessaires à tout
le monde (externe et interne) ;
- une classe façade cliente de la première qui réduit l'interface pour
l'extérieur
En gros, c'est le contraire de ta deuxième solution, mais sans avoir
besoin de friend.
Mais je n'ai peut-être pas bien compris le problème...
La troisième solution proposée ne requiérait pas non plus de
Si j'ai bien compris le problème, j'aurais bien vu quelque chose du gen re :
- une classe façade contenant toutes les fonctions nécessaires à tout
le monde (externe et interne) ;
- une classe façade cliente de la première qui réduit l'interface pour
l'extérieur
En gros, c'est le contraire de ta deuxième solution, mais sans avoir
besoin de friend.
Mais je n'ai peut-être pas bien compris le problème...
La troisième solution proposée ne requiérait pas non plus de
Si j'ai bien compris le problème, j'aurais bien vu quelque chose du gen re :
- une classe façade contenant toutes les fonctions nécessaires à tout
le monde (externe et interne) ;
- une classe façade cliente de la première qui réduit l'interface pour
l'extérieur
En gros, c'est le contraire de ta deuxième solution, mais sans avoir
besoin de friend.
Mais je n'ai peut-être pas bien compris le problème...
La troisième solution proposée ne requiérait pas non plus de
Si j'ai bien compris le problème, j'aurais bien vu quelque chose du genre :
- une classe façade contenant toutes les fonctions nécessaires à tout
le monde (externe et interne) ;
- une classe façade cliente de la première qui réduit l'interface pour
l'extérieur
En gros, c'est le contraire de ta deuxième solution, mais sans avoir
besoin de friend.
Mais je n'ai peut-être pas bien compris le problème...
La troisième solution proposée ne requiérait pas non plus de
'friend'.
Finalement, j'ai une préférence pour une cinquième solution : classe
interface de la façade avec uniquement les membres publiques; classe
d'implémentation héritant de la façade, et implémentant les membres
publics + privés (ces derniers ne sont visibles qu'à ce niveau). Les
sous-composants doivent dynamic-caster dans la classe
d'implémentation, pour bénéficier de l'interface "privée" (non
exposée aux utilisateurs de la façade).
Pas de redirection. Pas de 'friend' non plus.
Si j'ai bien compris le problème, j'aurais bien vu quelque chose du genre :
- une classe façade contenant toutes les fonctions nécessaires à tout
le monde (externe et interne) ;
- une classe façade cliente de la première qui réduit l'interface pour
l'extérieur
En gros, c'est le contraire de ta deuxième solution, mais sans avoir
besoin de friend.
Mais je n'ai peut-être pas bien compris le problème...
La troisième solution proposée ne requiérait pas non plus de
'friend'.
Finalement, j'ai une préférence pour une cinquième solution : classe
interface de la façade avec uniquement les membres publiques; classe
d'implémentation héritant de la façade, et implémentant les membres
publics + privés (ces derniers ne sont visibles qu'à ce niveau). Les
sous-composants doivent dynamic-caster dans la classe
d'implémentation, pour bénéficier de l'interface "privée" (non
exposée aux utilisateurs de la façade).
Pas de redirection. Pas de 'friend' non plus.
Si j'ai bien compris le problème, j'aurais bien vu quelque chose du genre :
- une classe façade contenant toutes les fonctions nécessaires à tout
le monde (externe et interne) ;
- une classe façade cliente de la première qui réduit l'interface pour
l'extérieur
En gros, c'est le contraire de ta deuxième solution, mais sans avoir
besoin de friend.
Mais je n'ai peut-être pas bien compris le problème...
La troisième solution proposée ne requiérait pas non plus de
'friend'.
Finalement, j'ai une préférence pour une cinquième solution : classe
interface de la façade avec uniquement les membres publiques; classe
d'implémentation héritant de la façade, et implémentant les membres
publics + privés (ces derniers ne sont visibles qu'à ce niveau). Les
sous-composants doivent dynamic-caster dans la classe
d'implémentation, pour bénéficier de l'interface "privée" (non
exposée aux utilisateurs de la façade).
Pas de redirection. Pas de 'friend' non plus.
Finalement, j'ai une préférence pour une cinquième solution : cla sse
interface de la façade avec uniquement les membres publiques; classe
d'implémentation héritant de la façade, et implémentant les mem bres
publics + privés (ces derniers ne sont visibles qu'à ce niveau). Les
sous-composants doivent dynamic-caster dans la classe
d'implémentation, pour bénéficier de l'interface "privée" (non
exposée aux utilisateurs de la façade).
Pas de redirection. Pas de 'friend' non plus.
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
Finalement, j'ai une préférence pour une cinquième solution : cla sse
interface de la façade avec uniquement les membres publiques; classe
d'implémentation héritant de la façade, et implémentant les mem bres
publics + privés (ces derniers ne sont visibles qu'à ce niveau). Les
sous-composants doivent dynamic-caster dans la classe
d'implémentation, pour bénéficier de l'interface "privée" (non
exposée aux utilisateurs de la façade).
Pas de redirection. Pas de 'friend' non plus.
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
Finalement, j'ai une préférence pour une cinquième solution : cla sse
interface de la façade avec uniquement les membres publiques; classe
d'implémentation héritant de la façade, et implémentant les mem bres
publics + privés (ces derniers ne sont visibles qu'à ce niveau). Les
sous-composants doivent dynamic-caster dans la classe
d'implémentation, pour bénéficier de l'interface "privée" (non
exposée aux utilisateurs de la façade).
Pas de redirection. Pas de 'friend' non plus.
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
Finalement, j'ai une préférence pour une cinquième solution : classe
interface de la façade avec uniquement les membres publiques; classe
d'implémentation héritant de la façade, et implémentant les membres
publics + privés (ces derniers ne sont visibles qu'à ce niveau). Les
sous-composants doivent dynamic-caster dans la classe
d'implémentation, pour bénéficier de l'interface "privée" (non
exposée aux utilisateurs de la façade).
Pas de redirection. Pas de 'friend' non plus.
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
Finalement, j'ai une préférence pour une cinquième solution : classe
interface de la façade avec uniquement les membres publiques; classe
d'implémentation héritant de la façade, et implémentant les membres
publics + privés (ces derniers ne sont visibles qu'à ce niveau). Les
sous-composants doivent dynamic-caster dans la classe
d'implémentation, pour bénéficier de l'interface "privée" (non
exposée aux utilisateurs de la façade).
Pas de redirection. Pas de 'friend' non plus.
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
Finalement, j'ai une préférence pour une cinquième solution : classe
interface de la façade avec uniquement les membres publiques; classe
d'implémentation héritant de la façade, et implémentant les membres
publics + privés (ces derniers ne sont visibles qu'à ce niveau). Les
sous-composants doivent dynamic-caster dans la classe
d'implémentation, pour bénéficier de l'interface "privée" (non
exposée aux utilisateurs de la façade).
Pas de redirection. Pas de 'friend' non plus.
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
C'est un point a evaluer et a prendre en compte. Pas sur que ce le
soit.
Si cela vient du fait de devoir maintenir l'écriture d'un membre
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
C'est un point a evaluer et a prendre en compte. Pas sur que ce le
soit.
Si cela vient du fait de devoir maintenir l'écriture d'un membre
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
C'est un point a evaluer et a prendre en compte. Pas sur que ce le
soit.
Si cela vient du fait de devoir maintenir l'écriture d'un membre
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
C'est un point a evaluer et a prendre en compte. Pas sur que ce le
soit.
Si cela vient du fait de devoir maintenir l'écriture d'un membre
virtuelle pure pour chaque membre public de la façade,
j'insiste à nouveau : c'est 15 lignes de script CodeWorker de
générer les fonctions virtuelles pures à partir du header C++ de
l'implémentation... qui pourra donc changer comme bon lui semble,
puisqu'il n'y aura aucun impact développeur pour maintenir
l'interface.
Si la solution vous intéresse, je publie le script ici même.
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
C'est un point a evaluer et a prendre en compte. Pas sur que ce le
soit.
Si cela vient du fait de devoir maintenir l'écriture d'un membre
virtuelle pure pour chaque membre public de la façade,
j'insiste à nouveau : c'est 15 lignes de script CodeWorker de
générer les fonctions virtuelles pures à partir du header C++ de
l'implémentation... qui pourra donc changer comme bon lui semble,
puisqu'il n'y aura aucun impact développeur pour maintenir
l'interface.
Si la solution vous intéresse, je publie le script ici même.
Mais la facade se met a comporter une tonne de membres virtuels (alors
qu'elle n'en a aucun pour le moment).
Effectivement. Des membres virtuels purs. C'est gênant?
C'est un point a evaluer et a prendre en compte. Pas sur que ce le
soit.
Si cela vient du fait de devoir maintenir l'écriture d'un membre
virtuelle pure pour chaque membre public de la façade,
j'insiste à nouveau : c'est 15 lignes de script CodeWorker de
générer les fonctions virtuelles pures à partir du header C++ de
l'implémentation... qui pourra donc changer comme bon lui semble,
puisqu'il n'y aura aucun impact développeur pour maintenir
l'interface.
Si la solution vous intéresse, je publie le script ici même.
Si cela vient du fait de devoir maintenir l'écriture d'un membre
virtuelle pure pour chaque membre public de la façade,
C'est pas ca (c'est pas plus complique que d'ecrire des wrappers dans
l'autre sens).
Il ne s'agit pas de considérer le degré de complexité, mais plus la
c'est 15 lignes de script CodeWorker de
générer les fonctions virtuelles pures à partir du header C++ de
l'implémentation...
Non. Il faudrait:
- evaluer CodeWorker pour se convaincre que c'est la bonne solution
Si c'est pour une utilisation one-shot (traiter la tonne de fonctions
- convaincre tout le monde que c'est la bonne solution (y compris
le departement legal)
Si c'est pour une utilisation one-shot, CodeWorker tire sa révérence
- mettre CW dans le systeme de build et le faire fonctionner
pour l'ensemble des platerformes cibles.
Si c'est pour une utilisation one-shot, inutile si "IFacade.h" se
- reussir a faire ca dans les temps pour la prochaine release
Etapes :
Cout/benefice trop petit, meme pas envisage.
Même au regard de ces dernières précisions?
Si cela vient du fait de devoir maintenir l'écriture d'un membre
virtuelle pure pour chaque membre public de la façade,
C'est pas ca (c'est pas plus complique que d'ecrire des wrappers dans
l'autre sens).
Il ne s'agit pas de considérer le degré de complexité, mais plus la
c'est 15 lignes de script CodeWorker de
générer les fonctions virtuelles pures à partir du header C++ de
l'implémentation...
Non. Il faudrait:
- evaluer CodeWorker pour se convaincre que c'est la bonne solution
Si c'est pour une utilisation one-shot (traiter la tonne de fonctions
- convaincre tout le monde que c'est la bonne solution (y compris
le departement legal)
Si c'est pour une utilisation one-shot, CodeWorker tire sa révérence
- mettre CW dans le systeme de build et le faire fonctionner
pour l'ensemble des platerformes cibles.
Si c'est pour une utilisation one-shot, inutile si "IFacade.h" se
- reussir a faire ca dans les temps pour la prochaine release
Etapes :
Cout/benefice trop petit, meme pas envisage.
Même au regard de ces dernières précisions?
Si cela vient du fait de devoir maintenir l'écriture d'un membre
virtuelle pure pour chaque membre public de la façade,
C'est pas ca (c'est pas plus complique que d'ecrire des wrappers dans
l'autre sens).
Il ne s'agit pas de considérer le degré de complexité, mais plus la
c'est 15 lignes de script CodeWorker de
générer les fonctions virtuelles pures à partir du header C++ de
l'implémentation...
Non. Il faudrait:
- evaluer CodeWorker pour se convaincre que c'est la bonne solution
Si c'est pour une utilisation one-shot (traiter la tonne de fonctions
- convaincre tout le monde que c'est la bonne solution (y compris
le departement legal)
Si c'est pour une utilisation one-shot, CodeWorker tire sa révérence
- mettre CW dans le systeme de build et le faire fonctionner
pour l'ensemble des platerformes cibles.
Si c'est pour une utilisation one-shot, inutile si "IFacade.h" se
- reussir a faire ca dans les temps pour la prochaine release
Etapes :
Cout/benefice trop petit, meme pas envisage.
Même au regard de ces dernières précisions?